Spell Burning Hell

Komaqtion

You can change this now in User CP.
Reaction score
469
Tormental Wrath

Tormental Wrath
By Komaqtion

Hi!

Just thought that because i've gotten alot of help here on thehelper on this spell, you could see the final product.


It's my very first spell (Both to be submitted here on the forum, and the first real thing i've made in JASS), so i was hoping you could give me feedback and maybe suggestion on how to "efficienize" is XD

MUI/MPI: MUI
GUI/JASS/vJASS: vJASS

Requires: The spell trigger itself
the XEbasic, XEfx, XEcollider and XEdamage libraries
the BoundSentinel library
JASS Newgen Pack version 5d
And finally, the patch 1.23b, or higher, for Warcraft 3.

Here are some screenshots :D

burninghellscreenie1.jpg


burninghellscreenie2.jpg


burninghellscreenie3.jpg

If the "screenies" does not give you the feeling you want, download the map and test it out for yourself ! ;)

And here's the spells code:

JASS:
scope TormentalWrath initializer Init // requires xedamage, xebasic, xefx, xecollider, BoundSentinel

///////////////////////////////////////////////////////////////////////////////////////////////////////////////
//***********************************************************************************************************//
//@@//////////////////////////////////Tormental Wrath, Made by Komaqtion///////////////////////////////////@@//
//@@                                            Now using XE!                                              @@//
//@@                                                                                                       @@//
//@@                                                                                                       @@//
//@@                                           How to import:                                              @@//
//@@                                                                                                       @@//
//@@        ¤ First copy the ability "Tormental Wrath" and the unit "Dummy" and change the constant        @@//
//@@        "SPELL_ID" to the rawcode of the newly copied spell, then go into the trigger called           @@//
//@@        "xebasic", and change "XE_DUMMY_UNITID" to the Dummy's rawcode !                               @@//
//@@        Then you need to import Vexorian's dummy.mdx file from this map, or another, and change        @@//
//@@        the "Dummy" unit's model to it. Then, of course, you need to import the triggers, which        @@//
//@@        are in the categories "The Spell" and "Required Systems".                                      @@//
//@@        Then you're free to change any of the given global constants to suit your needs.               @@//
//@@                                                                                                       @@//
//@@                                                                                                       @@//
//@@                                           Requirements:                                               @@//
//@@                                                                                                       @@//
//@@        ¤ Patch 1.23b or newer.                                                                        @@//
//@@        ¤ JASS Newgen Pack, version 5d or newer.                                                       @@//
//@@        ¤ This spell, of course !                                                                      @@//
//@@        ¤ The dummy.mdx, BoundSentinel and the XE libraries, all made by Vexorian !                    @@//
//@@        ¤ GroupUtils, made by Rising_Dusk !                                                            @@//
//@@                                                                                                       @@//
//@@                                                                                                       @@//
//@@                                            Credits to:                                                @@//
//@@                                                                                                       @@//
//@@            * Vexorian, for the dummy.mdx file, BoundSentinel and the XE libraries !                   @@//
//@@            * Anitarf and Pyrogasm, for their help on the rewrite of it <img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" class="smilie smilie--sprite smilie--sprite8" alt=":D" title="Big Grin    :D" loading="lazy" data-shortname=":D" />                             @@//
//@@            * Rising_Dusk, for making GroupUtils, and helping me a bit on the forum !                  @@//
//@@                                                                                                       @@//
//@@        And, of course, so many thanks to all of the many helpful people at WC3C.net                   @@//
//@@        who has helped get is spell working!                                                           @@//
//@@                                                                                                       @@//
//@@                                                                                                       @@//
//@@        Note: This is my very first fully working, and quite good, spell made completely in vJASS.     @@//
//@@                                                                                                       @@//
//@@        So much feedback, and suggestions are very much welcome, and maybe some tips to make it        @@//
//@@        even better would be nice <img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" class="smilie smilie--sprite smilie--sprite8" alt=":D" title="Big Grin    :D" loading="lazy" data-shortname=":D" />                                                                   @@//
//@@                                                                                                       @@//
//@@///////////////////////////////////////////////////////////////////////////////////////////////////////@@//
//***********************************************************************************************************//
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
globals

    // Effects! Change as you&#039;d like <img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" class="smilie smilie--sprite smilie--sprite2" alt=";)" title="Wink    ;)" loading="lazy" data-shortname=";)" />\\
    
    private constant string EFFECT_C = &quot;Abilities\\Spells\\Human\\HolyBolt\\HolyBoltSpecialArt.mdl&quot;                // Effect on the caster!
    private constant string EFFECT_1 = &quot;Abilities\\Spells\\Undead\\AnimateDead\\AnimateDeadTarget.mdl&quot;             // Effect 200 range from the caster!
    private constant string EFFECT_2 = &quot;Abilities\\Spells\\Orc\\WarStomp\\WarStompCaster.mdl&quot;                      // Effect at the end!
    private constant string EFFECT_T = &quot;Abilities\\Spells\\Items\\AIfb\\AIfbSpecialArt.mdl&quot;                        // Effect on the damaged units!
    private constant string ATTACH_POINT = &quot;origin&quot;                                                                // The attach point of EFFECT_T!
    private constant string ODD_EFFECT = &quot;Abilities\\Spells\\Demon\\DarkPortal\\DarkPortalTarget.mdl&quot;              // The effect which appears at each ODD_PERIOD!
    private constant string DUMMY_EFFECT = &quot;Abilities\\Weapons\\DemolisherFireMissile\\DemolisherFireMissile.mdl&quot;  // Effect on the moving dummy!
    
    // Rawcodes! Change these rawcodes to the ones on your map <img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" class="smilie smilie--sprite smilie--sprite8" alt=":D" title="Big Grin    :D" loading="lazy" data-shortname=":D" /> (Note: To change the Dummy unit&#039;s ID, you&#039;ll need to go into the trigger called &quot;xebasic&quot;, and change &quot;XE_DUMMY_UNITID&quot; !) \\
    
    private constant integer SPELL_ID = &#039;0000&#039;                              // ID of the spell!
    
    // Other constant integers! Change at will <img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" class="smilie smilie--sprite smilie--sprite7" alt=":p" title="Stick Out Tongue    :p" loading="lazy" data-shortname=":p" />\\
    
    private constant real DAMAGE_FACTOR = 1.                                // Just a simple real to make it easy to change the damage!
    private constant real RANGE_FACTOR = 1.                                 // Just a simple real to make it easy to change the range!
    private constant integer ANGLES = 16                                    // The number of angles the effects will show at! (360/ANGLES)
    private constant attacktype ATTACK_TYPE = ATTACK_TYPE_NORMAL            // Explains itself i think XD
    private constant damagetype DAMAGE_TYPE = DAMAGE_TYPE_UNIVERSAL         // Same here <img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" class="smilie smilie--sprite smilie--sprite7" alt=":p" title="Stick Out Tongue    :p" loading="lazy" data-shortname=":p" />
    private constant weapontype WEAPON_TYPE = WEAPON_TYPE_WHOKNOWS          // And same here <img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" class="smilie smilie--sprite smilie--sprite8" alt=":D" title="Big Grin    :D" loading="lazy" data-shortname=":D" />
    private constant real TIME = 2.5                                        // How long it takes for the spell to complete!
    private constant real SLIDE_SPEED = TIME/XE_ANIMATION_PERIOD * TIME     // How much the dummy effect moves each second! (It&#039;s 200. atm <img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" class="smilie smilie--sprite smilie--sprite8" alt=":D" title="Big Grin    :D" loading="lazy" data-shortname=":D" />)
    private constant real EXPLOSION_OFFSET = 200.                           // How much range the first explosions are offset the casters porition!
    private constant boolean ODD_EFFECTS = true                             // Wether or not the ODD_EFFECT s will appear!
    private constant real ODD_EFFECT_TIMEOUT = .75                          // How frequently the ODD_EFFECT s appear!
    private constant boolean DAMAGE_ALLIES = false                          // Wether the spell should damage allies, or not!
    private constant boolean ATTACK = true                                  // If the spell should count the damage dealt by it as an attack!
    private constant boolean RANGED = true                                  // If the spell should count the damage dealt by it as ranged!
    
    // Here are some UNIT_TYPE&#039;s which you can add that won&#039;t be damages during this spell!\\
    
    private constant unittype STRUCTURE = UNIT_TYPE_STRUCTURE
    private constant unittype MAGIC = UNIT_TYPE_MAGIC_IMMUNE
    
    // To add more &quot;exeptions&quot; to the spell, simply create another on of these constants, and also add another one of &quot; set dmg.factor(input unittype constant here, .0) &quot;
    // to the function &quot;Spell_Actions&quot;... There are other ones of these there, so you should find it <img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" class="smilie smilie--sprite smilie--sprite8" alt=":D" title="Big Grin    :D" loading="lazy" data-shortname=":D" />
    
    
