cr4xzZz
Also known as azwraith_ftL.
- Reaction score
- 51
Summer Storm
A spell from my map - Mini Ashenvale Arena.
GUI/JASS/vJASS? vJASS.
MUI? Yes.
Leakless? Yes.
Lagless? Yes.
Follows JESP? It should.
Requires?
- ABCT v2.0
- JASS NewGen Pack v1.5a
Description:
Creates a violent summer storm at a target location, causing lightning bolts to fall from the sky, purging and damaging all nearby enemies upon impact. Damaging, AoE of the ability and AoE of the lightning bolts increases per level, as well as the frequency of the bolts and the chance to purge.
Code:
JASS:
scope SummerStorm
//===========================================================================
// Summer Storm by cr4xzZz (also known as azwraith_ftL)
// Date: August 04, 2008
// Version: 1[1].1
//===========================================================================
// C O N F I G U R A T I O N M E N U
//===========================================================================
globals
// Raw code of the Summer Storm ability.
private constant integer AID_SUMMER_STORM = 039;A000039;
// Raw code of the Purge ability (the custom created one).
private constant integer AID_PURGE = 039;A001039;
// Raw code of the [Dummy] Cloud unit.
private constant integer UID_CLOUD = 039;u000039;
// Raw code of the Dummy Unit.
private constant integer UID_DUMMY = 039;u001039;
// Ability string for casting the purge ability
private constant string SID_PURGE = "purge"
// Lightning bolt special effect.
private constant string SFX_BOLT = "Abilities\\Spells\\Other\\Monsoon\\MonsoonBoltTarget.mdl"
// Thunder clap (for impact) special effect.
private constant string SFX_IMPACT = "Abilities\\Spells\\Human\\ThunderClap\\ThunderClapCaster.mdl"
// The Moonsoon ability effect (rain and fog)
private constant string SFX_EFFECT = "Abilities\\Spells\\Other\\Monsoon\\MonsoonRain.mdl"
endglobals
// I have included the caster below because someone might want to base values on his attributes.
// Duration of the ability.
private function DURATION takes unit cast, integer lvl returns real
return 10. + (5. * lvl)
endfunction
// Period between lightning bolt impacts.
private function PERIOD takes unit cast, integer lvl returns real
return 0.9 - (0.1 * lvl)
endfunction
// Damage of each lightning bolt.
private function DAMAGE takes unit cast, integer lvl returns real
return 20. * lvl
endfunction
// Attack type of the damaging.
private function ATTACKTYPE takes unit cast, integer lvl returns attacktype
return ATTACK_TYPE_MAGIC
endfunction
// Damage type of the damaging.
private function DAMAGETYPE takes unit cast, integer lvl returns damagetype
return DAMAGE_TYPE_MAGIC
endfunction
// Chance to cast Purge on units hit by a bolt.
private function CHANCE takes unit cast, integer lvl returns real
// Make sure it's in range of 1-100 !
return 20. * lvl
endfunction
// Area of effect of the spell.
private function SPELL_AOE takes unit cast, integer lvl returns real
return 300. + (25. * lvl)
endfunction
// Area of effect of each bolt.
private function BOLT_AOE takes unit cast, integer lvl returns real
return 60. + (40. * lvl)
endfunction
//===========================================================================
// E N D O F C O N F I G U R A T I O N M E N U
//===========================================================================
private struct Data
unit cast
unit cloud
integer lvl
location targ
effect rain
endstruct
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == AID_SUMMER_STORM
endfunction
//===========================================================================
// Don't know who the creator of this snippet is.
// Anyway, he gets credits...
private function RandomPointCircle takes real x, real y, real d returns location
local real xadd
set d = d * SquareRoot(GetRandomReal(0, 1))
set xadd= d * Cos(GetRandomReal(0, 2) * bj_PI)
return Location(x + xadd, y + SquareRoot(d * d - xadd * xadd))
endfunction
//===========================================================================
private function Enum takes nothing returns boolean
return IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) == false and IsUnitType(GetFilterUnit(), UNIT_TYPE_DEAD) == false
endfunction
private function Callback takes nothing returns boolean
local Data d = ABCT_GetData()
local location loc = RandomPointCircle(GetLocationX(d.targ), GetLocationY(d.targ), SPELL_AOE(d.cast, d.lvl))
local group gr = CreateGroup()
local integer chance = GetRandomInt(1, 100)
local unit first
call DestroyEffect(AddSpecialEffectLoc(SFX_BOLT, loc))
call DestroyEffect(AddSpecialEffectLoc(SFX_IMPACT, loc))
call GroupEnumUnitsInRangeOfLoc(gr, loc, BOLT_AOE(d.cast, d.lvl), Condition(function Enum))
loop
set first = FirstOfGroup(gr)
exitwhen first == null
if IsUnitEnemy(first, GetOwningPlayer(d.cast)) then
call UnitDamageTarget(d.cast, first, DAMAGE(d.cast, d.lvl), true, true, ATTACKTYPE(d.cast, d.lvl), DAMAGETYPE(d.cast, d.lvl), null)
if chance <= CHANCE(d.cast, d.lvl) then
set bj_lastCreatedUnit = CreateUnit(GetOwningPlayer(d.cast), UID_DUMMY, 0., 0., 0.)
call UnitAddAbility(bj_lastCreatedUnit, AID_PURGE)
call SetUnitAbilityLevel(bj_lastCreatedUnit, AID_PURGE, d.lvl)
call IssueTargetOrder(bj_lastCreatedUnit, SID_PURGE, first)
call UnitApplyTimedLife(bj_lastCreatedUnit, 039;BTLF039;, 1.)
endif
endif
call GroupRemoveUnit(gr, first)
endloop
call DestroyGroup(gr)
call RemoveLocation(loc)
set first = null
set gr = null
set loc = null
if GetWidgetLife(d.cloud) < 0.405 then
call DestroyEffect(d.rain)
call RemoveLocation(d.targ)
call d.destroy()
return true
endif
return false
endfunction
private function Actions takes nothing returns nothing
local Data d = Data.create()
set d.cast = GetTriggerUnit()
set d.targ = GetSpellTargetLoc()
set d.cloud = CreateUnitAtLoc(GetOwningPlayer(d.cast), UID_CLOUD, d.targ, GetUnitFacing(d.cast))
set d.rain = AddSpecialEffectLoc(SFX_EFFECT, d.targ)
set d.lvl = GetUnitAbilityLevel(d.cast, AID_SUMMER_STORM)
call UnitApplyTimedLife(d.cloud, 039;BTLF039;, DURATION(d.cast, d.lvl))
call ABCT_Start(function Callback, d, PERIOD(d.cast, d.lvl))
endfunction
function InitTrig_SummerStorm takes nothing returns nothing
local trigger trig = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(trig, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(trig, Condition(function Conditions))
call TriggerAddAction(trig, function Actions)
call Preload(SFX_BOLT)
call Preload(SFX_IMPACT)
call Preload(SFX_EFFECT)
endfunction
endscope
Screenshot:
Changes:
JASS:
v1.0 - Release
v1.1 - Effects are now properly preloaded. Added a string for the spell that is casted. Variables now have better names.. (were "omg", "wtf", etc.)
Credits to Cohadar for ABCT and Tinki3 for the Test Map Template.