• 🏆 Texturing Contest #33 is OPEN! Contestants must re-texture a SD unit model found in-game (Warcraft 3 Classic), recreating the unit into a peaceful NPC version. 🔗Click here to enter!
  • It's time for the first HD Modeling Contest of 2024. Join the theme discussion for Hive's HD Modeling Contest #6! Click here to post your idea!

[Adiktuz]Elemental SpellPack 1.1

  • Like
Reactions: deepstrasz
This spell pack will contain every spell made by me that have elemental affinity. Requires JNGP to edit/save.

This pack currently contains 3 spells:

Meteor Storm - Calls forth meteors into the ground damaging enemies upon impact

Aqua Crush - Creates a powerful water explosion at the target point which sends enemies high into the air and damages them upon impact and when they reach the ground.

Holy Sanctuary - Heals every unit around you (ally and enemy). Deals damage instead of heal to undead units.

Codes:


JASS:
library DestructableDestroy initializer DestInit

//Since several spells use this function I placed it into a library
//Make sure you set destructables that you cannot afford to get destroyed to be invulnerable using the function DestInvu


function Dest takes nothing returns nothing
    local destructable d = GetEnumDestructable()
    if not IsDestructableInvulnerable(d) then
        call KillDestructable(d)
    endif
    set d = null
endfunction

//This function makes the default pathing blockers invulnerable
//If you want a destructable that is used more than once in your map to be invulnerable
//just make another if-then statement and change the rawcode into the rawcode of that destructable

function DestInvu takes nothing returns nothing
    local destructable d = GetEnumDestructable()
    local integer ID = GetDestructableTypeId(d)
    if  ID == 'YTab' then
        call SetDestructableInvulnerable(d, true)
    endif
    if ID == 'YTac' then
        call SetDestructableInvulnerable(d, true)
    endif
    if ID == 'YTfb' then
        call SetDestructableInvulnerable(d, true)
    endif
    if ID == 'YTfc' then
        call SetDestructableInvulnerable(d, true)
    endif
    if ID == 'YTpb' then
        call SetDestructableInvulnerable(d, true)
    endif
    if ID == 'YTpc' then
        call SetDestructableInvulnerable(d, true)
    endif
    set d = null
endfunction

function DestInit takes nothing returns nothing
    call EnumDestructablesInRect(GetPlayableMapRect(), null, function DestInvu)
endfunction

endlibrary



JASS:
///////////////////////////////////////////////////
//           Meteor Storm
//            by: Adiktuz
///////////////////////////////////////////////////
scope MeteorStorm initializer S_Init

//configurables
globals
    private constant integer FLY = 'Amrf' //Rawcode of Medivh's raven form
    private constant integer DUMMY = 'h000' //Rawcode of the dummy unit(vertical)
    private constant integer SPELL = 'A000' //Rawcode of the spell
    private constant integer MAX = 4  //Base number of meteors created
    private constant integer MAX_I = 2  //Increment in the number of meteors created per level
    private constant real DAMAGE = 30  //Damage dealt by each meteor per spell level
    private constant boolean RANDOM = false //If set to true, the meteors will have different fall speeds
    private constant real SPEED = 20 //The rate at which the meteors fall, higher number = faster fall
    private constant real SPEEDMAX = 25 //The max rate at which the meteor will fall if RANDOM = true
    private constant real SPEEDMIN = 5 //The min rate at which the meteor will fall if RANDOM = true
    private constant real MAXHEIGHT = 800 //The max height of each meteor upon creation
    private constant real MINHEIGHT = 500 //The min height of each meteor upon creation
    private constant real AOE = 0 //The base radius of the spell
    private constant real AOE_I = 100 //Bonus radius of the spell per level
    private constant real RADIUS = 150 //The radius of the meteor's damage
    private constant string EFFECT = "Abilities\\Spells\\Other\\Doom\\DoomDeath.mdl" //The effect when the meteor explodes
    private constant string METEOR = "Abilities\\Weapons\\LordofFlameMissile\\LordofFlameMissile.mdl" //The effect of the meteor
    private attacktype ATYPE = ATTACK_TYPE_MAGIC //The attack type of the spell
    private damagetype DTYPE = DAMAGE_TYPE_FIRE //The damage type of the spell
    private boolean TREE = true //If set to true, meteors will also destroy destructibles: if you use the normal bridges make them invulnerable or the spell will also destroy them.