endglobals

    // Damage functions!\\
    
            // V // This one is for the DPS on the projectiles! \\ V \\

private function Damage_Small takes integer lv returns real

    return DAMAGE_FACTOR * lv
    
endfunction

            // V // This one is for the explosions around the caster! \\ V \\

private function Damage_Medium takes integer lv returns real 
  
    return 50 + lv * DAMAGE_FACTOR * 25
    
endfunction

            // V // This one is for the explosions at the very end! \\ V \\

private function Damage_High takes integer lv returns real

    return 50 + lv * DAMAGE_FACTOR * 50
    
endfunction

    // Range functions!\\

            // V // This one is for the DPS on the projectiles! \\ V \\

private function Range_Small takes nothing returns real

    return RANGE_FACTOR * 100
    
endfunction

            // V // This one is for the explosions around the caster! \\ V \\

private function Range_Medium takes nothing returns real

    return RANGE_FACTOR * 10
    
endfunction

            // V // This one is for the explosions at the very end! \\ V \\

private function Range_High takes nothing returns real

    return RANGE_FACTOR * RANGE_FACTOR
    
endfunction

        // V V !!!!! Filters are below these globals and the struct !!!!! V V \\

globals    // Don&#039;t touch these globals ! \\

    private integer tempData
    private xedamage dmg
    
