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

    В прошлом примере на работу с новым дэйликом нашлись желающие узнать про принудительный призыв в совмещении с исходным пещерным режимом, посему размещаю материал по этому направлению. Кроме того после рассмотрю альтернативный вариант переключения режимов с контролем состояния событий. Поехали.
    Призыв - по сути это разбор свитка. То есть, если мы разберем 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--[[Вихрь]])

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

 Праздник к нам приходит!

    Приближается главный праздник года и в связи с этим я объявляю начало традиционной для этого периода празднования акции. Уже сейчас вместо цифр остатка по лицензии вы можете наблюдать надпись "бесплатный период". Это означает, что этот самый остаток перестанет уменьшаться по 7 января 2022 года включительно! Халява, сэр. И пусть никто не уйдет обиженным =) 

    Кроме того с завтрашнего дня начнут действовать праздничные расценки на продление времени лицензий (с 26.12.2021 по 31.01.2022). Изменения на соответствующей странице на сайте появятся чуть позже (конкретные цифры еще летят к нам в санях Санты =) ).

    Хоу-хоу-хоу. Прекрасной встречи Рождества и Нового Года!

 Дэйлик основы кулинарии.

    Продолжаю будоражить умы недоступным для понимания =). Сегодня на рассмотрении очередной дэйл.
 
    Сразу необходимо объявить ряд допущений. Я исхожу из принципа, что сила перса достаточна для реализации "одно применение элика - мгновенная смерть монстра без вариантов". Поэтому само добитие организуется через отдельное правило для каждого монстра с таким содержимым для примера.
    Елка и Кудах прекрасно вписываются в ранее описанную настройку на "Рождественские приключения 1 и 2": http://heavengameonline.blogspot.com/2021/12/blog-post_18.html Все, что нужно, - по аналогии с теми же действиями задать ежедневную атаку пяти Кудахов и восьми Елок. В качестве действия выбрано "Нужный дроп", чтобы пользователь смог реализовать поиск нужных ему предметов.
setMonsterParam( --МОНСТР-комплект параметров
    2000004806--[[Кудах(9ур.)]], --монстры
    monActCheckDropAttackElseGone--[[Нужный_дроп->атака]], --общее действие для них
    5) --счетчик побед до сброса
setMonsterParam( --МОНСТР-комплект параметров
    2000004720--[[Елка(10ур.)]], --монстры
    monActCheckDropAttackElseGone--[[Нужный_дроп->атака]], --общее действие для них
    8) --счетчик побед до сброса 
    Или же вот тоже самое, но с атакой всего дропа, если вы считаете, что весь дроп там - хлам, и нужно быстро набить нужное число побед и забыть до следующего дня.
setMonsterParam( --МОНСТР-комплект параметров
    2000004806--[[Кудах(9ур.)]], --монстры
    monActAttackAllDrop--[[Атаковать_весь_дроп]], --общее действие для них
    5) --счетчик побед до сброса
setMonsterParam( --МОНСТР-комплект параметров
    2000004720--[[Елка(10ур.)]], --монстры
    monActAttackAllDrop--[[Атаковать_весь_дроп]], --общее действие для них
    8) --счетчик побед до сброса
    Нужный вариант можно скопировать и добавить к существующему коду тут.
    С червем пропись потребуется в другом месте. Следующее допущение, персонаж основным режимом имеет островной, а значит надо сходить в пещеру только для добития червей. Настроить на совмещение с основным пещерным в принципе можно, но подход там другой, да и окончание работы с островными монстрами должен быть дополнительно объемно описан. Если нужно оставляйте пожелание под статьей, попробую выжать из себя и эту мысль =).
    Итак к крестям, ой, червам-червям. Нужно временно уйти в пещеру, а после закрытия события добива вернуться на острова. В прошлом варианте скрипта "Начала каждых квестовых суток" переход на режим у нас уже занят Вихрем (для добычи богатырского сундука). Перейти одновременно к Вихрю и Пещере нельзя. Последовательно в этом же, запускаемом один раз в сутки, скрипте также. Но можно вставить пещеру в точку возврата из вихря в острова. Точнее схема выглядит так. В начале  квестовых суток уходим в вихрь, через пять побед прыгаем в пещеру, а после закрытия добива - на острова. Все настройки выполняем на вкладке "Разное" - "События". 