//End of configurables
    private integer array Data
    private integer Total = 0
    private timer t = CreateTimer()
    private group Temp = CreateGroup()
endglobals


private struct S
 real x
 real y
 unit u
 player owner
 real height
 effect meteor
 real damage
 
    method onDestroy takes nothing returns nothing
        local unit a
        local rect r = Rect(this.x - RADIUS, this.y - RADIUS, this.x + RADIUS, this.y + RADIUS)
        call DestroyEffect(AddSpecialEffect(EFFECT, this.x, this.y))
        if TREE then
            call EnumDestructablesInRect(r, null, function Dest)
        endif
        call GroupEnumUnitsInRange(Temp, this.x, this.y, RADIUS, null)
        loop
            set a = FirstOfGroup(Temp)
            exitwhen a == null
            if (IsPlayerEnemy(GetOwningPlayer(a), this.owner) and GetWidgetLife(a) > .405) then
                call UnitDamageTarget(this.u, a, this.damage, false, false , ATYPE, DTYPE, WEAPON_TYPE_WHOKNOWS)
            endif
            call GroupRemoveUnit(Temp, a)
        endloop
        set a = null
        call DestroyEffect(this.meteor)
        call UnitApplyTimedLife(this.u, 'BTLF', 1.00)
        call RemoveRect(r)
        set this.u = null
        set this.owner = null
        set this.meteor = null
 endmethod
 
 static method Screate takes real x, real y, player p, integer level returns nothing
    local S dat = S.create()
    set Data[Total] = dat
    set dat.owner = p
    set dat.x = x + GetRandomReal(-(AOE + AOE_I*level), (AOE + AOE_I*level))
    set dat.y = y + GetRandomReal(-(AOE + AOE_I*level), (AOE + AOE_I*level))
    set dat.u = CreateUnit(dat.owner, DUMMY, dat.x, dat.y, 0.00)
    set dat.height = GetRandomReal(MINHEIGHT, MAXHEIGHT)
    set dat.damage = DAMAGE*level
    call UnitAddAbility(dat.u, FLY)
    call UnitRemoveAbility(dat.u, FLY)
    call SetUnitFlyHeight(dat.u, dat.height, 0.0)
    set dat.meteor = AddSpecialEffectTarget(METEOR, dat.u, "origin")
    set Total = Total + 1
    if Total == 1 then
        call TimerStart(t, .03, true, function S.move)
    endif
    set p = null
 endmethod
 
 static method move takes nothing returns nothing
    local S dat
    local integer i = 0
    loop
        exitwhen i == Total
        set dat = Data[i]
        if RANDOM then
            set dat.height = dat.height - GetRandomReal(SPEEDMIN, SPEEDMAX)
        else
            set dat.height = dat.height - SPEED
        endif
        call SetUnitFlyHeight(dat.u, dat.height,  0.00)
        if dat.height < 1 then
            call dat.destroy()
            set Total = Total - 1
            set Data[i] = Data[Total]
            set i = i - 1
        endif
        set i = i + 1
    endloop
    if Total == 0 then
        call PauseTimer(t)
    endif
 endmethod
 
 static method Start takes nothing returns nothing
    local integer i = 0
    local unit a = GetTriggerUnit()
    local real x = GetSpellTargetX()
    local real y = GetSpellTargetY()
    local integer level = GetUnitAbilityLevel(a, GetSpellAbilityId())
    loop
        exitwhen i > (MAX + MAX_I*level)
        call S.Screate(x,y,GetOwningPlayer(a),level)
        set i = i + 1
    endloop
    set a = null
 endmethod
 