endglobals // Don&#039;t touch these globals ! \\


private struct Data extends xecollider    
    player play
    unit cast
    real cx
    real cy
    integer lvl
    
    private real tick
    
    private method onDestroy takes nothing returns nothing
        call .flash(EFFECT_2)
        call dmg.damageAOE(.cast, .x, .y, Range_High(), Damage_High(.lvl))
    endmethod
    
    private method loopControl takes nothing returns nothing
        set tempData = this
        set .tick = .tick + XE_ANIMATION_PERIOD
        
        if .tick &gt;= ODD_EFFECT_TIMEOUT and ODD_EFFECTS == true then
            call DestroyEffect(AddSpecialEffect(ODD_EFFECT, .x, .y))
            call dmg.damageAOE(.cast, .x, .y, Range_Medium(), Damage_Medium(.lvl))
            set .tick = 0
        else
            call dmg.damageAOE(.cast, .x, .y, Range_Small(), Damage_Small(.lvl))
        endif
        
    endmethod
    
endstruct

        // End of Configuration!\\
        
private function Spell_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == SPELL_ID
endfunction
        
private function Spell_Actions takes nothing returns nothing
    local Data d
    
    local integer i = 0
    local unit u = GetTriggerUnit()
    local real x=GetUnitX(u)
    local real y=GetUnitY(u)
    local real x2
    local real y2
    local real a=GetUnitFacing(u)*bj_DEGTORAD
    
    call DestroyEffect(AddSpecialEffect(EFFECT_C, x, y))
    
    loop
    exitwhen i &gt;= ANGLES
        set d = Data.create(x, y, a)
        set d.fxpath=(DUMMY_EFFECT)
        set d.collisionSize=(Range_Small())
        set d.direction=a
        set d.speed = SLIDE_SPEED
        set d.expirationTime = TIME
        set d.play = GetOwningPlayer(u)
        set d.cast = u
        set d.cx = x
        set d.cy = y
        set d.lvl = GetUnitAbilityLevel(u, SPELL_ID)
        
        set x2 = x+EXPLOSION_OFFSET*Cos(a)
        set y2 = y+EXPLOSION_OFFSET*Sin(a)
        call DestroyEffect(AddSpecialEffect(EFFECT_1, x2, y2))
        call dmg.damageAOE(d.cast, x2, y2, Range_Medium(), Damage_Medium(d.lvl))
        
        set a = a + (2*bj_PI/ANGLES)
        set i = i + 1
    endloop
    
    set u = null
endfunction

