Карта содержит короля лича в виде Артаса с нестандартной озвучкой и способностями. Так же там лежат всякие мелочные функции которые могут кому нибудь пригодиться.
Способности взаимосвязаны, и поэтому если вы захотите вынуть какой либо один спелл, напишите лучше мне в личку или скайп при нехватке опыта.
Некоторые способности могут быть не доработаны.
Всего Артас имеет 4 геройские способности а так же 3 обычные.
Когда вы атакуете под этой властью, есть 15% вероятность что вы попадете под воздействие ауры крови, которая увеличивает вашу атаку. Затем следует еще 15% вероятности при атаке что ваша атака повысится. Суммируется до 3 раз, эффект рассеивается после 15 секунд если способность снова не активируется, или спустя 15 секунд после достижения 3 ур эффекта.
Власть льда
Когда вас атакуют под этой властью, есть 15% вероятность что вы попадете под воздействие ауры льда, которая увеличивает вашу броню. Затем следует еще 15% что защита повысится. Суммируется до 3 раз, эффект рассеивается после 15 секунд если способность снова не активируется, или спустя 15 секунд после достижения 3 ур эффекта.
Власть нечестивости
Когда вы атакуете или вас атакуют под этой властью, есть 7.5% вероятность что вы попадете под воздействие ауры нечестивости, которая увеличивает вашу скорость передвижения и боя. Затем следует еще 7.5% что скорость бега и боя еще повысится. Суммируется до 3 раз, эффект рассеивается после 15 секунд если способность снова не активируется, или спустя 15 секунд после достижения 3 ур эффекта.
Заражение вражеского воина болезнью "Черная чума". Вся скорость уменьшается, при этом он периодически теряет здоровье. При атаке зараженного героем или при срабатывании урона от заражения есть шанс распространить болезнь на соседнего воина, при этом время действия болезни обновляется. Бонус заражения от нечестивости: 4%. Периодический урон: 50% от силы (65% под властью нечестивости)
Уровень 1: Уменьшение скорости: 5%, шанс распространения 4% (8%)
Уровень 2: Уменьшение скорости: 7%, шанс распространения 6% (10%)
Уровень 3: Уменьшение скорости: 10%, шанс распространения 8% (12%)
Буран
Используя магию льда, посылает волну перед собой в радиусе 200. Противники отталкиваются, заледеневают на несколько сек., и становятся неуязвимыми, но получают небольшой урон от холода. При выполнении заклинания под властью льда на Лича накладывается эффект "Оледенение" которое увеличивает защиту.
Уровень 1: Время заморозки: 4 сек., 3 урона каждую сек. (Аура на 6% защиты)
Уровень 2: Время заморозки: 5 сек., 6 урона каждую сек. (Аура на 8% защиты)
Уровень 3: Время заморозки: 6 сек., 9 урона каждую сек. (Аура на 10% защиты)
Войско мертвых
Король-Лич проклинает землю под собой, и в течении 10 сек. все умершие начинают воскрешаться в виде вурдалаков. Вурдалаки могут восстановить здоровье/ману любому союзному или вашему герою жертвуя собой.
Уровень 1: Радиус воскрешения: 400, здоровье вурдалака: 330
Уровень 2: Радиус воскрешения: 450, здоровье вурдалака: 420
Уровень 3: Радиус воскрешения: 500, здоровье вурдалака: 495
Щит крови
Высасывает кровь из окружающих врагов накладывая на них отрицательный эффект "Слабость" длительностью 7 сек (Увеличивает получаемый урон на 12%)., при этом создавая щит из крови который поглощает урон. Кол-во поглощения составляет 40% от макс. здоровья (50% под властью крови) и бонусно по 30 ед. за каждого врага (макс. 5). После того как щит пробьют, 55% (65%) поглощенного урона переводится в здоровье. Время действия 10 сек.
library MISC
//globals
sound udg_SimError = null
real DBU (unit A, unit B) {
real dx = GetUnitX(B) - GetUnitX(A)
real dy = GetUnitY(B) - GetUnitY(A)
return SquareRoot(dx * dx + dy * dy)
}
real ABU (unit A, unit B) {
return Atan2(GetUnitY(B)-GetUnitY(A), GetUnitX(B)-GetUnitX(A))*bj_RADTODEG
}
real ABUC (unit A, real B_x, real B_y) {
return Atan2(B_y-GetUnitY(A), B_x-GetUnitX(A))*bj_RADTODEG
}
real TBU (unit A, unit B, real speed) {
real dx = GetUnitX(B) - GetUnitX(A)
real dy = GetUnitY(B) - GetUnitY(A)
return (SquareRoot(dx * dx + dy * dy)/speed)
}
function SimError takes player ForPlayer, string msg1 returns nothing
if udg_SimError==null then
set udg_SimError=CreateSoundFromLabel( "InterfaceError",false,false,false,10,10)
endif
if (GetLocalPlayer() == ForPlayer) then
call ClearTextMessages()
call DisplayTimedTextToPlayer( ForPlayer, 0.52, -1.00, 2.00, "|cffffcc00"+msg1+"|r" )
call StartSound( udg_SimError )
endif
endfunction
void TextUp(string s, unit u, real size,real r,real g, real b) {
//real sp =(64 * 0.071) / 128
real x1 = 0.0355 * Cos(90. * bj_DEGTORAD)
real y1 = 0.0355 * Sin(90. * bj_DEGTORAD)
bj_lastCreatedTextTag = CreateTextTag()
SetTextTagText(bj_lastCreatedTextTag, s, (size * 0.023) / 10)
SetTextTagPosUnit(bj_lastCreatedTextTag, u, 7)
SetTextTagColor(bj_lastCreatedTextTag, PercentToInt(r, 255), PercentToInt(g, 255), PercentToInt(b,255), 0)
SetTextTagVelocity(bj_lastCreatedTextTag, x1,y1)
SetTextTagPermanent(bj_lastCreatedTextTag, false)
SetTextTagLifespan(bj_lastCreatedTextTag, 2.5)
SetTextTagFadepoint(bj_lastCreatedTextTag, 0)
}
void Text(string s, unit u, unit u2, real size,real r,real g, real b) {
//real sp =(64 * 0.071) / 128
real x1 = 0.0355 * Cos(ABU(u,u2) * bj_DEGTORAD)
real y1 = 0.0355 * Sin(ABU(u,u2) * bj_DEGTORAD)
bj_lastCreatedTextTag = CreateTextTag()
SetTextTagText(bj_lastCreatedTextTag, s, (size * 0.023) / 10)
//SetTextTagPos(bj_lastCreatedTextTag, x, y, 7)
SetTextTagPosUnit(bj_lastCreatedTextTag, u2, 7)
SetTextTagColor(bj_lastCreatedTextTag, PercentToInt(r, 255), PercentToInt(g, 255), PercentToInt(b,255), 0)
SetTextTagVelocity(bj_lastCreatedTextTag, x1,y1)
SetTextTagPermanent(bj_lastCreatedTextTag, false)
SetTextTagLifespan(bj_lastCreatedTextTag, 2.5)
SetTextTagFadepoint(bj_lastCreatedTextTag, 0)
}
void AddSound(string s, real x, real y) {
sound snd = CreateSound(s, false, true, true, 10, 10, "CombatSoundsEAX")
SetSoundChannel(snd, 40)
SetSoundVolume(snd, 127)
SetSoundPitch(snd, 1)
SetSoundDistances(snd, 600, 10000)
SetSoundDistanceCutoff(snd, 2100)
SetSoundConeAngles(snd, 0.0, 0.0, 127)
SetSoundConeOrientation(snd, 0.0, 0.0, 0.0)
SetSoundPosition(snd, x, y, 50)
StartSound(snd)
KillSoundWhenDone(snd)
snd = null
}
function RandomEnum takes nothing returns nothing
local integer r = GetRandomInt(1,bj_groupRandomConsidered)
local unit u = GetEnumUnit()
if r != 1 then
call GroupRemoveUnit(bj_groupAddGroupDest, u)
else
set bj_groupRandomCurrentPick = u
endif
set u = null
endfunction
function RandomFromGroup takes group g returns unit
set bj_groupRandomConsidered = CountUnitsInGroup(g)
call ForGroup(g, function RandomEnum)
call GroupClear(bj_groupAddGroupDest)
call DestroyGroup(bj_groupAddGroupDest)
return bj_groupRandomCurrentPick
endfunction
void LightningEffect(){
DestroyLightning(LoadLightningHandle(LichSettings_hash,GetHandleId(GetExpiredTimer()), 0))
FlushChildHashtable(LichSettings_hash,GetHandleId(GetExpiredTimer()))
DT(GetExpiredTimer())
}
endlibrary
» SimpleMoving
library SimpleMoving needs SnowstormA
//globals
private group MovingGroup = CreateGroup()
private hashtable hash = InitHashtable()
define {
saveS = SaveInteger(hash, GetHandleId(t), 0,DB)
loadS = LoadInteger(hash, GetHandleId(t), 0)
}
struct Move
unit un
real x, y, time, angle, mod
bool pause
int ablvl
method dcr takes void returns void
this.time = this.time-0.02
endmethod
method extinction takes void returns void
this.mod = this.mod/1.3
this.x = this.mod * Cos(this.angle * bj_DEGTORAD)
this.y = this.mod * Sin(this.angle * bj_DEGTORAD)
endmethod
endstruct
private function PeriodicMoving takes nothing returns nothing
timer t = GetExpiredTimer()
Move DB = loadS
real xu = GetUnitX(DB.un)
real yu = GetUnitY(DB.un)
real some
if (DB.time <= 0 or not IsUnitInGroup(DB.un, MovingGroup) or GetUnitState(DB.un, UNIT_STATE_LIFE) <= 0.045) then
DestroyTimer(t)
if DB.pause then
PauseUnit(DB.un,false)
endif
GroupRemoveUnit(MovingGroup, DB.un)
FlushChildHashtable(hash,GetHandleId(t))
DB.destroy()
else
SetUnitPosition( DB.un, xu+DB.x, yu+DB.y)
DB.time -= 0.02
endif
t = null
endfunction
private function PeriodicStagger takes nothing returns nothing
timer t = GetExpiredTimer()
Move DB = loadS
real x1 = GetUnitX(DB.un)
real y1 = GetUnitY(DB.un)
if (DB.mod <= 0.8 or not IsUnitInGroup(DB.un, MovingGroup) or GetUnitState(DB.un, UNIT_STATE_LIFE) <= 0.045) then
GroupRemoveUnit(MovingGroup, DB.un)
if DB.pause then
Freeze_Burns(DB.un, DB.ablvl)
endif
IssueImmediateOrder(DB.un, "stop")
FlushChildHashtable(hash,GetHandleId(t))
DB.destroy()
DestroyTimer(t)
else
SetUnitPosition( DB.un,x1+DB.x,y1+DB.y)
DB.mod /= 1.3
DB.x = DB.mod * Cos(DB.angle * bj_DEGTORAD)
DB.y = DB.mod * Sin(DB.angle * bj_DEGTORAD)
endif
t = null
endfunction
function MoveIni takes unit u, real angle, real Mod, real time , integer Switch, boolean pause, int ablvl returns nothing
timer t = CreateTimer()
int h = GetHandleId(t)
Move DB = Move.create()
DB.x = (Mod * Cos(angle * bj_DEGTORAD))
DB.y = (Mod * Sin(angle * bj_DEGTORAD))
//------------------------------------------------
DB.un = u
DB.time = time
DB.angle = angle
DB.mod = Mod
DB.pause = pause
DB.ablvl = ablvl
saveS
if pause then
call PauseUnit(u,true)
endif
//------------------------------------------------
UnitAddAbility(u, 'Arav')
UnitRemoveAbility(u, 'Arav')
//SetUnitPathing(u, false)
if Switch == 1 then
call TimerStart(t, 0.02, true, function PeriodicStagger)
call GroupAddUnit(MovingGroup, u)
else
call TimerStart(t, 0.02, true, function PeriodicMoving)
call GroupAddUnit(MovingGroup, u)
endif
set t = null
endfunction
endlibrary
» LocalShake
library LocalShake
define private clear(h) = FlushChildHashtable(hash, GetHandleId(h))
//globals
private int g_power = 0
private force Force_Filter = CreateForce(), CopyedForce = CreateForce()
private hashtable hash = InitHashtable()
private void ForceAddForce (){
ForceAddPlayer(CopyedForce, GetEnumPlayer())
}
force CopyForce(force f){
CopyedForce = CreateForce()
ForForce(f, function ForceAddForce)
return CopyedForce
}
//----------------=================-------------------
private function f_end takes nothing returns nothing
CameraClearNoiseForPlayer(GetEnumPlayer())
endfunction
private function f_start_power takes nothing returns nothing
CameraSetEQNoiseForPlayer( GetEnumPlayer(), g_power )
endfunction
private void shake_time () {
force f = LoadForceHandle(hash, GetHandleId(GetExpiredTimer()), 0)
ForForce(f, function f_end)
ForceClear(f)
clear(GetExpiredTimer())
DestroyTimer(GetExpiredTimer())
DestroyForce(f)
f = null
}
private bool players_filter(){
ForceAddPlayer(Force_Filter, GetOwningPlayer(GetFilterUnit()))
return false
}
void ShakeByUnit (unit u, real time, real range, int power) {
group g = CreateGroup()
timer t = CreateTimer()
force f1
GroupEnumUnitsInRange(g, GetUnitX(u),GetUnitY(u), range, Filter(function players_filter))
f1 = CopyForce(Force_Filter)
SaveForceHandle(hash, GetHandleId(t), 0, f1)
TimerStart(t, time, false, function shake_time)
g_power = power
ForForce(f1, function f_start_power)
DestroyGroup(g)
g = null
t = null
f1 = null
}
void ShakeByCoords (real shake_x, real shake_y, real time, real range, int power) {
group g = CreateGroup()
timer t = CreateTimer()
force f1
GroupEnumUnitsInRange(g, shake_x, shake_y, range, Filter(function players_filter))
f1 = CopyForce(Force_Filter)
SaveForceHandle(hash, GetHandleId(t), 0, f1)
TimerStart(t, time, false, function shake_time)
g_power = power
ForForce(f1, function f_start_power)
DestroyGroup(g)
g = null
t = null
f1 = null
}
endlibrary
Так же выражаю благодарность тем чьи модели и иконки используются в карте.