endstruct

private function SCheck takes nothing returns boolean
    return GetSpellAbilityId() == SPELL
endfunction

private function S_Init takes nothing returns nothing
    local trigger Meteor = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ(Meteor, EVENT_PLAYER_UNIT_SPELL_EFFECT)
    call TriggerAddCondition(Meteor, function SCheck)
    call TriggerAddAction(Meteor, function S.Start)
    set Meteor = null
endfunction

endscope



JASS:
///////////////////////////////////////////////////
//             Aqua Crush
//            by: Adiktuz
///////////////////////////////////////////////////
scope AquaCrush initializer Aqua_Init

//configurables
globals
    private constant integer FLY = 'Amrf' //Rawcode of Medivh's raven form
    private constant integer DUMMY = 'h001' //Rawcode of the dummy unit(horizontal)
    private constant integer SPELL = 'A001' //Rawcode of the spell
    private constant real DAMAGE = .833 //Explosion damage per level (multiply this value by 12)
    private constant real DAMAGER = 4.17 //Impact damage per level (multiply this by 12)
    private constant real HEIGHT = 600 //The maximum height that units will be thrown up to
    private constant string WAVE = "Abilities\\Spells\\Other\\CrushingWave\\CrushingWaveMissile.mdl" //The path to the wave effect
    //Note: Using WATER and SPLASH can cause a little lag on some PCs
    private boolean SE = false //If true, there will be an explosion effect
    private boolean SPE = false //If true, there will be a splashdown effect
    private constant string WATER = "Objects\\Spawnmodels\\Naga\\NagaDeath\\NagaDeath.mdl" //The path to the explosion effect
    private constant string SPLASH = "Objects\\Spawnmodels\\Naga\\NagaDeath\\NagaDeath.mdl" //The path to the splashdown effect
    private constant real AOE = 100 //The base radius of the spell
    private constant real AOE_B = 50 //The bonus radius of the spell per level
    private constant real RANGE = 500 //The distance of the waves from the target point
    private constant real SPEED = 20 //The rate at which the waves move
    private attacktype ATYPE = ATTACK_TYPE_MAGIC //The attack type of the spell
    private damagetype DTYPE = DAMAGE_TYPE_COLD //The damage type of the spell
    private constant boolean TREE = true //If set to true, the explosion will also destroy destructibles: if you use the normal bridges make them invulnerable or the spell will also destroy them.
    private constant boolean FLYING = false //If set to true, flying units will also get lifted
//End of configurables
    private integer array Data
    private integer array Datax
    private integer Total = 0
    private integer Totalx = 0
    private timer t = CreateTimer()
    private timer tx = CreateTimer()
    private group Temp = CreateGroup()
    private constant real ACCELERATION = 3 //The increase in rate at which units get thrown up/down
endglobals

