Вспомогательные триггеры позволяющие прокачать способности с 1 до максимально возможного уровня (при наличии очков способностей и уровня)
Для изначальных реализаций использовался лишь jass, для некоторых потребуется поддержка макросов (cjass)
(Макрос в реализации с лимитом можно убрать просто подставив число)
(Макрос в реализации с лимитом можно убрать просто подставив число)
На тестовой карте 9 реализаций (6 на jass, 3 на GUI):
- Jass
- Jass рекурсией (минус в постоянном создании объекта триггера, плюс в простоте)
- Jass с лимитом на прокачку за клик (используется макрос, можно убрать)
- Jass с черным списком способностей для авто прокачки (используются макросы)
- Jass с лимитом и черным списком (используются макросы)
- Jass при повышении уровня (используются макросы)
- Custom script на GUI (альтернатива jass, немного медленее из-за действий в Actions)
- Custom script на GUI с лимитом
- GUI рекурсией
Инициализация (для триггера при повышении уровня указано вместе с кодом)
// Без черного списка (используется Evaluate(condition) из-за преимущества в скорости перед Action)
function InitTrig_Jass takes nothing returns nothing
set gg_trg_Jass = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(gg_trg_Jass, EVENT_PLAYER_HERO_SKILL)
call TriggerAddCondition(gg_trg_Jass, function Trig_Jass_Evaluate)
endfunction
// С черным списком (BLACKLIST_INIT - макрос)
function InitTrig_JassBlacklist takes nothing returns nothing
set gg_trg_JassBlacklist = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(gg_trg_JassBlacklist, EVENT_PLAYER_HERO_SKILL)
call TriggerAddCondition(gg_trg_JassBlacklist, function Trig_JassBlacklist_Condition)
call TriggerAddAction(gg_trg_JassBlacklist, function Trig_JassBlacklist_Actions)
BLACKLIST_INIT
endfunction
Jass рекурсией
function Trig_JassRecursion_Evaluate takes nothing returns boolean
call SelectHeroSkill(GetTriggerUnit(), GetLearnedSkill())
return false
endfunction
Jass
function Trig_Jass_Evaluate takes nothing returns boolean
local unit u = GetTriggerUnit()
local integer abilid = GetLearnedSkill()
local integer lvl = GetLearnedSkillLevel()
call DisableTrigger(GetTriggeringTrigger())
loop
exitwhen GetHeroSkillPoints(u) < 1
call SelectHeroSkill(u, abilid)
exitwhen lvl == GetUnitAbilityLevel(u, abilid)
set lvl = lvl + 1
endloop
call EnableTrigger(GetTriggeringTrigger())
set u = null
return false
endfunction
Jass с лимитом
define private LIMIT_LEARN_PER_TIME = 1
function Trig_JassLimit_Evaluate takes nothing returns boolean
local unit u = GetTriggerUnit()
local integer abilid = GetLearnedSkill()
local integer lvl = GetLearnedSkillLevel()
local integer leftLearns = LIMIT_LEARN_PER_TIME
call DisableTrigger(GetTriggeringTrigger())
loop
exitwhen GetHeroSkillPoints(u) < 1
call SelectHeroSkill(u, abilid)
exitwhen lvl == GetUnitAbilityLevel(u, abilid)
set lvl = lvl + 1
set leftLearns = leftLearns - 1
exitwhen leftLearns == 0
endloop
call EnableTrigger(GetTriggeringTrigger())
set u = null
return false
endfunction
Jass с черным списком
globals
integer array g_blacklist_autolearn
integer g_blacklist_autolearn_count = 0
endglobals
define private BLACKLIST_ADD(abilityId) = {
set g_blacklist_autolearn[g_blacklist_autolearn_count] = abilityId
set g_blacklist_autolearn_count = g_blacklist_autolearn_count + 1
}
define private BLACKLIST_INIT = {
BLACKLIST_ADD('AHhb')
BLACKLIST_ADD('AHad')
}
function Trig_JassBlacklist_Condition takes nothing returns boolean
local integer abilid = GetLearnedSkill()
local integer i = 0
local integer count = g_blacklist_autolearn_count
loop
if (abilid == g_blacklist_autolearn[i]) then
return false
endif
set i = i + 1
exitwhen i == count
endloop
return true
endfunction
function Trig_JassBlacklist_Actions takes nothing returns boolean
local unit u = GetTriggerUnit()
local integer abilid = GetLearnedSkill()
local integer lvl = GetLearnedSkillLevel()
call DisableTrigger(GetTriggeringTrigger())
loop
exitwhen GetHeroSkillPoints(u) < 1
call SelectHeroSkill(u, abilid)
exitwhen lvl == GetUnitAbilityLevel(u, abilid)
set lvl = lvl + 1
endloop
call EnableTrigger(GetTriggeringTrigger())
set u = null
return false
endfunction
Jass с лимитом и черным списком
globals
integer array g_blacklist_autolearn
integer g_blacklist_autolearn_count = 0
endglobals
define private LIMIT_LEARN_PER_TIME = 1
define private BLACKLIST_ADD(abilityId) = {
set g_blacklist_autolearn[g_blacklist_autolearn_count] = abilityId
set g_blacklist_autolearn_count = g_blacklist_autolearn_count + 1
}
define private BLACKLIST_INIT = {
BLACKLIST_ADD('AHhb')
BLACKLIST_ADD('AHad')
}
function Trig_JassLimitBlacklist_Condition takes nothing returns boolean
local integer abilid = GetLearnedSkill()
local integer i = 0
local integer count = g_blacklist_autolearn_count
loop
if (abilid == g_blacklist_autolearn[i]) then
return false
endif
set i = i + 1
exitwhen i == count
endloop
return true
endfunction
function Trig_JassLimitBlacklist_Actions takes nothing returns boolean
local unit u = GetTriggerUnit()
local integer abilid = GetLearnedSkill()
local integer lvl = GetLearnedSkillLevel()
local integer leftLearns = LIMIT_LEARN_PER_TIME
call DisableTrigger(GetTriggeringTrigger())
loop
exitwhen GetHeroSkillPoints(u) < 1
call SelectHeroSkill(u, abilid)
exitwhen lvl == GetUnitAbilityLevel(u, abilid)
set lvl = lvl + 1
set leftLearns = leftLearns - 1
exitwhen leftLearns == 0
endloop
call EnableTrigger(GetTriggeringTrigger())
set u = null
return false
endfunction
Jass при повышении уровня
globals
integer array g_levelup_autolearn
integer g_levelup_autolearn_count = 0
endglobals
define private ABILITY_ADD(abilityId) = {
set g_levelup_autolearn[g_levelup_autolearn_count] = abilityId
set g_levelup_autolearn_count = g_levelup_autolearn_count + 1
}
define private ABILITIES_INIT = {
ABILITY_ADD('AHhb')
ABILITY_ADD('AHad')
}
function Trig_JassOnLevelUp_Evaluate takes nothing returns boolean
local unit u = GetTriggerUnit()
local integer points = GetHeroSkillPoints(u)
local integer abilid = g_levelup_autolearn[0]
local integer i = 0
local integer j
local integer count = g_levelup_autolearn_count
loop
exitwhen points < 1
call SelectHeroSkill(u, abilid)
set j = GetHeroSkillPoints(u)
if (points != j) then
set points = j
if (points > 0) then
loop
call SelectHeroSkill(u, abilid)
set j = GetHeroSkillPoints(u)
exitwhen points == j
set points = j
exitwhen points < 1
endloop
endif
endif
set i = i + 1
exitwhen i == count
set abilid = g_levelup_autolearn[i]
endloop
set u = null
return false
endfunction
//===========================================================================
function InitTrig_JassOnLevelUp takes nothing returns nothing
ABILITIES_INIT
if (g_levelup_autolearn_count > 0) then
set gg_trg_JassOnLevelUp = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(gg_trg_JassOnLevelUp, EVENT_PLAYER_HERO_LEVEL)
call TriggerAddCondition(gg_trg_JassOnLevelUp, function Trig_JassOnLevelUp_Evaluate)
endif
endfunction
Ред. nik5960nik
3 на jass и 3 на gui (2 состоят из custom script из-за отсутствия exitwhen на GUI)
подтвердили, нормально оформил?
Ред. rsfghd
Ред. nik5960nik
Изначальные версии на чистом jass, обычная и с лимитом (указал что нужно подставить число для лимита вместо макроса для чистого jass)
+ могу добавить альтернативную реализацию уже без макросов
В функции действия записать, что если герой имеет абилку из числа прописанных в массиве, то поднять её уровень на 1 (Например, в случайном порядке)
В массив соответственно прописать равкоды абилок, + оставить возможность добавлять туда свои абилки через гуи
При этом нужно скрипт запустить с отложенным на 1 секунд стартом, чтобы в массив успели прописаться абилки, добавленные пользователем в триггере "инициализация карты"