private function Init takes nothing returns nothing
    local trigger t=CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_SPELL_EFFECT)
    call TriggerAddCondition(t,Condition(function Spell_Conditions))
    call TriggerAddAction(t,function Spell_Actions)
    
    set dmg = xedamage.create()
    
    set dmg.dtype = DAMAGE_TYPE
    set dmg.atype = ATTACK_TYPE
    set dmg.wtype = WEAPON_TYPE
    set dmg.damageAllies = DAMAGE_ALLIES
    
    call dmg.factor(STRUCTURE, .0)
    call dmg.factor(MAGIC, .0)
    call dmg.useSpecialEffect(EFFECT_T, ATTACH_POINT)
endfunction

endscope




Please give much feedback, and tips both for this spell and future stuff :D

Changelog

V 1.00 - Initial release!

V 1.10
¤ Changed "Range functions" to return real values instead of using I2R.
¤ Added a new constant, ANGLES, which configures how many angles the effects will show at.
¤ Added some new comments on the constants.
¤ Removed nulling triggers.

v 1.15
¤ Split the global block into two.
¤ Added constants for attack-type and damage-type.
¤ Added a constant to decide how many angles the effects will be created at.

V 1.20 - Major Update!
¤ New library replaces "Timed Handles".(Named "EAE" by kingkingyyk3, Thanks ALOT !!!)
¤ Now destroys dummy and special effect together, instead of the dummy had timed life.
¤ Using the new "EAE" library, now creates the last special effect at the right point.
¤ Fixed the spell not doing any damage, because the constants "LEVEL" didn't get set before the function for the damage and range. XD
¤ Instead of creating 16 groups inside the loop, it now creates 1 group each outside the loop in the 3 functions using them.
¤ Added/Changed some comments.

V 1.20b
¤ Fixed it to use the constant ANGLES correctly.

V 1.21
¤ DAMAGE_FACTOR is now a real.
¤ Uses global group instead of many local ones.
¤ Added another constant, "SLIDE_SPEED". Determines how much the moving effect is moved each 0.05 seconds.

V 1.22
¤ Updated Key Timers 2 to the latest version.
¤ Changed a typo in credits. Sorry, Jesus4Lyf XD

V 1.23
¤ Updated Key Timers to 1.7.0. :D
¤ Reduced the map size to half, lol.

V 1.23b
¤ Updated Key Timer 2 again. XD

V 1.24
¤ Fixed a bug where the dummies didn't get destroyed and stopped by using Timer Ticker instead of Key Timers 2.
¤ Changed some comments a bit.

V 1.25
¤ Added levels to the actual ability, as it didn't have it before.
¤ Changed name to "Tormental Wrath"!
¤ Changed a commonly used local unit variable to a global instead.
¤ Kingkingyyk3 updated the EAE library to be more efficient!

V 1.30
¤ Big rewrite of the spell's script! (Thanks to Kingkingyyk3!!!!)
¤ Now only needs the system Timer Ticker. (No more EAE that is :D)
¤ Fixed a bug where the dummy projectiles went further with higher speed than the others!
¤ Now completely MUI!!
¤ Made some adjustments to the comments.
¤ Balanced the damage slightly, reduced the damage by 40%!

V 1.31
¤ Added a couple of constants: Weapontype, attach point, slide interval!
¤ Changed weapontype to WEAPON_TYPE_WHOKNOWS :D

V 1.4
¤ Added 2 configurables. DISTANCE and TIME.
¤ Added "some" more comments on some configurables.
¤ Removed a struct member, now uses locals instead.
¤ Switched from using TT (Timer Ticker) to using KT2 (Key Timers 2) ... Again!
¤ Some minor tweaks.

V 1.41
¤ Did some major balancing, as it was way too overpowered before!
¤ Changed the tooltip of the spell, quite a bit!
¤ Added a configurable, EXPLOSION_OFFSET, which determines how much offset the first explosions will be.
¤ A few more minor tweaks to the code.

V 1.5
¤ Added a TimerUtils version of the spell, as it can't be approved at WC3C.net if it doesn't use it.
¤ Made some minor changes in the documentation.

V 1.51
¤ The spell now uses GroupUtils!
¤ Changed the spell to correctly use the ANGLE constant!
¤ Changed from using FirstOfGroup, to use ForGroup calls.
¤ Changed the constant SLIDE_SPEED to be Units/Second instead of Units/Interval.
¤ Some slight changes in the documentation.