private struct AC
real x
real y
real distance
real facing
unit u
real height
effect wave
player owner
unit v
real time
integer level
boolean direction = false


    static method create takes real x, real y, player p, real facing, integer level, unit caster returns AC
        local AC dat = AC.allocate()
        set Data[Total] = dat
        set dat.x = x - RANGE*Cos(facing)
        set dat.y = y - RANGE*Sin(facing)
        set dat.u = CreateUnit(p, DUMMY, dat.x, dat.y, facing*bj_RADTODEG)
        set dat.distance = RANGE
        set dat.owner = p
        set dat.level = level
        set dat.facing = facing
        set dat.v = caster
        set dat.wave = AddSpecialEffectTarget(WAVE, dat.u, "chest")
        if Total == 0 then
            call TimerStart(t, .03, true, function AC.move)
        endif
        set Total = Total + 1
        set p = null
        return dat
    endmethod
   
    method onDestroy takes nothing returns nothing
        local rect r = Rect(this.x - AOE - AOE_B*this.level, this.y - AOE - AOE_B*this.level, this.x + AOE + AOE_B*this.level, this.y + AOE + AOE_B*this.level)
        if TREE then
            call EnumDestructablesInRect(r, null, function Dest)
        endif
        call DestroyEffect(this.wave)
        set this.u = null
        set this.wave = null
        set this.owner = null
        set this.v = null
        call RemoveRect(r)
        set r = null
    endmethod
   
    static method move takes nothing returns nothing
        local AC dat
        local integer i = 0
        local unit u
        local unit x
        loop
            exitwhen i == Total
            set dat = Data[i]
            set dat.x = dat.x + SPEED*Cos(dat.facing)
            set dat.y = dat.y + SPEED*Sin(dat.facing)
            call SetUnitPosition(dat.u, dat.x, dat.y)
            set dat.distance = dat.distance - SPEED
            if dat.distance == 0 then
                call GroupEnumUnitsInRange(Temp, dat.x, dat.y, AOE + AOE_B*dat.level, null)
                loop
                    set u = FirstOfGroup(Temp)
                    exitwhen u == null
                    if (IsPlayerEnemy(GetOwningPlayer(u), dat.owner) and GetWidgetLife(u) > .405) then
                        call AC.LiftStart(u,dat.v, dat.level)
                        call UnitDamageTarget(dat.u,u, dat.level*DAMAGE, false, false, ATYPE, DTYPE, WEAPON_TYPE_WHOKNOWS)
                    endif
                    call GroupRemoveUnit(Temp, u)
                endloop
                if SE then
                    call DestroyEffect(AddSpecialEffectTarget(WATER, dat.u, "origin"))
                endif
                call UnitApplyTimedLife(dat.u, 'BTLF', 1.00)
                call dat.destroy()
                set Total = Total - 1
                set Data[i] = Data[Total]
                set i = i - 1
            endif
            set i = i + 1
        endloop
        if Total == 0 then
            call PauseTimer(t)
        endif
        set x = null
        set u = null
    endmethod
   
    static method LiftStart takes unit u,unit x, integer level returns nothing
        local AC dat = AC.allocate()
        if FLYING then
            set dat.x = GetUnitX(u)
            set dat.y = GetUnitY(u)
            call UnitAddAbility(u, FLY)
            call UnitRemoveAbility(u, FLY)
            call SetUnitFlyHeight(u, 10.00, 0)
            set dat.v = u
            set dat.u = x
            set dat.level = level
            set dat.time = 0
        else
            if IsUnitType(u, UNIT_TYPE_FLYING) == false then
                set dat.x = GetUnitX(u)
                set dat.y = GetUnitY(u)
                call UnitAddAbility(u, FLY)
                call UnitRemoveAbility(u, FLY)
                call SetUnitFlyHeight(u, 10.00, 0)
                set dat.v = u
                set dat.u = x
                set dat.level = level
                set dat.time = 0
            else
                set dat.v = null
                set dat.u = null
                set dat.direction = true
            endif
        endif
        set Datax[Totalx] = dat
        if Totalx == 0 then
            call TimerStart(tx, .03, true, function AC.Lift)
        endif
        set Totalx = Totalx + 1
        set u = null
        set x = null
    endmethod
   
    static method Lift takes nothing returns nothing
        local AC dat
        local integer i = 0
        loop
            exitwhen i == Totalx
            set dat = Datax[i]
            set dat.time = dat.time + 1
            if dat.direction then
                set dat.height = dat.height - ACCELERATION*dat.time
                call SetUnitPosition(dat.v,dat.x,dat.y)
                call SetUnitFlyHeight(dat.v,dat.height,0)
            else
                set dat.height = dat.height + ACCELERATION*(20.00 - dat.time)
                call SetUnitPosition(dat.v,dat.x,dat.y)
                call SetUnitFlyHeight(dat.v,dat.height,0)
                if dat.height >= 600 then
                    set dat.direction = true
                    set dat.time = 0
                endif
            endif
            if dat.height <= 0 then
                if SPE then
                    call DestroyEffect(AddSpecialEffect(SPLASH, GetUnitX(dat.v), GetUnitY(dat.v)))
                endif
                call UnitDamageTarget(dat.u,dat.v, dat.level*DAMAGER, false, false, ATYPE, DTYPE, WEAPON_TYPE_WHOKNOWS)
                set dat.u = null
                set dat.v = null
                call dat.destroy()
                set Totalx = Totalx - 1
                set Datax[i] = Datax[Totalx]
                set i = i - 1
            endif
            set i = i + 1
        endloop
        if Totalx == 0 then
            call PauseTimer(tx)
        endif
    endmethod
