-- $Id: bot_Ispolin.lua,v 1.45 2010-02-27 14:37:02 a.abolishin Exp $ --[[ AKEB (c) 21.08.2008 2:46 a.abolishin Бот Исполин ПЕРЕД УДАРОМ: - При наличии манны М1, с вероятностью summonInfo.r применяется абилка "призыв Уйаррмо", либо с вероятностью 1-summonInfo.r применяется абилка "призыв Эгну". - Если был призыван Эгну, то дополнительно произойдет отлечка 10 союзников Исполина (ботов с id'шками summonInfo.botIds). - Проверяется наличие A1(маналинка) на всех игроках. После чего бот должен восстановить себе x*N манны, где N кол-во стоящих на противниках абилок A1(маналинков), используя абилки, восстанавливающие x, 2x, 4x, 8x, 16x, 32x. - С вероятностью C1 применяет абилку A1(маналинк) на C3 случайных противников. Не применяет на игроков с уже наложенной абилкой A1(маналинк). ВМЕСТО УДАРА: - С вероятностью C2 применяется абилка A2(заряд), на текущего противника. Если до этого суммарное количество абилок A2, A3 и А4 на любом из этих противников было больше или равно C4, то на него сразу же применяется абилка A5. - Делается рандомный удар. Скрипт: bot_Ispolin.lua Управляющая функция: bot_Ispolin, bot_Ispolin_t --]] -- Стейт конкретного исполина if not bot_Ispolin_State then bot_Ispolin_State = {} end -- если таблица bit еще не создана - создаем if not bit then bit = {} local start = 1 for i=1, 7 do bit[i] = start start = start + start end end need_bit = {} function simple_bit(value, n) if (n == nil) then n = 0 end max_index = #bit max_index = max_index - n max = bit[max_index] if value == 0 then return end if value >= max then table.insert(need_bit, max_index) value = value - max else n = n + 1 end return simple_bit(value, n) end function bot_Ispolin_r(A, C, manalink, summonInfo) local bot = PERS(my.persPtr) -- инициализация if not bot_Ispolin_State[bot.id] then -- summoned - призыв Шеары -- healCnt - кол-во ботов ожидающих отлечку (жуководство) bot_Ispolin_State[bot.id] = { summoned = false, healCnt = 0 } end -- призыв Шеары if not bot_Ispolin_State[bot.id].summoned then local persPtr = aux.getPersList(aux.oppTeamNum(), true, true, nil, 1) if persPtr and (#persPtr > 0) then local status, usageStatus = aux.useEffect({artId = A[6]}, persPtr[1]) if status == 0 then bot_Ispolin_State[bot.id].summoned = true end end end -- если наш статус неактивный, ничего не делаем if my.status ~= FS_PS_ACTIVE then return end -- призыв Уйаррмо/Эгну local mana = bot.mp for i=1, C[5] do if mana < summonInfo.mp[1] + summonInfo.mp[2] then break end -- рандомно призываем одного бота local r = math.random() local summonSet = ((i == 1) and 1) or 2 if r <= summonInfo.r then aux.useEffect({artId = summonInfo.artIds[summonSet][1]}) mana = mana - summonInfo.mp[1] else aux.useEffect({artId = summonInfo.artIds[summonSet][2]}) mana = mana - summonInfo.mp[2] bot_Ispolin_State[bot.id].healCnt = bot_Ispolin_State[bot.id].healCnt + summonInfo.healCnt end end -- Если призвали Эгну, то надо еще и подлечить своих союзников. -- Кол-во союзников зависит от кол-ва призванных Эгну. if bot_Ispolin_State[bot.id].healCnt > 0 then local healed = 0 local persList = aux.getPersList(my.teamNum, true, true) if persList then for _,persPtr in pairs(persList) do local pers = PERS(persPtr) if aux.inTable(pers.artId, summonInfo.botIds) and (#aux.activeEffects(persPtr, {artId = summonInfo.heal}) < 1) then aux.useEffect({artId = summonInfo.heal}, persPtr) healed = healed + 1 bot_Ispolin_State[bot.id].healCnt = bot_Ispolin_State[bot.id].healCnt - 1 if (bot_Ispolin_State[bot.id].healCnt < 1) or (healed > C[7]) then break end end end end end -- Проверяется наличие A1(маналинка) на всех игроках. После чего бот должен восстановить себе x*N манны, -- где N кол-во стоящих на противниках абилок A1(маналинков), используя абилки, -- восстанавливающие x, 2x, 4x, 8x, 16x, 32x. -- С вероятностью C1 применяет абилку A1(маналинк) на N1 случайных противников. -- Не применяет на игроков с уже наложенной абилкой A1(маналинк). local persList = PERS_LIST(aux.oppTeamNum(), true) local sumMana = 0 local persCount = 0 for _, persPtr in pairs(persList) do local cnt = #aux.activeEffects(persPtr, {artId = A[1]}) -- если маналинк уже есть, то считаем его if cnt > 0 then sumMana = sumMana + cnt else -- если же его нету, то возможно стоит кинуть if (persCount < C[3]) and aux.randRoll(C[1]) then aux.useEffect({artId = A[1]}, persPtr) persCount = persCount + 1 end end end if sumMana < C[6] then simple_bit(sumMana) if #need_bit > 0 then for k, v in pairs(need_bit) do aux.useEffect({artId = manalink[v]}) need_bit[k] = nil end end else aux.useEffect({artId = manalink[7]}) end -- Физ атака или парализующий заряд if aux.randRoll(C[2]) then -- считаем парализующие заряды и потоки local effCount = 0 for _,effPtr in pairs(EFF_LIST(my.oppPtr)) do local eff = EFF(effPtr) if eff.active and ((eff.artId == A[2]) or (eff.artId == A[3]) or (eff.artId == A[4])) then effCount = effCount + 1 end end -- кидаем еще один заряд local status = aux.useEffect({artId = A[2]}, my.oppPtr) if status ~= 0 then ATTACK(math.random(3)) -- и паралич, если надо elseif (effCount >= C[4]) and (status == 0) then aux.useEffect({artId = A[5]}, my.oppPtr) end else ATTACK(math.random(3)) end end -- botId = 703 if not bot_Ispolin then -- маналинк, парализующий заряд, парализующий поток, парализующий заряд, паралич, нападение на Шеару bot_Ispolin_Abilities = {3913, 3912, 3444, 3445, 3446, 4202} -- Перекачка маны с игроков (маналинк) bot_Ispolin_ManalinkAbils = {3916, 3917, 3918, 3920, 3921, 3922, 6914} -- вероятность кинуть маналинк на игрока, вероятность использовать парализующий заряд, -- максимальное кол-во новых маналинков за ход, кол-во зарядов для паралича, кол-во призывов за ход, -- кол-во маналинков для полного восстановления маны, максимально жуководство за ход bot_Ispolin_Const = {0.67, 0.25, 3, 3, 3, 48, 4} -- r - вероятность призыва artIds[x][1]/artIds[x][2] -- artIds - абилки призыва: [1] - с анимацией, [2] - без анимации -- mp - кол-во на каждый из призывов -- heal - лечилка на случай призыва Эгну (artIds[x][2]) -- botIds - лечилка работает только на этих ботах -- healCnt - кол-во отлечек за один призыв bot_Ispolin_SummonInfo = { r = 0.6, artIds = {{3915, 3914}, {4770, 4771}}, mp = {500, 750}, botIds = {672, 673, 701}, heal = 3948, healCnt = 10 } end function bot_Ispolin() bot_Ispolin_r(bot_Ispolin_Abilities, bot_Ispolin_Const, bot_Ispolin_ManalinkAbils, bot_Ispolin_SummonInfo) end function bot_Ispolin_t() bot_Ispolin_r(bot_Ispolin_Abilities, bot_Ispolin_Const, bot_Ispolin_ManalinkAbils, bot_Ispolin_SummonInfo) end