Добавил заклинание 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
Ну, они знакомы давно. Ещё Кенариус контактировал с минотаврами но Войны Древних, а таурены в своё время пытались поймать Малорна. Возможно, минотавры объединялись с Ночными Эльфами против кентавров.
Если очень нужно, придется прибегнуть к мемхаку или писать свою систему нанесения урона.
+
Возможно в новой версии игры ввели, не уверен. Не использую последнюю версию поскольку не могу заставить JNGP работать в таком случае.
Нужно больше информации о том как манипулировать вниманием игрока. Как дать понять игроку куда идти? Как интересно спрятать тайники? Как создать ощущение пространства (обычно делается с помощью разницы высот)? Как донести тему местности (хотя это больше про эстетику).
Да, я почерпнул приём создания "темы" для игры прежде механик из литературы (Game Design Lenses, кажется). Что-то должно быть написано конкретно о дизайне уровней. Ищу дальше.
Немного не в тему, но я всё таки спрошу. Поделитесь какой литературой на тему дизайна уровней, пожалуйста. Меня интересует именно механики, а не эстетика. Пока что собираю отдельные рецепты по крупицам со всей Сети. Должно же быть что-то связное где-то.
vJass и cJass включены. Предварительно добавил файлы в "D:\games\Jass New Gen Pack Rebuild\AdicHelper\lib". Я не могу хранить файлы в той же папке что и карта из-за того как устроен сборщик кампаний.
ИИ скрипт добавляется в архив карты, как любой другой импортируемый файл. Изменения сделанные на исходном скрипте никак не отразятся на том файле которых запакован в архив карты.
К тому же, ИИ созданные с помощью WE импортируются в двух шагах.
» Осквернитель / Главная страница
Отредактирован Zahanc
» Осквернитель / Главная страница
» Осквернитель / Главная страница
» Осквернитель / Главная страница
» WarCraft 3 / Вселенная WarCraft
» WarCraft 3 / Поясните белое пятно в сюжете игры
» WarCraft 3 / Пара элементарных вопросов
Можно отловить событие поражения для игрока или выход игрока.
» WarCraft 3 / Пара элементарных вопросов
+
Возможно в новой версии игры ввели, не уверен. Не использую последнюю версию поскольку не могу заставить JNGP работать в таком случае.
» Повелитель Бездны / Главная страница
Changelog.
» Fa_losophy / XGMolution
» Fa_losophy / XGMolution
» Дневник Сильваны / Как использовать все место на карте?
Отредактирован Zahanc
» WarCraft 3 / Галерея скриншотов ландшафта
» WarCraft 3 / Галерея скриншотов ландшафта
То что Вы предлагаете имеет смысл для микродекоринга. Вопрос был:
» WarCraft 3 / Галерея скриншотов ландшафта
» Дневник Сильваны / Послушник
» Дневник Сильваны / Послушник
» Дневник Сильваны / Послушник
» Дневник Сильваны / Послушник
» WarCraft 3 / vJass: импортировать несколько скриптов.
» WarCraft 3 / vJass: импортировать несколько скриптов.
+
Ещё включен сборщик кампаний, но это не должно иметь значение. К тому же, мне обязательно чтобы это работало со сборщиком.
» World of Warcraft Modding / Импорт ИИ на карте
» Осквернитель / Главная страница
Отредактирован Zahanc
» WarCraft 3 / vJass: как перебрать все экземпляры структуры?
Отредактирован Zahanc
» WarCraft 3 / vJass: как перебрать все экземпляры структуры?
))