endstruct

private function Aqua_Check takes nothing returns boolean
    return GetSpellAbilityId() == SPELL
endfunction

private function Aqua_Start takes nothing returns nothing
    local integer i = 0
    local unit a = GetTriggerUnit()
    local real x = GetSpellTargetX()
    local real y = GetSpellTargetY()
    loop
        exitwhen i == 12
        call AC.create(x,y,GetOwningPlayer(a), i*30*.017453292, GetUnitAbilityLevel(a, SPELL), a)
        set i = i + 1
    endloop
    set a = null
endfunction

private function Aqua_Init takes nothing returns nothing
    local trigger Aqua = CreateTrigger(  )
    call TriggerAddAction( Aqua, function Aqua_Start )
    call TriggerAddCondition(Aqua, function Aqua_Check)
    call TriggerRegisterAnyUnitEventBJ(Aqua, EVENT_PLAYER_UNIT_SPELL_EFFECT)
endfunction

endscope



JASS:
///////////////////////////////////////////////////
//             Holy Sanctuary
//            by: Adiktuz
///////////////////////////////////////////////////

scope Holy initializer HolyInit

//configurables
globals
    private constant integer SPELL = 'A002' //Rawcode of the spell
    private constant real POWER = 100 //The amount healed/damaged per level of ability
    private constant real RADIUS = 300 //The base radius of the spell
    private constant real RADIUS_B = 100 //The radius bonus per level
    private constant boolean SELF = true //Determines whether the spell will affect the caster or not
    private constant string CEFFECT = "Abilities\\Spells\\Human\\Resurrect\\ResurrectCaster.mdl" //The path to the caster effect
    private constant string TEFFECT = "Abilities\\Spells\\Human\\Resurrect\\ResurrectTarget.mdl" //The path to the target effect
//End of Configurables
    private group Holy_Group = CreateGroup()
endglobals


private function HolySanctuary_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == SPELL
endfunction

private function HolySanctuary_Filter takes nothing returns boolean
    return IsUnit(GetFilterUnit(), GetTriggerUnit()) != true
endfunction

private function HolySanctuary_Effect takes nothing returns nothing
    local unit u = GetEnumUnit()
    local real damage = POWER*I2R(GetUnitAbilityLevel(GetTriggerUnit(),SPELL))
    if GetWidgetLife(u) > .405 then
        if IsUnitType(u, UNIT_TYPE_UNDEAD) then
            call UnitDamageTarget(GetTriggerUnit(), u, damage, false, false, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_DIVINE, WEAPON_TYPE_WHOKNOWS)
            call DestroyEffect(AddSpecialEffectTarget(TEFFECT, u, "origin"))
        else
            call SetWidgetLife(u, GetWidgetLife(u) + damage)
            call DestroyEffect(AddSpecialEffectTarget(TEFFECT, u, "origin"))
        endif
    endif
    set u = null
endfunction

