-------------------------------------------------Chance Time----------------------------------------------------- function Cmn_EffUse_Chance_Time_init(Effect) -- Инициализация, выполняется однажды при создании боя local botId = PERS_ID(my.persPtr) if sbot_state == nil then sbot_state = {} end if sbot_state[botId] == nil then sbot_state[botId] = {} end -- Инициализация признака первого хода if (sbot_state[botId].CurUsage == nil) then sbot_state[botId].CurUsage = {} end if (sbot_state[botId].CurUsage[Effect] == nil) then sbot_state[botId].CurUsage[Effect] = 1 end -- Здесь хранится номер следующего применения эффекта if (sbot_state[botId].NextUseTime == nil) then sbot_state[botId].NextUseTime = {} end if (sbot_state[botId].NextUseTime[Effect] == nil) then sbot_state[botId].NextUseTime[Effect] = os.time() end end function Cmn_EffUse_Chance_Time_use(Effect, MaxUse, CooldownTime, UseChance, PersPointer, ExceptArtId, ExceptArtIdPersPointer) --[[ -- Применение эффекта, который должен использоваться каждый ход с некоторым шансом, если прошел его кулдаун -- Параметры: - Effect - ID эффекта - (необязательный параметр) MaxUse - Максимальное число использований. По-умолчанию - 30000 - (необязательный параметр) CooldownTime - Кулдаун эффекта (в секундах). По-умолчанию - 0 - (необязательный параметр) UseChance - Шанс использования в данный ход. По-умолчанию - 100% - (необязательный параметр) PersPointer - указатель на то, на кого применять заклинание (себя или противника). По-умолчанию - на себя - (необязательный параметр) ExceptArtId - массив id-шников эффектов. Если хоть один из этих эффектов висит на ExceptArtIdPersPointer, то эффекты не применяются. По-умолчанию - пустой, не проверяем - (необязательный параметр) ExceptArtIdPersPointer - указатель на перса на котором проверять эти эффекты. По-умолчанию - на себя -- Логика: -- Текущий ход от применения эффекта храним в переменной state.CooldownTurn. -- Если истек кулдаун и применения не закончились, то применяем эффект в шансом UseChance -- ВНИМАНИЕ! Требует после себя удара с завершением хода!!! ]] local ReturnValue = false if (Effect ~= nil) then if (my.status == FS_PS_ACTIVE) then if (MaxUse == nil) then MaxUse = 30000 end --Задаем максимальное число использований по-умолчанию 30000 if (CooldownTime == nil) then CooldownTime = 0 end --Задаем нулевой кулдаун по-умолчанию if (UseChance == nil) then UseChance = 1 end --Задаем 100%-ю вероятность по-умолчанию if (PersPointer == nil) then PersPointer = my.persPtr end --Задаем себя в качестве указателя цели эффекта по-умолчанию if (ExceptArtId == nil) then ExceptArtId = nil end --Задаем пустой массив на проверку if (ExceptArtIdPersPointer == nil) then ExceptArtIdPersPointer = my.persPtr end --По-умолчанию проверяем эффекты на себя if (type(ExceptArtId) == "number") then --Если ExceptArtId задана числом - преобразуем его в таблицу local TMP_var = ExceptArtId ExceptArtId = nil ExceptArtId = {} ExceptArtId[1] = TMP_var end local botId = PERS_ID(my.persPtr) local state = sbot_state[botId] local dice = math.random() local CurTime = os.time() local IsArtId = false -- Пробегаем по массиву эффектов-исключений и если хоть один из них висит на ExceptArtIdPersPointer, то ставим флаг IsArtId - не "стрелять" if (ExceptArtId ~= nil) then for _, ArtId in pairs(ExceptArtId) do if (#aux.activeEffects(ExceptArtIdPersPointer, { artId = ArtId }) > 0) then IsArtId = true end end end if (state.CurUsage[Effect] <= MaxUse) and (CurTime >= state.NextUseTime[Effect]) and (dice <= UseChance) and (IsArtId == false) then local EffectUsed EffectUsed = aux.useEffect(Effect, PersPointer) state.CurUsage[Effect] = state.CurUsage[Effect] + 1 state.NextUseTime[Effect] = CurTime + CooldownTime if (EffectUsed ~= false) and (EffectUsed ~= -100) then ReturnValue = true end end end -- if FS_PS_ACTIVE end -- if all initials exist return ReturnValue end function Cmn_EffUse_Chance_Time(Effect, MaxUse, CooldownTime, UseChance, PersPointer, ExceptArtId, ExceptArtIdPersPointer) local ReturnValue = false if (Effect ~= nil) then -- Инициализируем Cmn_EffUse_Chance_Time_init(Effect) -- Применяем эффект, если надо ReturnValue = Cmn_EffUse_Chance_Time_use(Effect, MaxUse, CooldownTime, UseChance, PersPointer, ExceptArtId, ExceptArtIdPersPointer) end return ReturnValue end -----------------------------------------------End Chance Time---------------------------------------------------- -------------------------------------------------HPC Turns----------------------------------------------------- function Cmn_EffUse_HPC_Turns_init(Effect) -- Инициализация, выполняется однажды при создании боя local botId = PERS_ID(my.persPtr) if sbot_state == nil then sbot_state = {} end if sbot_state[botId] == nil then sbot_state[botId] = {} end -- Инициализация признака первого хода if (sbot_state[botId].CurUsage == nil) then sbot_state[botId].CurUsage = {} end if (sbot_state[botId].CurUsage[Effect] == nil) then sbot_state[botId].CurUsage[Effect] = 1 end -- Здесь хранится номер следующего применения эффекта (его параметры хранятся в таблице с этим номером) if (sbot_state[botId].CurTurn == nil) then sbot_state[botId].CurTurn = 1 end --Если вдруг по какой-то причине CurTurn не определен if (sbot_state[botId].NextUseTurn == nil) then sbot_state[botId].NextUseTurn = {} end if (sbot_state[botId].NextUseTurn[Effect] == nil) then sbot_state[botId].NextUseTurn[Effect] = sbot_state[botId].CurTurn end -- Инициализируем следующее использование в 1-й (первый) ход end function Cmn_EffUse_HPC_Turns_use(Effect, hpCMap, CooldownTurns, UseChance, PersPointer, ExceptArtId, ExceptArtIdPersPointer) --[[ Применение эффекта, который должен использоваться при достижении определенных порогов (например самохил), если прошел его кулдаун (в ходах). -- Параметры: - Effect - ID эффекта - hpCMap - таблица с порогами срабатывания эффекта, отсортированными по убыванию. В процентах (доле) от максимального здоровья бота - (необязательный параметр) CooldownTurns - кулдаун в ходах, не считая текущий. По-умолчанию - 0 - (необязательный параметр) UseChance - шанс использования в данный ход. По-умолчанию - 100% - (необязательный параметр) PersPointer - указатель на то, на кого применять эффект (себя или противника). По-умолчанию - на себя - (необязательный параметр) ExceptArtId - массив id-шников эффектов. Если хоть один из этих эффектов висит на ExceptArtIdPersPointer, то эффекты не применяются. По-умолчанию - пустой, не проверяем - (необязательный параметр) ExceptArtIdPersPointer - указатель на перса на котором проверять эти эффекты. По-умолчанию - на себя -- Логика: -- Эффект срабатывается при достижении порогов из hpCMap, срабатывания шанса UseChance и истечения кулдауна CooldownTurns -- ВНИМАНИЕ! Требует после себя удара с завершением хода!!! ]] local ReturnValue = false if (Effect ~= nil) and (hpCMap ~= nil) then if (my.status == FS_PS_ACTIVE) then if (CooldownTurns == nil) then CooldownTurns = 0 end --Задаем нулевой кулдаун по-умолчанию if (PersPointer == nil) then PersPointer = my.persPtr end --Задаем себя в качестве указателя цели эффекта по-умолчанию if (UseChance == nil) then UseChance = 1 end --Задаем 100%-ю вероятность по-умолчанию if (ExceptArtId == nil) then ExceptArtId = nil end --Задаем пустой массив на проверку if (ExceptArtIdPersPointer == nil) then ExceptArtIdPersPointer = my.persPtr end --По-умолчанию проверяем эффекты на противнике if (type(ExceptArtId) == "number") then --Если ExceptArtId задана числом - преобразуем его в таблицу local TMP_var = ExceptArtId ExceptArtId = nil ExceptArtId = {} ExceptArtId[1] = TMP_var end local botId = PERS_ID(my.persPtr) local state = sbot_state[botId] local bot = PERS(my.persPtr) local hpC = bot.hp / bot.hpMax local dice = math.random() local IsArtId = false local CurTurn = state.CurTurn -- Пробегаем по массиву эффектов-исключений и если хоть один из них висит на ExceptArtIdPersPointer, то ставим флаг IsArtId - не "стрелять" if (ExceptArtId ~= nil) then for _, ArtId in pairs(ExceptArtId) do if (#aux.activeEffects(ExceptArtIdPersPointer, { artId = ArtId }) > 0) then IsArtId = true end end end -- Есть массив порогов срабатывания эффекта. Пороги отсортированы по убыванию. -- По-умолчанию мы работаем с первым порогом. Если текужее здоровье меньше текущего порога и срабатывает шанс, то применяем эффект. -- Также проверяем прошел ли кулдаун с момента прошлого применения и не превысили ли мы число применений (вышли за пределы массива). -- После чего переходим к следующему элементу массива порога if (state.CurUsage[Effect] <= #hpCMap) and (hpC <= hpCMap[state.CurUsage[Effect]]) and (CurTurn >= state.NextUseTurn[Effect]) and (dice <= UseChance) and (IsArtId == false) then local EffectUsed EffectUsed = aux.useEffect(Effect, PersPointer) state.CurUsage[Effect] = state.CurUsage[Effect] + 1 state.NextUseTurn[Effect] = CurTurn + CooldownTurns if (EffectUsed == 0) then ReturnValue = true end end end -- if FS_PS_ACTIVE end -- if all initials exist return ReturnValue end function Cmn_EffUse_HPC_Turns(Effect, hpCMap, CooldownTurns, UseChance, PersPointer, ExceptArtId, ExceptArtIdPersPointer) local ReturnValue = false if (Effect ~= nil) and (hpCMap ~= nil) then -- Инициализируем Cmn_EffUse_HPC_Turns_init(Effect) -- Применяем эффект, если надо ReturnValue = Cmn_EffUse_HPC_Turns_use(Effect, hpCMap, CooldownTurns, UseChance, PersPointer, ExceptArtId, ExceptArtIdPersPointer) end return ReturnValue end ------------------------------------------------End HPC Turns---------------------------------------------------- -------------------------------------------------Chance Turns----------------------------------------------------- function Cmn_EffUse_Chance_Turns_init(Effect) -- Инициализация, выполняется однажды при создании боя local botId = PERS_ID(my.persPtr) if sbot_state == nil then sbot_state = {} end if sbot_state[botId] == nil then sbot_state[botId] = {} end -- Инициализация признака первого хода if (sbot_state[botId].CurUsage == nil) then sbot_state[botId].CurUsage = {} end if (sbot_state[botId].CurUsage[Effect] == nil) then sbot_state[botId].CurUsage[Effect] = 1 end -- Здесь хранится номер следующего применения эффекта if (sbot_state[botId].CurTurn == nil) then sbot_state[botId].CurTurn = 1 end --Если вдруг по какой-то причине CurTurn не определен if (sbot_state[botId].NextUseTurn == nil) then sbot_state[botId].NextUseTurn = {} end if (sbot_state[botId].NextUseTurn[Effect] == nil) then sbot_state[botId].NextUseTurn[Effect] = sbot_state[botId].CurTurn end -- Инициализируем следующее использование в 1-й (первый) ход end function Cmn_EffUse_Chance_Turns_use(Effect, MaxUse, CooldownTurns, UseChance, PersPointer, ExceptArtId, ExceptArtIdPersPointer) --[[ -- Применение эффекта, который должен использоваться каждый ход с некоторым шансом, если прошел его кулдаун -- Параметры: - Effect - ID эффекта - (необязательный параметр) MaxUse - Максимальное число использований. По-умолчанию 30000 - (необязательный параметр) CooldownTurns - Кулдаун эффекта (в ходах). По-умолчанию - 0 - (необязательный параметр) UseChance - Шанс использования в данный ход. По-умолчанию - 100% - (необязательный параметр) PersPointer - указатель на то, на кого применять заклинание (себя или противника). По-умолчанию - на себя - (необязательный параметр) ExceptArtId - массив id-шников эффектов. Если хоть один из этих эффектов висит на ExceptArtIdPersPointer, то эффекты не применяются. По-умолчанию - пустой, не проверяем - (необязательный параметр) ExceptArtIdPersPointer - указатель на перса на котором проверять эти эффекты. По-умолчанию - на себя -- Логика: -- Ход следующего применения эффекта храним в переменной state.NextUseTurn. -- Если истек кулдаун и применения не закончились, то применяем эффект в шансом UseChance -- ВНИМАНИЕ! Требует после себя удара с завершением хода!!! ]] local ReturnValue = false if (Effect ~= nil) then if (my.status == FS_PS_ACTIVE) then if (MaxUse == nil) then MaxUse = 30000 end --Задаем максимальное число использований по-умолчанию 30000 if (CooldownTurns == nil) then CooldownTurns = 0 end --Задаем нулевой кулдаун по-умолчанию if (UseChance == nil) then UseChance = 1 end --Задаем 100%-ю вероятность по-умолчанию if (PersPointer == nil) then PersPointer = my.persPtr end --Задаем себя в качестве указателя цели эффекта по-умолчанию if (ExceptArtId == nil) then ExceptArtId = nil end --Задаем пустой массив на проверку if (ExceptArtIdPersPointer == nil) then ExceptArtIdPersPointer = my.persPtr end --По-умолчанию проверяем эффекты на себя if (type(ExceptArtId) == "number") then --Если ExceptArtId задана числом - преобразуем его в таблицу local TMP_var = ExceptArtId ExceptArtId = {} ExceptArtId[1] = TMP_var end local botId = PERS_ID(my.persPtr) local state = sbot_state[botId] local dice = math.random() local IsArtId = false local CurTurn = state.CurTurn -- Пробегаем по массиву эффектов-исключений и если хоть один из них висит на ExceptArtIdPersPointer, то ставим флаг IsArtId - не "стрелять" if (ExceptArtId ~= nil) then for _, ArtId in pairs(ExceptArtId) do if (#aux.activeEffects(ExceptArtIdPersPointer, { artId = ArtId }) > 0) then IsArtId = true end end end if (state.CurUsage[Effect] <= MaxUse) and (CurTurn >= state.NextUseTurn[Effect]) and (dice <= UseChance) and (IsArtId == false) then local EffectUsed EffectUsed = aux.useEffect(Effect, PersPointer) state.CurUsage[Effect] = state.CurUsage[Effect] + 1 state.NextUseTurn[Effect] = CurTurn + CooldownTurns if (EffectUsed ~= false) and (EffectUsed ~= -100) then ReturnValue = true end end end -- if FS_PS_ACTIVE end -- if all initials exist return ReturnValue end function Cmn_EffUse_Chance_Turns(Effect, MaxUse, CooldownTurns, UseChance, PersPointer, ExceptArtId, ExceptArtIdPersPointer) local ReturnValue = false if (Effect ~= nil) then -- Инициализируем Cmn_EffUse_Chance_Turns_init(Effect) -- Применяем эффект, если надо ReturnValue = Cmn_EffUse_Chance_Turns_use(Effect, MaxUse, CooldownTurns, UseChance, PersPointer, ExceptArtId, ExceptArtIdPersPointer) end return ReturnValue end -----------------------------------------------End Chance Turns---------------------------------------------------- -------------------------------------------------Turns Counter----------------------------------------------------- function Cmn_EffUse_Turns_init() local botId = PERS_ID(my.persPtr) if sbot_state == nil then sbot_state = {} end if sbot_state[botId] == nil then sbot_state[botId] = {} end -- Инициализация признака первого хода if (sbot_state[botId].CurTurn == nil) then sbot_state[botId].CurTurn = 0 end end function Cmn_EffUse_Turns_AddTurn() local ReturnValue = false if (my.status == FS_PS_ACTIVE) then local botId = PERS_ID(my.persPtr) local state = sbot_state[botId] state.CurTurn = state.CurTurn + 1 ReturnValue = true end return ReturnValue end function Cmn_EffUse_Turns_Counter() --[[ Функция необходимая дла подсчета колическтва ходов Нужна для функкций ..._Turns (является для них как бы аналогом os.time()) Вызывать надо перед всеми абилками, но после if (my.status == FS_PS_ACTIVE) ВАЖНО!!! Вызывать один раз ]] local ReturnValue = false Cmn_EffUse_Turns_init() ReturnValue = Cmn_EffUse_Turns_AddTurn() end ---------------------------------------------End Turns Counter----------------------------------------------------- --------------------------------------------------- boss guard ---------------------------------------------------- function boss_guard_init(shieldId) -- Инициализация, выполняется однажды при создании боя local botId = PERS_ID(my.persPtr) if sbot_state == nil then sbot_state = {} end if sbot_state[botId] == nil then sbot_state[botId] = {} end -- Инициализация признака первого хода if (sbot_state[botId].Summoned == nil) then sbot_state[botId].Summoned = 0 end -- Здесь число призванных миньонов if (sbot_state[botId].nextCheck == nil) then sbot_state[botId].nextCheck = os.time() end -- Переменная для синхронных проверок --[[ local Team1 = (aux.getPersList(aux.oppTeamNum(), true, nil,false)) local maxOppLevel = 0 if Team1 and Team1[1] then for _, persPtr in pairs(Team1) do local pers = PERS(persPtr) if (maxOppLevel < pers.level) then maxOppLevel = pers.level end end end local allyteam = (aux.getPersList(my.teamNum, true, nil, false)) if allyteam and allyteam[1] then for _, persPtr in pairs(allyteam) do local ally = persPtr if (ally.level < maxOppLevel) then aux.useEffect(shieldId,persPtr) end end end]] end function boss_guard_run_once(shieldId) local state = sbot_state[PERS_ID(my.persPtr)] if (state.FirstRun == nil) then -- Put here what you want to run once state.FirstRun = true end end function boss_guard_between_hits(antivampId, CheckTO, weakId) local botId = PERS_ID(my.persPtr) local state = sbot_state[botId] local ostime = os.time() if (state.nextCheck <= ostime) then -- Gamelogic Start local oppteam = (aux.getPersList(aux.oppTeamNum(), true,nil,false)) if oppteam and oppteam[1] then for _,persPtr in pairs(oppteam) do if (#aux.activeEffects(persPtr, {artId = antivampId}) == 0) then aux.useEffect(antivampId,persPtr) end if (#aux.activeEffects(persPtr, {artId = weakId}) == 0) then aux.useEffect(weakId,persPtr) end end end -- Gamelogic Stop state.nextCheck = ostime + CheckTO end end function boss_guard_before_hit(breakerId) --Cmn_EffUse_Chance_Time(breakerId,100000,20,1,my.oppPtr,nil,nil) end function boss_guard_hit(breakerId) if (my.status == FS_PS_ACTIVE) then Cmn_EffUse_Chance_Turns(breakerId,10000,0,0.35,my.oppPtr,nil,nil) boss_guard_simple_hit() end end function boss_guard_simple_hit() if (my.status == FS_PS_ACTIVE) then -- обычная атака ATTACK(math.random(3)) end end function boss_guard() local shieldId = 34097 boss_guard_init(shieldId) boss_guard_run_once(shieldId) local antivampId = 34094 local CheckTO = 1 local weakId = 34096 boss_guard_between_hits(antivampId, CheckTO, weakId) local breakerId = 33758 boss_guard_before_hit(breakerId) boss_guard_hit(breakerId) end --------------------------------------------------- boss guard ---------------------------------------------------------