| 02-06-2009, 02:17 AM | #1 |
Deadeye Spell Pack (Hero Contest #3) Background: This is a spell pack I made for an entry in the 3rd WC3C Hero Contest. The skills were designed for use in the melee environment and some of them have some object editor dependencies. Other than those requirements, the spells can easily be ported to any map individually or as a group for use in your maps. The skills were also designed with the Deadeye Model, by Jigrael, in mind. BoundSentinel technically isn't required for any of the abilities to work, but it is used with the skills at my recommendation. Requirements:
Spells: Barrage://****************************************************************************** //* * //* Barrage * //* v1.02 * //* * //* By: Rising_Dusk * //* * //****************************************************************************** //************************************** //* LIBRARY REQUIREMENTS: //* - GroupUtils //* scope Barrage initializer Init globals //************************************************************* //* Configuration Constants //* Raw codes private constant integer SPELL_ID = 'A000' private constant integer DUMMY_ID = 'h000' //* System related private constant real TIMER_INTERVAL = 0.04 //* Movement constants private constant real AOE_BUFFER = 30. private constant real RANGE_THRESHOLD_SQUARED = 2025. //* Dummy unit configuration private constant real DUMMY_MOVE_SPEED = 900. private constant real DUMMY_UNIT_HEIGHT = 65. //* Damage properties private constant attacktype ATTACK_TYPE = ATTACK_TYPE_NORMAL private constant damagetype DAMAGE_TYPE = DAMAGE_TYPE_UNIVERSAL //* Offsets for the starting point of the projectiles private constant real X_OFFSET = -15. private constant real Y_OFFSET = 40. //* Effect placement private constant string EFFECT_POINT = "origin" //************************************************************* //* System Variables private timer MoveTimer = CreateTimer() private boolean ToStart = false private boolexpr Checker = null private player TempPlayer = null private integer Counter = 0 private integer array Arrows private trigger Trg = CreateTrigger() private constant integer SPELL_TARGET = 1 private constant integer SPELL_POINT = 2 endglobals //***************************************************************** //* Configuration Functions private constant function Damage takes integer lvl returns real //* Spell Damage return 7.5*lvl*lvl + 32.5*lvl + 35. endfunction private constant function AreaOfEffect takes integer lvl returns real //* Spell Area of Effect Radius return 160.+40.*lvl endfunction private constant function Targets takes integer lvl returns integer //* Number of targets to acquire return lvl+2 endfunction private function Check takes nothing returns boolean //* The boolexpr for striking a unit return IsUnitEnemy(GetFilterUnit(), TempPlayer) and IsUnitType(GetFilterUnit(), UNIT_TYPE_GROUND) and not IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) and GetWidgetLife(GetFilterUnit()) > 0.405 and not IsUnitSpellResistant(GetFilterUnit()) and GetUnitAbilityLevel(GetFilterUnit(), 'Avul') <= 0. endfunction //***************************************************************** private struct arrow integer Flag = 0 integer Level = 0 unit Source = null unit Target = null unit Dummy = null effect Fx = null real Angle = 0. real x = 0. real y = 0. static method create takes unit u, unit t, real xi, real yi, real xf, real yf, integer flag, integer lvl, real angle returns arrow local arrow a = arrow.allocate() set a.Source = u set a.Target = t set a.Dummy = CreateUnit(GetOwningPlayer(u), DUMMY_ID, xi, yi, angle*bj_RADTODEG) set a.Level = lvl set a.Flag = flag set a.Angle = angle set a.Fx = AddSpellEffectTargetById(SPELL_ID, EFFECT_TYPE_MISSILE, a.Dummy, "origin") call SetUnitX(a.Dummy, xi) call SetUnitY(a.Dummy, yi) if IsUnitType(a.Dummy, UNIT_TYPE_GROUND) then call UnitAddAbility(a.Dummy, 'Amrf') call UnitRemoveAbility(a.Dummy, 'Amrf') endif call SetUnitFlyHeight(a.Dummy, DUMMY_UNIT_HEIGHT, 0.) if flag == SPELL_POINT then set a.x = xf set a.y = yf else set a.x = GetUnitX(t) set a.y = GetUnitY(t) endif return a endmethod private method onDestroy takes nothing returns nothing //* Clean up all effects call DestroyEffect(this.Fx) if this.Flag == 1 then call DestroyEffect(AddSpellEffectTargetById(SPELL_ID, EFFECT_TYPE_TARGET, this.Target, EFFECT_POINT)) else call DestroyEffect(AddSpellEffectById(SPELL_ID, EFFECT_TYPE_TARGET, this.x, this.y)) endif call KillUnit(this.Dummy) endmethod endstruct private function Conditions takes nothing returns boolean return GetSpellAbilityId() == SPELL_ID endfunction private function Callback takes nothing returns nothing local unit u = null local unit d = null local unit t = null local arrow a = 0 local integer i = Counter - 1 local integer j = 0 local integer lvl = 0 local real xi = 0. local real yi = 0. local real xf = 0. local real yf = 0. local real di = 0. local real an = 0. //* Loop through all arrow instances and do effects loop exitwhen i < 0 set a = Arrows[i] set u = a.Source set t = a.Target set d = a.Dummy set lvl = a.Level set xi = GetUnitX(d) set yi = GetUnitY(d) if a.Flag == SPELL_TARGET then //* Update position/angle to track the enemy unit set a.x = GetUnitX(t) set a.y = GetUnitY(t) set a.Angle = Atan2(a.y-yi, a.x-xi) call SetUnitFacing(d, a.Angle*bj_RADTODEG) endif set di = (a.x-xi)*(a.x-xi)+(a.y-yi)*(a.y-yi) if di <= RANGE_THRESHOLD_SQUARED then //* Finished, deal damage if SPELL_TARGET if a.Flag == SPELL_TARGET then call UnitDamageTarget(u, t, Damage(lvl), false, false, ATTACK_TYPE, DAMAGE_TYPE, null) endif call a.destroy() set Counter = Counter - 1 if Counter < 0 then call PauseTimer(MoveTimer) set Counter = 0 else set Arrows[i] = Arrows[Counter] endif else //* Not finished, move forward in space and time set di = DUMMY_MOVE_SPEED*TIMER_INTERVAL set xf = xi + di*Cos(a.Angle) set yf = yi + di*Sin(a.Angle) call SetUnitX(d, xf) call SetUnitY(d, yf) endif set i = i - 1 endloop set u = null set d = null set t = null endfunction private function Actions takes nothing returns nothing local unit u = GetTriggerUnit() local unit s = null local location l = GetSpellTargetLoc() local integer lvl = GetUnitAbilityLevel(u, SPELL_ID) local integer c = 0 local integer o = Counter local integer m = Targets(lvl) local arrow a = 0 local real xi = GetUnitX(u) local real yi = GetUnitY(u) local real xf = GetLocationX(l) local real yf = GetLocationY(l) local real di = 0. local real ag = Atan2(yf-yi, xf-xi) local real x = 0. local real y = 0. local real an = 0. //* Move the starting point based on constant offsets if X_OFFSET != 0. then //* X offset set an = ag-bj_PI/2 set xi = xi + X_OFFSET*Cos(an) set yi = yi + X_OFFSET*Sin(an) endif if Y_OFFSET != 0. then //* Y offset set an = ag set xi = xi + Y_OFFSET*Cos(an) set yi = yi + Y_OFFSET*Sin(an) endif set TempPlayer = GetOwningPlayer(u) call GroupEnumUnitsInRange(ENUM_GROUP, xf, yf, AreaOfEffect(lvl), Checker) //* Create up to Targets(lvl) number of arrows loop //* Pick a randomly selected unit in the group set bj_groupRandomConsidered = 0 set bj_groupRandomCurrentPick = null call ForGroup(ENUM_GROUP, function GroupPickRandomUnitEnum) set s = bj_groupRandomCurrentPick exitwhen s == null or c >= m set an = Atan2(GetUnitY(s)-yi, GetUnitX(s)-xi) set a = arrow.create(u, s, xi, yi, 0., 0., SPELL_TARGET, lvl, an) set Arrows[Counter] = integer(a) set Counter = Counter + 1 call GroupRemoveUnit(ENUM_GROUP, s) set c = c + 1 endloop //* Create the leftover arrows as random effects so the spell isn't ugly if c < m then loop exitwhen c >= m set di = GetRandomReal(AOE_BUFFER*2, AreaOfEffect(lvl)-AOE_BUFFER) set ag = GetRandomReal(0, 2*bj_PI) set x = xf + di*Cos(ag) set y = yf + di*Sin(ag) set an = Atan2(y-yi, x-xi) set a = arrow.create(u, null, xi, yi, x, y, SPELL_POINT, lvl, an) set Arrows[Counter] = integer(a) set Counter = Counter + 1 set c = c + 1 endloop endif if o == 0 then call TimerStart(MoveTimer, TIMER_INTERVAL, true, function Callback) endif call GroupClear(ENUM_GROUP) call RemoveLocation(l) set l = null set u = null set s = null endfunction private function Init takes nothing returns nothing call TriggerAddAction(Trg, function Actions) call TriggerAddCondition(Trg, Condition(function Conditions)) call TriggerRegisterAnyUnitEventBJ(Trg, EVENT_PLAYER_UNIT_SPELL_EFFECT) set Checker = Condition(function Check) endfunction endscope Rickets://****************************************************************************** //* * //* Rickets * //* v1.02 * //* * //* By: Rising_Dusk * //* * //****************************************************************************** //************************************** //* LIBRARY REQUIREMENTS: //* - UnitIndexingUtils //* scope Rickets initializer Init globals //************************************************************* //* Configuration Constants //* Raw codes private constant integer SPELL_ID = 'A003' private constant integer ARMOR_ID = 'A002' private constant integer BUFFABIL_ID = 'A004' private constant integer BUFF_ID = 'B000' //* System related private constant real SCAN_INTERVAL = 0.1 //************************************************************* //* System Variables private group TargGroup = CreateGroup() private timer ScanTimer = CreateTimer() private real array Duration private integer array Level private trigger Trg = CreateTrigger() endglobals //***************************************************************** //* Configuration Functions private constant function UnitSpellDuration takes integer lvl returns real //* Unit spell duration return 16. endfunction private constant function HeroSpellDuration takes integer lvl returns real //* Hero spell duration return 8. endfunction private function EndConditions takes unit u, integer lvl returns boolean //* Conditions that bring about the spell's end //* Returns false if conditions not met return GetWidgetLife(u) < 0.405 endfunction //***************************************************************** private function Conditions takes nothing returns boolean return GetSpellAbilityId() == SPELL_ID endfunction private function Enumeration takes nothing returns nothing local unit e = GetEnumUnit() local integer id = GetUnitId(e) //* Decrement duration remaining set Duration[id] = Duration[id] - SCAN_INTERVAL //* Check duration and do stuff if spell is over if EndConditions(e, Level[id]) or Duration[id] <= 0. then call UnitRemoveAbility(e, ARMOR_ID) call UnitRemoveAbility(e, BUFFABIL_ID) call UnitRemoveAbility(e, BUFF_ID) call GroupRemoveUnit(TargGroup, e) endif set e = null endfunction private function Callback takes nothing returns nothing call ForGroup(TargGroup, function Enumeration) if FirstOfGroup(TargGroup) == null then call PauseTimer(ScanTimer) endif endfunction private function Actions takes nothing returns nothing local unit u = GetTriggerUnit() local unit t = GetSpellTargetUnit() local integer lvl = GetUnitAbilityLevel(u, SPELL_ID) local integer id = GetUnitId(t) if GetUnitAbilityLevel(t, BUFF_ID) <= 0 then //* Do actions on units without the buff call UnitAddAbility(t, ARMOR_ID) call UnitAddAbility(t, BUFFABIL_ID) call SetUnitAbilityLevel(t, ARMOR_ID, lvl) call SetUnitAbilityLevel(t, BUFFABIL_ID, lvl) if FirstOfGroup(TargGroup) == null then call TimerStart(ScanTimer, SCAN_INTERVAL, true, function Callback) endif call GroupAddUnit(TargGroup, t) endif //* Adjust duration of buff regardless if the unit had it before or not if IsUnitType(t, UNIT_TYPE_HERO) then set Duration[id] = HeroSpellDuration(lvl) else set Duration[id] = UnitSpellDuration(lvl) endif set Level[id] = lvl set u = null set t = null endfunction private function Init takes nothing returns nothing call TriggerAddAction(Trg, function Actions) call TriggerAddCondition(Trg, Condition(function Conditions)) call TriggerRegisterAnyUnitEventBJ(Trg, EVENT_PLAYER_UNIT_SPELL_EFFECT) endfunction endscope Graverobber://****************************************************************************** //* * //* Graverobber * //* v1.02 * //* * //* By: Rising_Dusk * //* * //****************************************************************************** //************************************** //* LIBRARY REQUIREMENTS: //* - GroupUtils //* scope Graverobber initializer Init globals //************************************************************* //* Configuration Constants //* Raw codes private constant integer SPELL_ID = 'A001' private constant integer INVIS_ID = 'Apiv' //* System related private constant real TIMER_INTERVAL = 0.05 //************************************************************* //* System Variables private timer CheckTimer = CreateTimer() private group CasterGroup = CreateGroup() private boolexpr Checker = null private trigger Trg = CreateTrigger() endglobals //***************************************************************** //* Configuration Functions private constant function AreaOfEffect takes integer lvl returns real //* Spell Area of Effect Radius return 450. endfunction private constant function Corpses takes integer lvl returns integer //* Number of corpses necessary return 4-lvl endfunction private function Check takes nothing returns boolean //* The boolexpr for finding a corpse return GetUnitTypeId(GetFilterUnit()) != 0 and IsUnitType(GetFilterUnit(), UNIT_TYPE_GROUND) and not IsUnitType(GetFilterUnit(), UNIT_TYPE_SUMMONED) and not IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) and GetWidgetLife(GetFilterUnit()) <= 0.405 endfunction //***************************************************************** private function Conditions takes nothing returns boolean return GetLearnedSkill() == SPELL_ID endfunction private function Enumeration takes nothing returns nothing local unit e = GetEnumUnit() local unit s = null local integer lvl = GetUnitAbilityLevel(e, SPELL_ID) local real x = GetUnitX(e) local real y = GetUnitY(e) //* Loop through all corpses to count them if GetWidgetLife(e) > 0.405 then set bj_groupCountUnits = 0 call GroupEnumUnitsInRange(ENUM_GROUP, x, y, AreaOfEffect(lvl), Checker) call ForGroup(ENUM_GROUP, function CountUnitsInGroupEnum) if bj_groupCountUnits >= Corpses(lvl) and GetUnitAbilityLevel(e, INVIS_ID) <= 0 then call UnitAddAbility(e, INVIS_ID) elseif bj_groupCountUnits < Corpses(lvl) and GetUnitAbilityLevel(e, INVIS_ID) > 0 then call UnitRemoveAbility(e, INVIS_ID) endif endif call GroupClear(ENUM_GROUP) set e = null set s = null endfunction private function Callback takes nothing returns nothing call ForGroup(CasterGroup, function Enumeration) endfunction private function Actions takes nothing returns nothing local unit u = GetTriggerUnit() if FirstOfGroup(CasterGroup) == null then call TimerStart(CheckTimer, TIMER_INTERVAL, true, function Callback) endif call GroupAddUnit(CasterGroup, u) set u = null endfunction private function Init takes nothing returns nothing call TriggerAddAction(Trg, function Actions) call TriggerAddCondition(Trg, Condition(function Conditions)) call TriggerRegisterAnyUnitEventBJ(Trg, EVENT_PLAYER_HERO_SKILL) set Checker = Condition(function Check) endfunction endscope Quench Life://****************************************************************************** //* * //* Quench Life * //* v1.02 * //* * //* By: Rising_Dusk * //* * //****************************************************************************** //************************************** //* LIBRARY REQUIREMENTS: //* - GroupUtils //* - UnitIndexingUtils //* scope QuenchLife initializer Init globals //************************************************************* //* Configuration Constants //* Raw codes private constant integer SPELL_ID = 'A005' private constant integer DUMMY_ID = 'h000' private constant string ORDER_STRING = "starfall" //* Lightning related private constant integer LIGHTNING_COUNT = 6 private constant integer LIGHTNING_TO_GO_LEFT = 3 private constant string LIGHTNING_TYPE = "DRAL" private constant real LIGHTNING_Z_OFFSET = 450. private constant real LIGHTNING_ANGLE_OFFSET = 2*bj_PI/3 private constant real LIGHTNING_ANGLE_SHIFT = bj_PI/40 //* Spell related private constant real AREA_OF_EFFECT = 600. //* Damage properties private constant attacktype ATTACK_TYPE = ATTACK_TYPE_NORMAL private constant damagetype DAMAGE_TYPE = DAMAGE_TYPE_UNIVERSAL //* System related private constant real TIMER_INTERVAL = 0.10 private constant integer ITERATIONS_TIL_EFFECT = 5 //* Effect placement private constant string EFFECT_POINT = "origin" //************************************************************* //* System Variables private group CastGroup = CreateGroup() private timer ScanTimer = CreateTimer() private player TempPlayer = null private boolexpr HealChecker = null private boolexpr DamageChecker = null private integer array Glowies private trigger Trg = CreateTrigger() endglobals //***************************************************************** //* Configuration Functions private constant function LifeStolen takes integer lvl returns real //* Life stolen per second return 20. endfunction private function EndConditions takes unit u, integer lvl returns boolean //* Conditions that bring about the spell's end //* Returns false if conditions not met return GetUnitCurrentOrder(u) != OrderId(ORDER_STRING) endfunction private function DamageCheck takes nothing returns boolean //* Boolean expression for which units to damage return IsUnitEnemy(GetFilterUnit(), TempPlayer) and not IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) and GetWidgetLife(GetFilterUnit()) > 0.405 and GetUnitAbilityLevel(GetFilterUnit(), 'Avul') <= 0. endfunction private function HealCheck takes nothing returns boolean //* Boolean expression for which units to heal return IsUnitAlly(GetFilterUnit(), TempPlayer) and not IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) and GetWidgetLife(GetFilterUnit()) > 0.405 and GetUnitAbilityLevel(GetFilterUnit(), 'Avul') <= 0. endfunction //***************************************************************** private struct glowyhax lightning array orbital[4] integer level = 0 integer index = 0 unit attach = null real angle1 = 0. real angle2 = 0. static method create takes unit u returns glowyhax local glowyhax g = glowyhax.allocate() local integer i = 1 local real x = GetUnitX(u) local real y = GetUnitY(u) set g.attach = CreateUnit(GetOwningPlayer(u), DUMMY_ID, x, y, 0.) set g.level = GetUnitAbilityLevel(u, SPELL_ID) set g.angle1 = GetUnitFacing(u)*bj_DEGTORAD set g.angle2 = g.angle1 + bj_PI/2 if IsUnitType(g.attach, UNIT_TYPE_GROUND) then call UnitAddAbility(g.attach, 'Amrf') call UnitRemoveAbility(g.attach, 'Amrf') endif call SetUnitFlyHeight(g.attach, LIGHTNING_Z_OFFSET, 0.) call PauseUnit(g.attach, true) call SetUnitX(g.attach, x) call SetUnitY(g.attach, y) loop exitwhen i > LIGHTNING_COUNT set g.orbital[i] = null set i = i + 1 endloop return g endmethod private method onDestroy takes nothing returns nothing local integer i = 1 //* Clean up all lightning effects loop exitwhen i > LIGHTNING_COUNT call DestroyLightning(this.orbital[i]) set i = i + 1 endloop call KillUnit(this.attach) endmethod endstruct private function Conditions takes nothing returns boolean return GetSpellAbilityId() == SPELL_ID endfunction private function Enumeration takes nothing returns nothing local unit e = GetEnumUnit() local unit s = null local integer id = GetUnitId(e) local glowyhax g = Glowies[id] local integer lvl = g.level local integer i = 1 local location l = GetUnitLoc(e) local real dmg = LifeStolen(lvl) local real xi = GetLocationX(l) local real yi = GetLocationY(l) local real zi = GetLocationZ(l) local real xf = 0. local real yf = 0. local real zf = 0. local real a = g.angle1 local real r = 0. //* Do stuff for the channeled ability's visual call RemoveLocation(l) loop exitwhen i > LIGHTNING_COUNT //* Do some projections set xf = xi + AREA_OF_EFFECT*Cos(a) set yf = yi + AREA_OF_EFFECT*Sin(a) set l = Location(xf, yf) set zf = GetLocationZ(l) call RemoveLocation(l) //* Move the lightning effect if g.orbital[i] != null then call MoveLightningEx(g.orbital[i], true, xi, yi, LIGHTNING_Z_OFFSET+zi, xf, yf, zf) else set g.orbital[i] = AddLightningEx(LIGHTNING_TYPE, true, xi, yi, LIGHTNING_Z_OFFSET+zi, xf, yf, zf) endif call DestroyEffect(AddSpellEffectTargetById(SPELL_ID, EFFECT_TYPE_EFFECT, g.attach, "origin")) call DestroyEffect(AddSpellEffectById(SPELL_ID, EFFECT_TYPE_EFFECT, xf, yf)) //* Update the angle of the rotation properly if i < LIGHTNING_TO_GO_LEFT then set a = a - LIGHTNING_ANGLE_OFFSET elseif i == LIGHTNING_TO_GO_LEFT then set a = g.angle2 elseif i > LIGHTNING_TO_GO_LEFT then set a = a + LIGHTNING_ANGLE_OFFSET endif set i = i + 1 endloop set g.angle1 = g.angle1 + LIGHTNING_ANGLE_SHIFT set g.angle2 = g.angle2 - LIGHTNING_ANGLE_SHIFT set g.index = g.index + 1 //* Don't forget to have the ability actually do something useful set TempPlayer = GetOwningPlayer(e) call GroupEnumUnitsInRange(ENUM_GROUP, xi, yi, AREA_OF_EFFECT, DamageChecker) loop set s = FirstOfGroup(ENUM_GROUP) exitwhen s == null if ModuloInteger(g.index, ITERATIONS_TIL_EFFECT) == 0 then call DestroyEffect(AddSpellEffectTargetById(SPELL_ID, EFFECT_TYPE_TARGET, s, EFFECT_POINT)) endif call UnitDamageTarget(e, s, dmg*TIMER_INTERVAL, false, false, ATTACK_TYPE, DAMAGE_TYPE, null) set r = r + dmg*TIMER_INTERVAL call GroupRemoveUnit(ENUM_GROUP, s) endloop //* Now distribute the life evenly to allies call GroupEnumUnitsInRange(ENUM_GROUP, xi, yi, AREA_OF_EFFECT, HealChecker) if FirstOfGroup(ENUM_GROUP) != null and r > 0. then //* Make sure no divide by zero or bad stuff set bj_groupCountUnits = 0 call ForGroup(ENUM_GROUP, function CountUnitsInGroupEnum) set r = r / bj_groupCountUnits loop set s = FirstOfGroup(ENUM_GROUP) exitwhen s == null if ModuloInteger(g.index, ITERATIONS_TIL_EFFECT) == 0 then call DestroyEffect(AddSpellEffectTargetById(SPELL_ID, EFFECT_TYPE_SPECIAL, s, EFFECT_POINT)) endif call SetWidgetLife(s, GetWidgetLife(s) + dmg) call GroupRemoveUnit(ENUM_GROUP, s) endloop endif //* Check duration and do stuff if spell is over if EndConditions(e, lvl) then call GroupRemoveUnit(CastGroup, e) call g.destroy() endif call GroupClear(ENUM_GROUP) set e = null set s = null set l = null endfunction private function Callback takes nothing returns nothing call ForGroup(CastGroup, function Enumeration) if FirstOfGroup(CastGroup) == null then call PauseTimer(ScanTimer) endif endfunction private function Actions takes nothing returns nothing local unit u = GetTriggerUnit() local integer id = GetUnitId(u) local glowyhax g = glowyhax.create(u) //* Load caster to group for enumeration if FirstOfGroup(CastGroup) == null then call TimerStart(ScanTimer, TIMER_INTERVAL, true, function Callback) endif call GroupAddUnit(CastGroup, u) set Glowies[id] = g set u = null endfunction private function Init takes nothing returns nothing call TriggerAddAction(Trg, function Actions) call TriggerAddCondition(Trg, Condition(function Conditions)) call TriggerRegisterAnyUnitEventBJ(Trg, EVENT_PLAYER_UNIT_SPELL_EFFECT) set DamageChecker = Condition(function DamageCheck) set HealChecker = Condition(function HealCheck) endfunction endscope |
| 02-06-2009, 02:45 AM | #2 |
Oh cool; I didn't know one could submit spell packs like this... Well, while I'm no authority, sure looks nice. Also, I like the in-game icon alternatives. :P P.S. Weren't you going to rename "Barrage" to "Volley", due to the conflict with the Human Siege Engine ability of the same name? |
| 02-06-2009, 03:04 AM | #3 |
Yeah, but I figure it's in good spirits that I keep the spell pack submission in tune with what I submitted as the hero. That it's submitted now no longer places the requirement upon it to be a melee hero, so technically it's no problem at all. |
| 02-06-2009, 03:51 AM | #4 |
^Good point(s). Hey, shouldn't it say "Active" Cast, instead of "Actively Cast"? |
| 02-06-2009, 04:03 AM | #5 |
The spell is cast actively. Actively is functioning as an adverb in this case. |
| 02-06-2009, 04:11 AM | #6 |
Oh. Guess I'm just used to using one-word adjectives. |
| 02-06-2009, 04:50 AM | #7 |
Did I say something wrong? I'm pretty sure that what I said was grammatically correct.. |
| 02-06-2009, 09:41 AM | #8 |
Can I submit an entry with this model (with Undead ranger theme) too? |
| 02-06-2009, 12:20 PM | #9 | ||
Quote:
Quote:
|
| 02-06-2009, 01:00 PM | #10 |
ZZZ I JUST READ THE CONTEST THREAD AND ITS ALREADY OVER!!! p.s. i did have my own spells in mind but a hassle was that spell,throw and spell,slam were not valid animation tags as the tags were appropriated as Spell - Throw and Spell - Slam. such tags work like "Attack -" and "Stand -" tags so they cannot be made more specific in the Object Editor :c how did you specify animations, then? |
| 02-06-2009, 02:15 PM | #11 | |
Quote:
|
| 02-06-2009, 10:17 PM | #12 |
Just read the description of Rickets and wondered, why does this require any jass, it can be all done with a simple ability based on acid bomb, ...or is there anything special about it ?! and what does the RANGE_THRESHOLD_SQUARED constant for barrage specify ? or the ITERATIONS_TIL_EFFECT of Quench Life ? |
| 02-06-2009, 10:40 PM | #13 | |||
Quote:
Quote:
Quote:
|
| 02-06-2009, 11:34 PM | #14 | |
Quote:
*dreads the answer* |
| 02-06-2009, 11:38 PM | #15 | |
Quote:
|