private function HolySanctuary_Actions takes nothing returns nothing
    local unit u = GetTriggerUnit()
    if SELF != true then
        call GroupEnumUnitsInRange(Holy_Group, GetUnitX(u), GetUnitY(u), RADIUS + RADIUS_B*GetUnitAbilityLevel(GetTriggerUnit(),SPELL), Condition(function HolySanctuary_Filter))
    else
        call GroupEnumUnitsInRange(Holy_Group, GetUnitX(u), GetUnitY(u), RADIUS + RADIUS_B*GetUnitAbilityLevel(GetTriggerUnit(),SPELL), null)
    endif
    call ForGroup(Holy_Group, function HolySanctuary_Effect)
    call DestroyEffect(AddSpecialEffectTarget(CEFFECT, u, "origin"))
    set u = null
endfunction

private function HolyInit takes nothing returns nothing
    set gg_trg_HolySanctuary = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_HolySanctuary, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddAction( gg_trg_HolySanctuary, function HolySanctuary_Actions )
    call TriggerAddCondition( gg_trg_HolySanctuary, function HolySanctuary_Conditions)
endfunction

endscope



Dates here are based on time zone GMT +8:00
February 23, 2010 - Uploaded spell pack
March 1, 2010 - Updated to v.1.1




V 1.1 - Added the option to increase the AOE of the spells per level. Also added the option to increase the number of meteors created by Meteor Storm per level.
- Added acceleration/deceleration to the lifting effect of Aqua Crush and also added an optional splashdown effect.
- Added a boolean to Aqua Crush which will check wheter flying units will get lifted or not.
- Holy Sanctuary now checks the SELF variable which I forgot to do so on the first version.
- Removed Arrow Shower.



Vexorian


Keywords:
elements,meteor,aqua,water,heal,undead,holy,jump
Contents

[A]Elemental SpellPack 1.1 (Map)

Reviews
19:11, 24th Mar 2010 The_Reborn_Devil: The triggering looks good, but I think the effects could get slightly better. F.ex, the meteors should fall faster and they shouldn't fall straight down, but moving towards a certain direction as well. And...

Moderator

M

Moderator

19:11, 24th Mar 2010
The_Reborn_Devil:

The triggering looks good, but I think the effects could get slightly better. F.ex, the meteors should fall faster and they shouldn't fall straight down, but moving towards a certain direction as well. And on the Water Crush spell units should be damages as they get hit by the waves. This will make the spell more demanding though.

Anyway,

Status: Approved
Rating: Useful
 
Level 7
Joined
Oct 11, 2008
Messages
304
@Aspard
just save again and will work

Review:

Aqua Crush
i like the initial effect of it, but the damage effect is really bad

Holy Sanctuary
bugged, it heal enemy too o.õ'

Meteor Storm
visual nothing, but i don't read the code
 
Level 18
Joined
Feb 28, 2009
Messages
1,970
Can't resave, it shows me three compile errors :)
Get newer JASS helper for me it works.

*Checking the spells

EDIT: Ok, the effects are... nothing really good. I don`t have time too look at the code and coz I`m beginner in vJASS I`ll leave code comments to better coders.

Just one thing to effects - I`d suggest you use parabola for Aqua Crush coz as it is now it looks kinda plastic and some effects when the unit is flying.
 
For the holy sanctuary - it is really supposed to heal allies and enemies (wrote it above)...

For the Aqua crush - I wont change the effect that makes the units fly, anyway there is an explosion effect which you can set (I just set it to null so you wont see it)
- An effect attached to the units that are hit, hmmm, yeah I can add it as an option.

- @Laiev - what do you mean by damage effect is bad?

I made this in 1.24b with JNGP and the latest jass helper (the Horus version)...


Thanks for the comments!
 
Level 14
Joined
Nov 18, 2007
Messages
1,084
Review (Note that I quickly skimmed through the code and tested the spells to a small extent in-game.):

Meteor Storm

  • What's the point of storing the attacktype and damagetype in the struct? Just use the global directly.
  • Suggestion to use a global rect for tree destroying. (Applies to Aqua Crush too)
  • Suggestion to preload the dummy unit. (Applies to rest of dummy units used by the spells.)
  • My opinion: Effect was dull.