V 2.00
¤ Complete rewrite of the entire code !
¤ Now uses only the xe libraries, and BoundSentinel !
¤ Added more constants !
¤ And many, many more changes !
 

Attachments

  • Tormental Wrath, by Komaqtion!.w3x
    71.8 KB · Views: 464

Larcenist

REP: Respect, Envy, Prosperity?
Reaction score
211
JASS:
private function Damage_Small takes nothing returns integer
    return DAMAGE_FACTOR * 10
endfunction

private function Damage_Medium takes nothing returns integer
    return 50 + LEVEL * DAMAGE_FACTOR * 50
endfunction

private function Damage_High takes nothing returns integer
    return LEVEL * DAMAGE_FACTOR * 100
endfunction

    // Range functions!\\

private function Range_Small takes nothing returns real
    return I2R(RANGE_FACTOR * 5)
endfunction

private function Range_Medium takes nothing returns real
    return I2R(RANGE_FACTOR * 10)
endfunction

private function Range_High takes nothing returns real
    return I2R(RANGE_FACTOR * RANGE_FACTOR)
endfunction


I see a lot of values that could be globals or simply replaced by a single variable instead of some multiplication.

You could make one of those number a real value and skip all those I2R() calls too (simply add a dot behind those non-configurable ones or make the configurable variables reals).

JASS:
private struct Data
    unit array du [17]
    unit cs
    real array pointx [17]
    real array pointy [17]
    //...


The array sizes could probably be a configurable for even more flexibility.

Perhaps you should also make the Attack/damageTypes configurable.

You could also try to replace that TriggerSleepAction() with a timer, if not for anything else you could do it for gaining experience.

Also you do not have to null the trigger in your init function.

For your first JASS-spell it's fairly well made, seeing as some might try something a little simpler for their first one.
 

WolfieeifloW

WEHZ Helper
Reaction score
372
That second set of globals that aren't supposed to be touched can be put in another globals block lower down.

And why do people feel the need to put their name in the thread title :rolleyes: .
It says your name right below the title.
 

Komaqtion

You can change this now in User CP.
Reaction score
469
JASS:
private function Damage_Small takes nothing returns integer
    return DAMAGE_FACTOR * 10
endfunction

private function Damage_Medium takes nothing returns integer
    return 50 + LEVEL * DAMAGE_FACTOR * 50
endfunction

private function Damage_High takes nothing returns integer
    return LEVEL * DAMAGE_FACTOR * 100
endfunction

    // Range functions!\\

private function Range_Small takes nothing returns real
    return I2R(RANGE_FACTOR * 5)
endfunction

private function Range_Medium takes nothing returns real
    return I2R(RANGE_FACTOR * 10)
endfunction

private function Range_High takes nothing returns real
    return I2R(RANGE_FACTOR * RANGE_FACTOR)
endfunction


I see a lot of values that could be globals or simply replaced by a single variable instead of some multiplication.

What do you mean there? I put the DAGAGE/RANGE_FACTOR as globals... isn't that enough ??

You could make one of those number a real value and skip all those I2R() calls too (simply add a dot behind those non-configurable ones or make the configurable variables reals).

Ok, they now return real valuse directly, thanks :D

JASS:
private struct Data
    unit array du [17]
    unit cs
    real array pointx [17]
    real array pointy [17]
    //...


The array sizes could probably be a configurable for even more flexibility.

Added!

Perhaps you should also make the Attack/damageTypes configurable.

Oops, forgot this one XD Will add now ;)

You could also try to replace that TriggerSleepAction() with a timer, if not for anything else you could do it for gaining experience.

I'm not that good with timers though :( Mind helping ??

Also you do not have to null the trigger in your init function.

Changed :D

For your first JASS-spell it's fairly well made, seeing as some might try something a little simpler for their first one.

Thank you :D:D

That second set of globals that aren't supposed to be touched can be put in another globals block lower down.

Will change now ;) Thanks :D
 

Larcenist

REP: Respect, Envy, Prosperity?
Reaction score
211
>What do you mean there? I put the DAGAGE/RANGE_FACTOR as globals... isn't that enough ??

Well you could just replace those factors with the whole numbers. Seeing as SOME_RANDOM_FACTOR * 5. doesn't make much sense, you might as well make the configurable 5 times the value of SOME_RANDOM_FACTOR.
 

