Хоть и не успел сделать на конкурс, но решил немного поиграться и сделать Исазама.
Способности
[Пассивно] - Ужас
Когда Исазам атакует он получает заряд Ужаса. Атака, после накопления 20 зарядов, лишит противников в 300 АоЕ возможности атаковать и использовать способности на 1,5 секунды.
Код
library Horror requires MemoryHackDamageEventHook, EcstasyOfHorror
function AddHorrorEffect takes nothing returns nothing
if IsazamHorror >= 20 then
set IsazamHorrorEffect = AddSpecialEffectTarget("Burning Rage Red.mdl", Isazam, "overhead")
endif
endfunction
function Damaged_Handler takes unit source, unit target, real dmg returns nothing
local integer evnt = GetDamageEventESPData()
local integer data = ReadRealMemory(evnt + 0x00)
local real init_dmg = CleanReal(IndexToReal(ReadRealMemory(evnt + 0x04)))
local integer flags = ReadRealMemory(data + 0x0C)
local integer atk_t = ReadRealMemory(data + 0x20)
local unit dummy
local group g
if GetUnitTypeId(source) == 'U005' and ( IsFlagBitSet( flags, 0x100 ) or IsFlagBitSet( flags, 0x101 ) ) and atk_t != 0 then // Ставим свой ID Исазама
if Isazam == null then
set Isazam = source
endif
if IsazamHorror < 20 then
set IsazamHorror = IsazamHorror + 1
call AddHorrorEffect()
else
set dummy = CreateUnit(GetOwningPlayer(Isazam), 'h000', GetUnitX(Isazam), GetUnitY(Isazam), 0)
call UnitAddAbility(dummy, 'A00C')
call IssuePointOrder(dummy, "silence", GetUnitX(Isazam), GetUnitY(Isazam))
call UnitApplyTimedLife(dummy, 'BTLF', 3.0)
set IsazamHorror = 0
call DestroyEffect(IsazamHorrorEffect)
set IsazamHorrorEffect = null
if GetUnitAbilityLevel(Isazam, 'A001') > 0 then
set g = CreateGroup()
call GroupEnumUnitsInRange(g, GetUnitX(Isazam), GetUnitY(Isazam), 300.0, function EcstasyOfHorror_Start)
call DestroyGroup(g)
endif
endif
endif
set dummy = null
set g = null
endfunction
function Damage_Event takes nothing returns nothing
call DisableTrigger( GetTriggeringTrigger( ) )
call Damaged_Handler( GetEventDamageSource( ), GetTriggerUnit( ), GetEventDamage( ) )
call EnableTrigger( GetTriggeringTrigger( ) )
endfunction
endlibrary
function InitTrig_Horror takes nothing returns nothing
local group gMain = CreateGroup()
local unit uTemp
local trigger trTemp = CreateTrigger()
if true then
call GroupEnumUnitsInRect( gMain, bj_mapInitialPlayableArea, null )
loop
set uTemp = FirstOfGroup( gMain )
exitwhen uTemp == null
call TriggerRegisterUnitEvent( trTemp, uTemp, EVENT_UNIT_DAMAGED )
call GroupRemoveUnit( gMain, uTemp )
endloop
call TriggerAddAction( trTemp, function Damage_Event )
endif
call DestroyGroup(gMain)
set gMain = null
set trTemp = null
endfunction
[Q] - Тёмная стая
После паузы в 1 секунду Исазам обращается в стаю летучих мышей, становясь неуязвимым, и движется в выбранную точку. Всем противникам на его пути наносится 200 - 600 урона, а сам Исазам получает 5 зарядов Ужаса.
Код
function CarroinSwarm_Move takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer id = GetHandleId(t)
local real time = LoadReal(H, id, 'time') - 0.02
local integer stop = LoadInteger(H, id, 'stop')
local unit caster = LoadUnitHandle(H, id, 'cast')
local unit casw = LoadUnitHandle(H, id, 'CaSw')
local real x0 = GetUnitX(casw)
local real y0 = GetUnitY(casw)
local real x1 = LoadReal(H, id, 'EndX')
local real y1 = LoadReal(H, id, 'EndY')
local real d = SquareRoot( (x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0) )
local real a = bj_RADTODEG * Atan2(y1 - y0, x1 - x0)
local group g = CreateGroup()
local unit target
local item test
if GetUnitCurrentOrder(caster) != OrderId("AImove") and time > 0.0 then
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(H, id)
call RemoveUnit(casw)
endif
call SaveReal(H, id, 'time', time)
if time == 0.0 then
call ShowUnit(casw, true)
call ShowUnit(caster, false)
call PauseUnit(caster, true)
call UnitRemoveAbility(casw, 'Aloc')
call UnitAddAbility(casw, 'Aloc')
endif
if time < 0.0 then
if d < 11.0 then
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(H, id)
call RemoveUnit(casw)
call ShowUnit(caster, true)
call PauseUnit(caster, false)
call SetUnitPosition(caster, x0, y0)
call SelectUnit(caster, true)
set IsazamHorror = IsazamHorror + 5
call AddHorrorEffect()
else
if stop == 0 then
call SetUnitX(casw, x0 + 10.0 * Cos(bj_DEGTORAD * a))
call SetUnitY(casw, y0 + 10.0 * Sin(bj_DEGTORAD * a))
call SetUnitFacing(casw, a)
else
set test = CreateItem('spsh', x0 + 10.0 * Cos(bj_DEGTORAD * a), y0 + 10.0 * Sin(bj_DEGTORAD * a))
call SetItemPosition(test, x0 + 10.0 * Cos(bj_DEGTORAD * a), y0 + 10.0 * Sin(bj_DEGTORAD * a))
if GetItemX(test) == x0 + 10.0 * Cos(bj_DEGTORAD * a) and GetItemY(test) == y0 + 10.0 * Sin(bj_DEGTORAD * a) then
call SetUnitX(casw, x0 + 10.0 * Cos(bj_DEGTORAD * a))
call SetUnitY(casw, y0 + 10.0 * Sin(bj_DEGTORAD * a))
else
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(H, id)
call RemoveUnit(casw)
call ShowUnit(caster, true)
call PauseUnit(caster, false)
call SetUnitPosition(caster, x0, y0)
call SelectUnit(caster, true)
set IsazamHorror = IsazamHorror + 5
call AddHorrorEffect()
endif
call RemoveItem(test)
endif
endif
endif
call SaveUnitHandle(H, 'Unit', 'Unit', caster)
call GroupEnumUnitsInRange(g, x0, y0, 100.0, function Enemy)
loop
set target = FirstOfGroup(g)
exitwhen target == null
call UnitDamageTarget(caster, target, 5.0 * GetUnitAbilityLevel(caster, 'A00B'), true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS )
call GroupRemoveUnit(g, target)
endloop
call GroupClear(g)
call DestroyGroup(g)
set t = null
set caster = null
set casw = null
set g = null
set target = null
set test = null
endfunction
function Trig_CarroinSwarm_Actions takes nothing returns nothing
local unit Caster = GetTriggerUnit()
local real x0 = GetUnitX(Caster)
local real y0 = GetUnitY(Caster)
local real x1 = GetSpellTargetX()
local real y1 = GetSpellTargetY()
local item test = CreateItem('spsh', x1, y1)
local unit CaSw = CreateUnit(GetOwningPlayer(Caster), 'u007', x0, y0, GetUnitFacing(Caster))
local timer t = CreateTimer()
local integer id = GetHandleId(t)
call SetItemPosition(test, x1, y1)
if GetItemX(test) == x1 and GetItemY(test) == y1 then
call SaveInteger(H, id, 'stop', 0)
else
call SaveInteger(H, id, 'stop', 1)
endif
if IsTerrainPathable(x1, y1, PATHING_TYPE_WALKABILITY) == true then
call SaveInteger(H, id, 'stop', 1)
endif
call ShowUnit(CaSw, false)
call TimerStart(t, 0.02, true, function CarroinSwarm_Move)
call SaveReal(H, id, 'time', 1.0)
call SaveUnitHandle(H, id, 'cast', Caster)
call SaveUnitHandle(H, id, 'CaSw', CaSw)
call SaveReal(H, id, 'EndX', x1)
call SaveReal(H, id, 'EndY', y1)
call RemoveItem(test)
set IsazamHorror = IsazamHorror + 5
set Caster = null
set test = null
set CaSw = null
set t = null
endfunction
function Trig_CarroinSwarm_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A00B'
endfunction
//===========================================================================
function InitTrig_CarroinSwarm takes nothing returns nothing
set gg_trg_CarroinSwarm = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_CarroinSwarm, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_CarroinSwarm, Condition( function Trig_CarroinSwarm_Conditions ) )
call TriggerAddAction( gg_trg_CarroinSwarm, function Trig_CarroinSwarm_Actions )
endfunction
[W] - Кромсание
Исазам наносит 2 - 6 быстрых ударов по противнику, каждый из которых наносит 75% урона от его силы атаки. Если Исазам имеет 20 зарядов Ужаса, то урон от удара увеличивается до 100%.
Код
((код
function Trig_Shredding_Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local unit target = GetSpellTargetUnit()
local integer L_count = 2 * GetUnitAbilityLevel(caster, 'A008')
local integer side = 1
local effect Shredding = null
call PauseUnit(target, true)
loop
call SetUnitAnimation(caster, "stand")
if side == 1 then
call DestroyEffect(Shredding)
set Shredding = AddSpecialEffectTarget("Reaper's Claws Red.mdl", caster, "chest")
call SetUnitAnimation(caster, "Attack - 1")
set side = 2
else
call DestroyEffect(Shredding)
set Shredding = AddSpecialEffectTarget("Reaper's Claws Red.mdl", caster, "chest")
call SetUnitAnimation(caster, "Attack - 2")
set side = 1
endif
set L_count = L_count - 1
if IsazamHorror > 20 then
call UnitDamageTarget(caster, target, (GetUnitBaseDamage(caster) + GetUnitBonusDamage(caster)) * 0.75 * 0.5, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
else
call UnitDamageTarget(caster, target, (GetUnitBaseDamage(caster) + GetUnitBonusDamage(caster)) * 0.75, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
endif
call TriggerSleepAction(0.550)
if IsDead(target) or IsDead(caster) or GetUnitCurrentOrder(caster) != OrderId("absorb") then
call IssueImmediateOrder(caster, "stop")
call PauseUnit(target, false)
set caster = null
set target = null
set Shredding = null
return
endif
exitwhen L_count == 0
endloop
call IssueImmediateOrder(caster, "stop")
call PauseUnit(target, false)
set caster = null
set target = null
set Shredding = null
endfunction
local unit caster = GetTriggerUnit()
local unit target = GetSpellTargetUnit()
local integer L_count = 2 * GetUnitAbilityLevel(caster, 'A008')
local integer side = 1
local effect Shredding = null
call PauseUnit(target, true)
loop
call SetUnitAnimation(caster, "stand")
if side == 1 then
call DestroyEffect(Shredding)
set Shredding = AddSpecialEffectTarget("Reaper's Claws Red.mdl", caster, "chest")
call SetUnitAnimation(caster, "Attack - 1")
set side = 2
else
call DestroyEffect(Shredding)
set Shredding = AddSpecialEffectTarget("Reaper's Claws Red.mdl", caster, "chest")
call SetUnitAnimation(caster, "Attack - 2")
set side = 1
endif
set L_count = L_count - 1
if IsazamHorror > 20 then
call UnitDamageTarget(caster, target, (GetUnitBaseDamage(caster) + GetUnitBonusDamage(caster)) * 0.75 * 0.5, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
else
call UnitDamageTarget(caster, target, (GetUnitBaseDamage(caster) + GetUnitBonusDamage(caster)) * 0.75, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
endif
call TriggerSleepAction(0.550)
if IsDead(target) or IsDead(caster) or GetUnitCurrentOrder(caster) != OrderId("absorb") then
call IssueImmediateOrder(caster, "stop")
call PauseUnit(target, false)
set caster = null
set target = null
set Shredding = null
return
endif
exitwhen L_count == 0
endloop
call IssueImmediateOrder(caster, "stop")
call PauseUnit(target, false)
set caster = null
set target = null
set Shredding = null
endfunction
function Trig_Shredding_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A008'
endfunction
return GetSpellAbilityId() == 'A008'
endfunction
===========================================================================
function InitTrig_Shredding takes nothing returns nothing
set gg_trg_Shredding = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Shredding, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Shredding, Condition( function Trig_Shredding_Conditions ) )
call TriggerAddAction( gg_trg_Shredding, function Trig_Shredding_Actions )
endfunction))
function InitTrig_Shredding takes nothing returns nothing
set gg_trg_Shredding = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Shredding, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Shredding, Condition( function Trig_Shredding_Conditions ) )
call TriggerAddAction( gg_trg_Shredding, function Trig_Shredding_Actions )
endfunction))
[E] - Упоение ужасом пассивно
После срабатывания Ужаса Исазам в течении трёх секунд высасывает из противников, охваченных ужасом, 50 - 150 здоровья.
Код
library EcstasyOfHorror requires SecondaryFunction
function EcstasyOfHorror_Timer takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer id = GetHandleId(t)
local unit target = LoadUnitHandle(H, id, 'targ')
local lightning EOH_Lightning = LoadLightningHandle(H, id, 'ligh')
local real time = LoadReal(H, id, 'time') - 0.02
call SaveReal(H, id, 'time', time)
call MoveLightningEx(EOH_Lightning, true, GetUnitX(Isazam), GetUnitY(Isazam), GetLocalZ(GetUnitX(Isazam), GetUnitY(Isazam)), GetUnitX(target), GetUnitY(target), GetLocalZ(GetUnitX(target), GetUnitY(target)))
call SetUnitState(Isazam, UNIT_STATE_LIFE, GetUnitState(Isazam, UNIT_STATE_LIFE) + (50.0 * GetUnitAbilityLevel(Isazam, 'A001')) / 150.0)
call SetUnitState(target, UNIT_STATE_LIFE, GetUnitState(target, UNIT_STATE_LIFE) - (50.0 * GetUnitAbilityLevel(Isazam, 'A001')) / 150.0)
if IsDead(target) or time < 0.0 or IsDead(Isazam) then
call PauseTimer(t)
call DestroyTimer(t)
call DestroyLightning(EOH_Lightning)
call FlushChildHashtable(H, id)
endif
set target = null
set EOH_Lightning = null
set t = null
endfunction
function EcstasyOfHorror_Start takes nothing returns nothing
local unit target = GetFilterUnit()
local lightning EOH_Lightning
local timer t
local integer id
if IsUnitEnemy(target, GetOwningPlayer(Isazam)) and not IsUnitType(target, UNIT_TYPE_MECHANICAL) and not IsUnitType(target, UNIT_TYPE_STRUCTURE) and not IsDead(target) then
set EOH_Lightning = AddLightningEx("AFOD", true, GetUnitX(Isazam), GetUnitY(Isazam), GetLocalZ(GetUnitX(Isazam), GetUnitY(Isazam)), GetUnitX(target), GetUnitY(target), GetLocalZ(GetUnitX(target), GetUnitY(target)))
set t = CreateTimer()
set id = GetHandleId(t)
call TimerStart(t, 0.02, true, function EcstasyOfHorror_Timer)
call SaveLightningHandle(H, id, 'ligh', EOH_Lightning)
call SaveUnitHandle(H, id, 'targ', target)
call SaveReal(H, id, 'time', 3.0)
endif
set target = null
set EOH_Lightning = null
set t = null
endfunction
endlibrary
[R] - Кошмар воплоти
Исазам становится недосягаемым на 10 секунд, а всех вражеских героев начинают атаковать кошмары, видимые только им и Исазаму. Кошмары наносят 50% от его силы атаки.
Код
function Nightmare_Timer takes nothing returns nothing
call PauseUnit(Isazam, false)
call SetUnitAnimation(Isazam, "Stand")
call ShowUnit(Isazam, true)
call DisplayCineFilter(false)
call SelectUnit(Isazam, true)
if (GetLocalPlayer() == GetOwningPlayer(Isazam)) then
call PanCameraToTimed(GetUnitX(Isazam), GetUnitY(Isazam), 0.00)
endif
endfunction
function Nightmare_Group takes nothing returns nothing
local unit target = GetFilterUnit()
local integer count = 6
local real RanRan
local real RanAng
local unit u
if IsUnitEnemy(target, GetOwningPlayer(Isazam)) and not IsDead(target) and IsUnitType(target, UNIT_TYPE_HERO) then
loop
set RanRan = 150.0
set RanAng = 60.0 * count
set u = CreateUnit(GetOwningPlayer(Isazam), 'u009', GetUnitX(target) + RanRan * Cos(RanAng * bj_DEGTORAD), GetUnitY(target) + RanRan * Sin(RanAng * bj_DEGTORAD), RanAng)
call SetUnitBaseDamage(u, ( ( GetUnitBaseDamage(Isazam) + GetUnitBonusDamage(Isazam)) * 50) / 100 )
call IssueTargetOrder(u, "attack", target)
call UnitApplyTimedLife(u, 'BTLF', 10.0)
call SetUnitVertexColor(u, 255, 255, 255, 0)
if GetLocalPlayer() == GetOwningPlayer(Isazam) or GetLocalPlayer() == GetOwningPlayer(target) then
call SetUnitVertexColor(u, 128, 128, 128, 255)
endif
set count = count - 1
exitwhen count == 0
endloop
endif
set target = null
set u = null
endfunction
function Trig_Nightmare_Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local group g
local timer t = CreateTimer()
call PauseUnit(caster, true)
call SetUnitAnimation(caster, "Death")
call TriggerSleepAction(1.5)
if not IsDead(caster) then
call ShowUnit(caster, false)
set g = CreateGroup()
call GroupEnumUnitsInRange(g, GetUnitX(Isazam), GetUnitY(Isazam), 99999.0, function Nightmare_Group)
call DestroyGroup(g)
endif
call TimerStart(t,10.0, false, function Nightmare_Timer)
call CinematicFadeBJ( bj_CINEFADETYPE_FADEOUT, 0.00, "ReplaceableTextures\\CameraMasks\\DreamFilter_Mask.blp", 0.00, 0, 0, 0 )
set caster = null
set g = null
set t = null
endfunction
function Trig_Nightmare_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A00D'
endfunction
//===========================================================================
function InitTrig_Nightmare takes nothing returns nothing
set gg_trg_Nightmare = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Nightmare, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Nightmare, Condition( function Trig_Nightmare_Conditions ) )
call TriggerAddAction( gg_trg_Nightmare, function Trig_Nightmare_Actions )
endfunction