Aqua Crush

  • Use radians directly instead of having to multiply by bj_DEGTORAD
  • As mentioned, the flying effect looked unappealing. If you don't want to use a parabola movement, you could consider acceleration.
  • My opinion: This seems to be only spell that could be approved after some tweaks.
Holy Sanctuary

  • Never even used the SELF variable.
  • My opinion: Too simple and the effect is pretty much unwanted. (Who wants to heal their non-undead enemy units and damage their friendly undead units?)

I suggest using other systems to make your spells easier to code and use.

Suggestions:

  • Use DestructableLib to detect a destructable is a tree.
  • Use GroupUtils for group recycling and the added bonus of GroupEnumUnitsInArea for group enumerations.
  • Could use TimerUtils instead of using a global timer.

Other comments:

  • Hidden tags aren't necessary because of the new Jass tags.
  • Test map could be improved. (Add a different variety of units to test the spells with, like flying and magic-immune.)
  • A lot of things that should be configurable with level aren't. (Like damage and spell area)
  • You should declare functions to be private, such as HolyInit and others.
  • FirstOfGroup loops are slow.
  • I don't think you need to null struct member as they will be reused anyway. (Unless you have some kind of boolean that checks if they're null of not.)
  • Inconsistent coding. For instance, you allow attack type and damage type to be defined in Aqua Crush and Meteor Storm but not for HolySanctuary.
  • Not that significant, but indenting was kind of bad.
  • Your test map wasn't compiled. (I had to save again to actually test it.)
 

for the test map, yeah it seems that it is uncompiled, I'll be reuploading it right now but only with the fix for the fact that I forgot to compile it... maybe the updates will come next week

-For Meteor Storm
->right, I can just use the globals directly
->preload the dummy... hmmm... okay.... (preload them together with the SFX?)
->you mean the SFX? you can modify it...

-Aqua Crush
->I'll use radians later...
->I'll figure out how to make them accelerate

-Holy Sanctuary
->Yeah I forgot to check SELF
->Who knows? there might be soemone out there who wants it, anyway it can be a spell which needs careful planning before you use it...

-Others
->can you change the header by using the new JASS tag? I mean with Hidden you can set a header (the text before the show button)...
->The spells will destroy every destructable that isnt invulnerable so I cannot use a tree filter...
->If I just use global groups I wont need group utils, I just Enumerate anyways
->For timer utils, I wont really use it unless I need to save data in to the timer, from my last spell TRD told me that its better to use a single timer than a separate timer for each object...
->damage changes per level and you can also set how much damage per level it deals. For the AOE, I'll add it...
->what's wrong with the indentation?
 
Level 14
Joined
Nov 18, 2007
Messages
1,084
When I'm talking about effect, I meant the spell's actual effect, meaning what it does and how it looks. To me, Meteor Storm was boring because it didn't really have anything special except having something fall to the ground.

GroupUtils was a suggestion as it provides one global group to be used by all spells and that GroupEnumUnitsInArea.

The spells will destroy every destructable that isnt invulnerable so I cannot use a tree filter...
This was sort of opinionated, but I don't think someone will want to list all the destructables' id they use in DestructablesInvul just to prevent a spell from destroying them. Since the spell also uses the TREE boolean, I was thinking that you want the spell to kill trees instead.

damage changes per level and you can also set how much damage per level it deals. For the AOE, I'll add it...
The problem with that is what if someone wanted to scale the spell's damage to 35 at Level 1 and 50 at Level 2? Just having one variable won't solve that. You can either use a private constant function or add another global variable that would account for each level. (Like DAMAGE_LVL_BONUS)
 
@ The_Reborn_Devil: thanks sir!

-The meteors can fall faster, you can change it via the configs
-About making the meteors fall to a certain direction, I'm thinking about it for some time now, I'll try if I can make it... (I just need to tilt them and then create them somewhere to the side of the place where they would fall right?)

-For aqua crush, I really intended it to cause damage when the waves converges...

thanks again!
 
Top