Дополнительная кампания для WarCraft 3: Frozen Throne. Игроку предлагается пройти путь осквернителя Культа проклятых, выполнив самое опасное задание из всех, которых тому поручали.
Пока писал понял, а послушники могут же чинить корабль? а то я их вообще оставил на берегу...
Да. Ещё они могут построить склеп и сделать вурдалаков.
но меня жутко бесила погрузка в корабль
Да, согласен. Я думал сделать по-другому, чтобы корабль плыл сам. Однако, в карте есть 4 секрета, и 2 скрытых подкрепления, которые могут быть получены только с кораблём. Не говоря о том что можно уклоняться от некоторых врагов только кораблём и защищать раненные юниты погрузкой.
Сделать скилл на область, чтобы корабль затягивал всех союзников к себе на борт.
Я подумаю. Но пока думаю оставлю как есть. Сама по себе волна никого не убьёт.
возле ворот я решил сохраниться и игра вылетела
Это скорее из-за 1.30. У меня подобных проблем небыло. Bergi_Bear,
Кстати можно нескольким пустынникам приказать защищать юнит одновременно. Они будут отмирать по одному.
Ну что ж сыграл, очень всё классно, дошел до каменных ворот и решил сохраниться, потому что было очень тяжело контролить пустынников, чтобы они по очереди дефали корабль, потом аурой некра хилял корбаль, я как то затупил и мне его оч. не плохо продамажили его, но возле ворот я решил сохраниться и игра вылетела, а так всё не дурно...
Пока писал понял, а послушники могут же чинить корабль? а то я их вообще оставил на берегу...
Всё оч. приятно и атмосферно, но меня жутко бесила погрузка в корабль дефолтная (она всегда меня бесила, тем что не сразу срабатывает просто все стоят и за 20 секунд не не погрузиться куда не тыкай, а иногда и нормально, в общем корабль жутко бесил)
предложение
Сделать скилл на область, чтобы корабль затягивал всех союзников к себе на борт. для таких про как я, что вроде на таймер смотрят, но всё равно не успевают погрузиться за 5-10 секунд XD
Не сумел довести до ума в прошлую неделю. Однако работал довольно много над кампанией. В этом месяце точно первую главу выпущу. Уже вообщем можно и поиграть. Создаю копию здесь, на всякий.
Добавил заклинание Corpse Gas. Указанная дружественная нежить становится бомбой которая взрывается через 5 секунд. Урон зависит от здоровья дружественного юнита и уровня способности. Время отслеживается плавающим текстом.
globals
constant real SCG_DELAY = 5.0
constant real SCG_UPDATE_TIMEOUT = 0.1
constant integer CORPSE_GAS = 'A600'
unit array SCGCasters
real array SCGDuration
effect array SCGEffects
integer array SCGLevel
texttag array SCGIndicators
unit array SCGTargets
group SCGVictims
integer SCGTargetsQuantity
endglobals
function SCGOnExplosionCallback takes nothing returns nothing
endfunction
function spellCorpseGas takes unit c, unit t, integer lvl returns nothing
local integer i = SCGTargetsQuantity
local texttag indicator = null
if (i >= JASS_MAX_ARRAY_SIZE) or (null == c) or (null == t) or (lvl < 1) then
return
endif
set SCGCasters[i] = c
set SCGEffects[i] = AddSpecialEffectTarget("Abilities\\Spells\\NightElf\\TargetArtLumber\\TargetArtLumber.mdl", t, "origin")
set SCGTargets[i] = t
set SCGDuration[i] = SCG_DELAY
set indicator = CreateTextTagUnitBJ(I2S(R2I(SCG_DELAY)), t, 0.0, 8.0, 100.0, 100.0, 100.0, 0)
set SCGIndicators[i] = indicator
set SCGLevel[i] = lvl
set SCGTargetsQuantity = SCGTargetsQuantity + 1
endfunction
function SCGOnCastCallback takes nothing returns nothing
local unit caster = GetSpellAbilityUnit()
local integer spellLevel = GetUnitAbilityLevel(caster, CORPSE_GAS)
call spellCorpseGas(caster, GetSpellTargetUnit(), spellLevel)
set caster = null
endfunction
function SCGUpdateCallback takes nothing returns nothing
local integer i = SCGTargetsQuantity
local unit u = null
local unit f = null
local boolean mustBeDestroyed = false
local real dmg = 0.0
loop
exitwhen i <= 0
set i = i - 1
set u = SCGTargets[i]
if IsUnitAliveBJ(u) then
/* update visuals */
set SCGDuration[i] = SCGDuration[i] - SCG_UPDATE_TIMEOUT
call SetTextTagTextBJ(SCGIndicators[i], I2S(R2I(SCGDuration[i])), 8.0)
call SetTextTagPosUnitBJ(SCGIndicators[i], SCGTargets[i], 0.0)
if SCGDuration[i] <= 2.0 then
call SetTextTagColorBJ(SCGIndicators[i], 100.0, 0.0, 0.0, 0.0)
endif
/* end update visuals */
/* explode when needed */
if SCGDuration[i] <= 0.0 then
call GroupClear(SCGVictims)
call GroupEnumUnitsInRangeCounted(SCGVictims, GetUnitX(u), GetUnitY(u), 512.0, null, 6)
set dmg = (30.0 + 30.0 * I2R(SCGLevel[i])) * (GetUnitState(SCGTargets[i], UNIT_STATE_LIFE) / 300.0)
call SetUnitExploded(SCGTargets[i], true)
call UnitDamageTargetBJ(SCGCasters[i], SCGTargets[i], 300.0, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_DISEASE)
call SetUnitExploded(SCGTargets[i], false)
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Undead\\DeathCoil\\DeathCoilSpecialArt.mdl", SCGTargets[i], "origin"))
loop
set f = FirstOfGroup(SCGVictims)
exitwhen null == f
if not IsUnitType(f, UNIT_TYPE_UNDEAD) and IsUnitAliveBJ(f) and GetUnitAbilityLevel(f, 'Avul') == 0 then
call UnitDamageTargetBJ(SCGCasters[i], f, dmg, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_DISEASE)
if dmg > 60.0 then
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Undead\\DeathCoil\\DeathCoilSpecialArt.mdl", f, "origin"))
endif
endif
call GroupRemoveUnit(SCGVictims, f)
endloop
endif
/* end explode if needed */
endif
/* cleanup */
set mustBeDestroyed = IsUnitDeadBJ(u) or SCGDuration[i] <= 0.0
if mustBeDestroyed then
call DestroyTextTag(SCGIndicators[i])
call DestroyEffect(SCGEffects[i])
set SCGTargetsQuantity = SCGTargetsQuantity - 1
set SCGCasters[i] = SCGCasters[SCGTargetsQuantity]
set SCGDuration[i] = SCGDuration[SCGTargetsQuantity]
set SCGEffects[i] = SCGEffects[SCGTargetsQuantity]
set SCGIndicators[i] = SCGIndicators[SCGTargetsQuantity]
set SCGLevel[i] = SCGLevel[SCGTargetsQuantity]
set SCGTargets[i] = SCGTargets[SCGTargetsQuantity]
set SCGCasters[SCGTargetsQuantity] = null
set SCGEffects[SCGTargetsQuantity] = null
set SCGIndicators[SCGTargetsQuantity] = null
set SCGTargets[SCGTargetsQuantity] = null
endif
/* end cleanup */
endloop
set u = null
set f = null
endfunction
function SCGOnCastFilter takes nothing returns boolean
local boolean result = true
set result = CORPSE_GAS == GetSpellAbilityId() and result
set result = GetSpellTargetUnit() != null and result
set result = IsUnitType(GetSpellTargetUnit(), UNIT_TYPE_UNDEAD) and result
return result
endfunction
function initSpellCorpseGas takes nothing returns nothing
local trigger t = CreateTrigger()
local timer updateTimer = CreateTimer()
set SCGTargetsQuantity = 0
set SCGVictims = CreateGroup()
call TimerStart(updateTimer, SCG_UPDATE_TIMEOUT, true, function SCGUpdateCallback)
call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_SPELL_CAST)
call TriggerAddCondition(t, Condition(function SCGOnCastFilter))
call TriggerAddAction(t, function SCGOnCastCallback)
set t = null
endfunction
Комментарии проекта Осквернитель
Осквернитель
Bergi_Bear,
Пока писал понял, а послушники могут же чинить корабль? а то я их вообще оставил на берегу...
Всё оч. приятно и атмосферно, но меня жутко бесила погрузка в корабль дефолтная (она всегда меня бесила, тем что не сразу срабатывает просто все стоят и за 20 секунд не не погрузиться куда не тыкай, а иногда и нормально, в общем корабль жутко бесил)