1. В прошлом варианте реакции на 5 вихрь-побед меняем режим не на острова, а на Пещерный. Можно просто поставить курсор ввода на старое обозначение режима. В списке шаблона выбрать новый и нажать Заменить.
Либо вот готовый полный текст: setWorkMode(modeCave--[[Пещерный]])
2. Добавить контроль события добива червя, а нем используем такую же команду смены режима, но на Островной режим. Производим поиск по тексту, входящему в событие. Из нескольких добивов выбираем именно "Новогодней петардой". Перетаскиваем событие в верхний список. Задаем контроль " >= 5 " (можно использовать и " == 5 "). Кликаем в поле "Скрипт", где нужно задать переход в островной режим.
setWorkMode(modeIsland--[[Островной]])
    Не забываем проверить активность контроля событий в целом (галочку тут):
 

 Сражаемся с НГ-дэйликами.

    Очередной выпуск "Очень интересно, но ни фига не понятно =)". Сегодня рассматриваем облегчение жизни в рамках ежедневных заданий в рамках НГ-ивента.
    Их достаточно много и они густо увязаны друг с другом. Условно можно выделить несколько общих частей.
1. Убить определенное число монстров. Это решается через скрипт-команду установки параметров монстра (атакующего действия и счетчика, ограничивающего число побед). Наиболее просто произвести копирование параметров уже выставленных в настройках программы через шаблон на панели редактора скриптов. Причем назначение по монстрам стоит производить в скрипте "Начала каждых квестовых суток" (находится в окне настроек на "Общие - Ссылки на скрипты".
    Далее просто настраиваем атаку обычным порядком, а затем копируем параметры монстра в скрипт для последующего ежедневного восстановления, перетаскивая монстра на надпись шаблона "Параметры - Монстр - Комплект основных".
    Для добавления новой команды в скрипт переставляем курсор ввода текста на новую чистую строку. И по аналогии со скрином выше назначаем лимитированную атаку остальным монстрам.
    Отдельной позицией идет назначение атаки босса, т.к. взаимодействие с ним реализуется через отдельный список босс-планирования, а значит и команда выставления параметров другая. Этот функционал доступен в помощниках версии 2168.2 или выше. Открываем список босс-планировщика. Затем параметры "Великого снегоступа" в отдельном окне (да, на скрине другой монстр, но принцип тот же). Выставляем рейт-атаку и счетчик срабатываний в 1, чтобы босс был атакован всего один раз в текущих сутках, а с новых исходные параметры будут восстановлены скриптом. Опцию число нападений в значение 10 (нам же больше нападений и не нужно, правильно?) Далее копируем это состояние в скрипт-пропись через ссылку вверху окна редактирования.
    Кроме того нужно будет включить работу планировщика галочкой "Включить поиск боссов" вверху списка + задать приемлемый интервал поиска-опроса в течении часа (последнее на ваше усмотрение).
Скопированную команду можно вставить в скрипт с новой чистой строки.
2. Дарение подарков. Тут без друзей не обойтись) Через скрипт можно дарить определенные подарки строго определенным игрокам через команду
sendSocialGift(--[[артикул подарка]],{}) --{массив,ИД,игроков,через,запятую}
Артикул подарка отображается в первой графе списка расширенного отдаривания.
"Мандариновый завал" = 65
sendSocialGift(65,{ИД_МИТИ})
"Дар новогоднего веселья" = 181
 sendSocialGift(181,{ИД_ПЕТИ})
 ИД конечно же надо подставлять какие-то свои.
 3. Одержать побед в боях вихря. Пропись этого момента состоит из двух частей: перевод перса в вихрь в начале квестовых суток все в том же скрипте и включение островного режима при наборе нужного числа побед. Второе производится в отдельном месте. Причем наверное стоит бить не две вихрь-победы, а пять, чтобы заодно закрыть и этот дэйлик.
    Отлов выполнения нужно числа побед производится через список контроля событий. Узнаем код события через список дневных квестов (в рабочем окне программы меню "Окна" - "Коллекции, дэйлики, медали" - "Ежедневные задания").
 
    По этому коду окне настроек "Разное" - "События" производим поиск нужного для контроля и добавляем его в верхний список перетаскиванием.
    Поля "Сравнение" и "Цель" приводим к виду " == " и " 5 " соответственно. Над списком проставляем галочку "Активировать" для включения контроля и запуска скриптов при совпадении условия. Осталось дело за скриптом. Кликаем в поле "Скрипт" справа. В открывшемся скрипте указываем переключение в островной режим (нам ведь еще монстряков там изничтожать).