Komaqtion

You can change this now in User CP.
Reaction score
469
>What do you mean there? I put the DAGAGE/RANGE_FACTOR as globals... isn't that enough ??

Well you could just replace those factors with the whole numbers. Seeing as SOME_RANDOM_FACTOR * 5. doesn't make much sense, you might as well make the configurable 5 times the value of SOME_RANDOM_FACTOR.

But it isn't only *5.. It's +50 also, and *10 and stuff ... would make it too complicated, wouldn't it ??? :S

The array sizes could probably be a configurable for even more flexibility.

Was to fast to respond to this XD Can't seem to get it to work :( I either make ANGLES a real and use in the struct "unit array du [R2I(ANGLES)]" but it doesn't work, or i make ANGLES and integer, but then it's too much using I2R instead on all natives inside the trigger itself... how should i do ??
 

Larcenist

REP: Respect, Envy, Prosperity?
Reaction score
211
ANGLES would probably be the same number as those arrays, right? Then use ANGLES as the array size.
JASS:

    loop
        exitwhen i&gt;=16
//...


You would also have to modify that part to fit with the new amount of units, change the 16 to (ANGLES - 1) or something.
 

Komaqtion

You can change this now in User CP.
Reaction score
469
But should ANGLES be a real or integer ??
I can't use R2I inside the array space there, because it gives me an error :S
 

Larcenist

REP: Respect, Envy, Prosperity?
Reaction score
211
Keep it an integer, seeing as no one would want 16.5 effects to spawn anyway.
 

Komaqtion

You can change this now in User CP.
Reaction score
469
I can't use variables as an array size :(
Get an error:
Line 2492: Wrong [size] definition

EDIT: Don't mind that post, it worked :D
Just a question, i just noticed that it doesn't do any damage anymore, and that it is probably because of the new configurables, then damage/range functions.
since LEVEL is never set, it becomes 0 and nulls those functions. How can i set LEVEL to the ability level before those function ???

BUMP / UPDATE!
Now updated with some major changes :D Hope to get some more feedback though :D

Small question: How do i cange the name of spoilers, like instead of "Spoiler!" you see "Changelog" or something ? Or is it some other forum i'm thinking of ?? :S
 

Larcenist

REP: Respect, Envy, Prosperity?
Reaction score
211
JASS:
    loop
        exitwhen i&gt;=16


You still haven't made the loop end dependant on the ANGLES variable. If someone changes the variable in order to get less or more effects, the loop has to be modified aswell. Just change the 16 to (ANGLES - 1) or something.
 

Komaqtion

You can change this now in User CP.
Reaction score
469
Updated :D And changed some stuff regaring that variable, like making it 16 instead of 17, only needed 16 XD
 

Dinowc

don't expect anything, prepare for everything
Reaction score
223
JASS:
private constant integer DAMAGE_FACTOR

shouldn't this be a real type variable?

so you can actually get more precise values

think of this:

1) DAMAGE_FACTOR = 1, lv = 10

JASS:
lv * DAMAGE_FACTOR * 100 = 1000 damage


2) DAMAGE_FACTOR = 2, lv = 10

JASS:
lv * DAMAGE_FACTOR * 100 = 2000 damage


1000-2000 it's a big difference, don't you think?
in object editor all AOE, damage, AS, MS, attack/cast range etc. values are real type

also, there are lots of unnecessary stuff in your code... that's why the map size is so big (or you have more spells/systems in the map?)

I haven't checked the whole code, but the local group g in Effects function is leaking

you never destroy it, you just null the variable or am I wrong? :confused:

btw if you gonna use the group and destroy it immediately, it's always best to use 1 global group, create it at map init and just add/remove units from it
1 example is the Callback function, since it runs instantly (no waits/timers between actions) you can use a global group instead of creating one all the time

same for your dummy casters

you don't have to create them and remove all the time
you can use 1 global dummy and do every spell-casting job with him, just set his cast/backswing thingies to 0.00 to get an instant cast

also,

set a.pointx = xd+10*Cos(I2R(i*(360/(ANGLES-1)))*bj_DEGTORAD)

you should make the slide speed configurable (replace that 10 with a constant global integer so players can set their desired slide speed)
the more the spell is configurable, the better it is

