Скрипт "После каждого боя". Призыв, лимитируемый событием, и не только.

    В прошлом примере на работу с новым дэйликом нашлись желающие узнать про принудительный призыв в совмещении с исходным пещерным режимом, посему размещаю материал по этому направлению. Кроме того после рассмотрю альтернативный вариант переключения режимов с контролем состояния событий. Поехали.
    Призыв - по сути это разбор свитка. То есть, если мы разберем 1шт. свитка в любом скрипте, в пещеру прилетит соответствующий монстр. Конечно не стоит этого делать, если текущий режим не является пещерным, ведь тогда программа просто не увидит изменений, т.к. не заглядывает в пещеру (хотя наверное стоит подумать над отдельным вариантом принудительной проверки пещеры на уже находящегося в ней монстра и его атаки. Тогда призвать и атаковать одного монстра можно будет с любого режима). На мой взгляд наиболее удобной точкой для подобной работы является скрипт "После каждого боя". Он хорош своей цикличностью и тем, что не мешает проведению боев в разных режимах (на момент запуска нет активного боя и пока не планируется новый).
    Один бой закончен, с высокой долей вероятности прошлый монстр убит (пока невозможно проверить, так что допущение). Нам нужно убедиться, что текущим является Пещерный режим, и проверить какое-то событие, чтобы определить нужно ли там еще призывать (оно должно изменяться в процессе нашей деятельности), например, сколько ледяных червей добито петардой. Если не достаточно для закрытия дэйлика - призываем еще одного разбором. Дальше функция пещерного режима обнаружит этого монстра и применит к нему действие (из общего списка монстров, стоит там выставить атаку всего дропа). Затем снова сработает скрипт "После каждого боя" и, если нужно, засунет в пещеру еще одного монстра. Процесс будет повторяться по кругу пока активным остается Пещерный режим и событие добива меньше какого-то значения. Как только оно выйдет за рамки, наш самопальный призыв не сработает, пещера останется чистой (без монстра) и продолжит работать стандартная пещерная функция.
    Это была текстовая теория. Теперь ближе к практике. Для формирования условных конструкций в Lua есть особая пропись:
 
if <условие/проверки> then
<произвольное число команд, выполняемых, если итог проверок - истина>
end
 
    По-русски это можно расшифровать как:
 
Если <условие/проверки> То
<произвольное число команд, выполняемых, если итог проверок - истина>
Конец условия
 
    <Условие> может содержать несколько проверок соединенных между собой логическими операторами: and (_И_), or (_ИЛИ_). 
 
    Для аналогии на более понятном русском языке:

Если _сегодня == "четверг" _И_ _наНебе == тучи То
    Обуть непромокаемые сапоги
    Взять зонт
    Посетовать на никудышную погоду
Конец условия 
 
    -- Действия выполнятся исключительно при одновременном выполнении обоих проверок (облачный четверг). Если поставить между _ИЛИ_, то достаточно будет либо только четверга на календаре, либо только туч. Можно составлять и более сложные бутерброды с несколькими _И_ _ИЛИ_.
 
Отдельная проверка на текущий режим выглядит так:
getWorkMode(--[[возвращает текущий режим]]) == modeCave--[[Пещерный]]
или, если убрать комментарии:
getWorkMode() == modeCave
 
Получить состояние события:
getTriggerValue(--[[код события, возвращает его значение]]) 
Для контроля того, что добив петардой еще не завершен:
getTriggerValue(11140) < 5
 
Итоговое условие с призывом будет иметь следующий вид (можно скопировать и вставить в скрипт "После каждого боя"):
if getWorkMode() == modeCave and getTriggerValue(11140) < 5 then 
    dismantleObj( --Разобрать в сундуке
       {17553--[[Свиток_Призыва_Ледяного_Червя]]}, --предмет
       1) -- 0 =все что есть, >0 =указанное число, <0 =все, кроме указанного
end 

    Так же в этом скрипте ("После каждого боя") можно контролировать выполнение дэйликов завязанных на смену режимов. Пропись объемнее, но контроль лучше.
    Для отдельно дэйлика на добычу Богатырского сундука. ЕСЛИ событие не выполнено, включить Вихрь, ИНАЧЕ, ЕСЛИ мы в вихре и событие уже закрыто, уйти в другой режим (например начальный режим, с которого был осуществлен Старт).
    Для выполнения этой задачи нам нужна расширенная пропись условия.
 
if <условие/проверки> then
<произвольное число команд, выполняемых, если итог проверок - истина>
else
<произвольное число команд, выполняемых, если итог проверок - ложь>
end
 
Если ... То
...
Иначе
...
Конец условия
 
    Причем в "Иначе" вставится еще один полноценный блок "Если". Обратите внимание, что внутреннее условие должно закрыться своим отдельным end`ом. Для удобства восприятия вложенные уровни кода имеют отступы.
-- код на выполнение только дэйла на богатырский сундук
if getTriggerValue(9854) < 5 then
   --событие не закрыто
   setWorkMode( --Изменить_режим_работы_на
      modeVortex--[[Вихрь]])
else
   if getWorkMode() == modeVortex--[[Вихрь]] then 
      --событие закрыто и мы все еще в вихре
      restoreMainWorkMode(--[[восстановить начальный режим]])
   end
end
 
    Если дополнительно нужно выполнить задание на добитие червя и Пещерный режим не используется на персе в течении дня, то код усложняется и итоговый вид будет выглядеть так
-- код на выполнение  сначала дэйла на богатырский сундук, а после на добив червя
 
if getTriggerValue(9854) < 5 then
    --событие на богатырский сундук не закрыто
    setWorkMode( --Изменить_режим_работы_на
        modeVortex--[[Вихрь]])
else
    --событие на богатырский сундук закрыто
    if getTriggerValue(11140) < 5 then
        -- но незакрыт добив петардой, уходим в Пещерный
        setWorkMode( --Изменить_режим_работы_на     
            modeCave--[[Пещерный]])
    else
        --закрыты оба события
        if getWorkMode() == modeCave then
            -- срабатывать только если Пещерный текущий
            restoreMainWorkMode(--[[восстановить начальный режим]])
        end
    end   
end
    --Дальше разместить код нашего скрипт-призыва.
if getWorkMode() == modeCave and getTriggerValue(11140) < 5 then 
    -- текущий режим Пещерный и черви недобиты, призвать туда 1 червя
    dismantleObj( --Разобрать в сундуке
       {17553--[[Свиток_Призыва_Ледяного_Червя]]}, --предмет
       1) -- 0 =все что есть, >0 =указанное число, <0 =все, кроме указанного
end
 
    По старому варианту из скрипта "Начала каждых квестовых суток" нужно удалить переход в вихрь
-- уйти в вихрь набивать победы
setWorkMode( --Изменить_режим_работы_на
    modeVortex--[[Вихрь]])

    Вот этот кусок кода - УДАЛИТЬ из скрипта "Начала каждых квестовых суток".
    Переключение режимов будет производится через текущий "После каждого боя".

Комментариев нет:

Отправить комментарий

Примечание. Отправлять комментарии могут только участники этого блога.