setWorkMode(modeIsland--[[Островной]])
4. Применение эликсиров. Если применение мандарина достаточно легко лимитировать количеством атак самого босса (10 нападений по отдельному правилу с применением мандарина только на первом ходу), то с "Дух Нового Года" и "Новогодняя петарда", все чуть по-другому. Эликсиры добавляются в любое часто используемое правило, например "В остальных боях". Каждому из них активируется глобальный счетчик применения (с галочкой на "Общ." слева).
    Тогда устанавливается связь счетчика применения в бою со специальным параметром на предмете, который в свою очередь можно изменять через скрипт. Приведу сразу готовую пропись для обоих эликов.
setObjSpecParam({21770--[[Дух_Нового_Года]],21769--[[Новогодняя_петарда]]},15)
Все равно уровень понимания уже наверное на нуле, даже если и присутствовал в начале =).
Итак подытожим. В рассмотренных дэйликах есть ряд общих действий, одинаковых для всех. И есть индивидуальные (дарение подарков). Основная часть прописи помещается в скрипте "Начала каждых квестовых суток". Общая часть в нем имеет следующий вид.
-- атака монстров на НГ-охотник
setMonsterParam(2000001418--[[Снегуречек(3ур.)]], --монстры
    monActAttackAllDrop--[[Атаковать_весь_дроп]], --общее действие для них
    4) --счетчик побед до сброса
setMonsterParam(2000001411--[[Дядя Мороз(3ур.)]], --монстры
    monActAttackAllDrop--[[Атаковать_весь_дроп]], --общее действие для них
    2) --счетчик побед до сброса
-- атака похитителя
setMonsterParam(2000005084--[[Похититель Рождества(7ур.)]], --монстры
    monActCheckDropAttackElseGone--[[Нужный_дроп->атака]], --общее действие для них
    7--[[7]]) --счетчик побед до сброса
-- атака талого снеговика
setBossSchedulerItem(2000004954--[[Талый cнеговик]],2,1,10,0,0,0,6,1)
-- применение эликов в обычных боях
setObjSpecParam({21770--[[Дух_Нового_Года]],21769--[[Новогодняя_петарда]]},15)
-- подарить подарки - скопировать шаблоны из новости и вставить свои ИД

-- уйти в вихрь набивать победы
setWorkMode( --Изменить_режим_работы_на
    modeVortex--[[Вихрь]])

Кроме того это же можно скачать отдельным файлом отсюда: дэйлы_рождественское_приключение_1_2_3.lua. Данный скрипт можно загрузить в редактор с помощью ссылок в нижней его части. Внимание, загрузка файла заменит все содержимое, что было в нем до этого.
Индивидуальная часть выглядит следующим образом.
sendSocialGift(65--[[Мандариновый_завал]],{ИД_МИТИ})
sendSocialGift(181--[[Дар новогоднего_веселья]],{ИД_ПЕТИ})
где ИД_МИТИ и ИД_ПЕТИ ваши личные данные кому отправлять подарок.
Кроме того вот файл контроля числа побед в вихре и переключения на островной режим когда их станет 5: триггер_на_выкл_Набить_5_Вихрей.cpss
Загрузить его в программу можно с помощью ссылки над списком контроля.

Кроме того эликсиры "Дух Нового Года" и "Новогодняя петарда" должны быть заранее добавлены в список (или списки) применения как показано выше. Правило боя с талым снеговиком я не рассматривал, но его вам нужно задать самостоятельно.