and +rep since this is your first vJass spell

have fun on doing more spells :thup:
 

Komaqtion

You can change this now in User CP.
Reaction score
469
JASS:
private constant integer DAMAGE_FACTOR

shouldn't this be a real type variable?

Changed... Thanks :thup:

also, there are lots of unnecessary stuff in your code... that's why the map size is so big (or you have more spells/systems in the map?)

It has xe, for Pre-Loading the spell, and some other stuff to make it easier to test, and also since I'm learning JASS, i did it all in JASS... Thought since I'm making a JASS spell, i might just take advantage of the situation, and learn as much JASS as i can while I'm going at it XD

I haven't checked the whole code, but the local group g in Effects function is leaking

you never destroy it, you just null the variable or am I wrong? :confused

Fixed, thanks !!! :D

btw if you gonna use the group and destroy it immediately, it's always best to use 1 global group, create it at map init and just add/remove units from it
1 example is the Callback function, since it runs instantly (no waits/timers between actions) you can use a global group instead of creating one all the time

So can i put another "temp" group inside the globals block then ?

same for your dummy casters

you don't have to create them and remove all the time
you can use 1 global dummy and do every spell-casting job with him, just set his cast/backswing thingies to 0.00 to get an instant cast

But I'm using them as effects, I'm attaching an effect to them and moving them... Don't i need to create them then ??

also,

set a.pointx = xd+10*Cos(I2R(i*(360/(ANGLES-1)))*bj_DEGTORAD)

you should make the slide speed configurable (replace that 10 with a constant global integer so players can set their desired slide speed)
the more the spell is configurable, the better it is


Changed :thup:

and +rep since this is your first vJass spell

have fun on doing more spells :thup:

Thanks you !!

EDIT: Btw, nobody knows if you can change the name of a spoiler ?? (As asked in another post here in the thread)
 

GetTriggerUnit-

DogEntrepreneur
Reaction score
129
Save the test map before posting it up here. I want to test the spell but I don't have time to open newgen and so save the map properly. Make sure the map can be played.
 

Jesus4Lyf

Good Idea™
Reaction score
397
>Jesus4Luf
Lol... typo in creds. Jesus4Lyf plz. ;)

Oh and uh... You should post a link to the KT2 thread instead of including the system code here, because users should always use the latest version. :)

Edit: Woah! You've posted the original version of KT2. Please update your stuff to use the latest... It's a lot faster, among other things... And I believe you shouldn't need to update a single line of code to do so...
 

Komaqtion

You can change this now in User CP.
Reaction score
469
Save the test map before posting it up here. I want to test the spell but I don't have time to open newgen and so save the map properly. Make sure the map can be played.

What do you mean? Should i update the map attachment with the latest version ?

>Jesus4Luf
Lol... typo in creds. Jesus4Lyf plz.

Oh and uh... You should post a link to the KT2 thread instead of including the system code here, because users should always use the latest version.

Edit: Woah! You've posted the original version of KT2. Please update your stuff to use the latest... It's a lot faster, among other things... And I believe you shouldn't need to update a single line of code to do so...

Sorry!! XD Changed :D

And updated KT2 :thup:
 

Dinowc

don't expect anything, prepare for everything
Reaction score
223
What do you mean? Should i update the map attachment with the latest version ?

he means that you should save the map so it can be playable without opening it with NewGen

when you do stuff in vJass (like you did it with your spell) the world editor doesn't recognize it (scopes, globals, privates...) so JassHelper needs to somehow "convert" the vJass code into Jass code which is readable by world editor

JassHelper compiles it upon saving the map, so the actual map script is written in Jass, not vJass

example, when you do this:

JASS:
scope TEST

private function a takes nothing returns nothing
endfunction

public function b takes nothing returns nothing
endfunction

endscope


the JassHelper translates it into:

JASS:
function TEST__a takes nothing returns nothing
endfunction

function TEST_b takes nothing returns nothing
endfunction
 

Faust

You can change this now in User CP.
Reaction score
123
Burning hell for me suggest some kind of chaotic malevolent rhapsody of effects, but this is too symmertryc. Looks nice though, 4/5
 

Komaqtion

You can change this now in User CP.
Reaction score
469
Have another name maybe ??? :D I have 0 imagination, so could really use one XD
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Staff online

      Members online

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top