Сообщество Империал: Основы и немного о счетчиках (Medieval 2: Total War) - Сообщество Империал

Norinke

Основы и немного о счетчиках (Medieval 2: Total War)

Основы и немного о счетчиках, а так же с чем они связанные
Тема создана: 22 марта 2020, 04:37 · Автор: Norinke
  • 7 Страниц
  • 1
  • 2
  • 3
  • 4
  • Последняя »
 2 
 Norinke
  • Imperial
Imperial
Отец моддинга

Дата: 22 марта 2020, 04:37

Imp


Такс, решил я тут начать по чучуть писать туториалы по скриптам, для начала возьму самое просто это счетчики, а так же затрону минимальные основы для создания скрипта

Со временем надеюсь напишу по всем командам, а так же условиям и евентам, возможно напишу докумендос по комадам на подобии зелено глазого с ТВЦ

Оффтоп (контент вне темы)



Это основа которую мы будем использовать

     monitor_event < команда которая вызывает проверку события

     terminate_monitor < отключить монитор без возможности его восстановления, все что написано после этой команды не ликвидно

     end_monitor < окончание нашего монитора


А теперь более понятно на примере

|

     monitor_event FactionTurnStart < когда начинается ход какой либо фракции, запускается наш монитор
     terminate_monitor
     end_monitor


Но ясно дело этого нам мало, в целом в игре есть 220 с хвостиком событый которые она проверяет
и так же 410 с хвостиком условий и 240 с чем-то команд, со временем надеюсь обясню по всем

Вот как выгляди к примеру проверка на ход Швеции

|

     monitor_event FactionTurnStart FactionType sweden
     terminate_monitor
     end_monitor

     FactionTurnStart < проверка события начало хода какой либо фракции

     FactionType < проверка какой тип фракции начал ход, если не швеция, то игнорит

Небольшое примечание, мы не может использовать все существующие проверки к FactionTurnStart
к примеру мы не можем использовать проверку SettlementName, потому что это же не город(ваш кеп)

Мы можем использовать только те что касаются фракций, а так же универсальные, которые не имею привязки к фракции, поселению, человеку и т.д.

К примеру I_CompareCounter, является универсальным

В то время как FactionType может применятся к тем евентам, которые имеют информацию о фракции


Чтобы было еще понятнее FactionTurnStart знает только о фракциях и не более, можно проверить казну, тип фракции, религию и т.д., не более

А BecomesFactionLeader уже знает больше, это событие что персонаж становится лидером какого либо альянса, тут уже мы можем
проверять записи по персонажу, фракцию, проверить регион где стоит и еще всякое, но опять таки, здесь еще нужно следовать логике, к числу записей по персонажу подходит такая проверка как "WonBattle", но она же не логичная, у нас сработало событие, что персонаж стал лидером, а не что окончилась битва, так не забавыйте о банальной логике

Так же у нас есть кроме обычного monitor_event есть

     monitor_conditions

Чем он отличается? Он работает исключительно с универсальными проверками, как I_BattleStarted(используется только во время бытвы), I_CompareCounter, I_SettlementOwner(карта глобальная) и т.д.
к примеру если нам нужно что-то сделать сразу же после того как счетчик I_CompareCounter принял значение 100, то мы можем использовать его

|

monitor_conditions I_CompareCounter TestCounter = 1
historic_event bla_bla_bla < показать сообщение
end_monitor


Но в таком случае не забывайте использовать terminate_monitor или изменить показания счетчика, а то вас заспамит сообщениями и ничего хорошо с этого не будет

|

monitor_conditions I_CompareCounter TestCounter = 1
historic_event bla_bla_bla < показать сообщение
set_counter TestCounter 2
end_monitor



Так же есть команда которая означает не, пример

|

     monitor_event FactionTurnStart not FactionType sweden
     terminate_monitor
     end_monitor


Она указывает, что событие пройдет проверку, только если ход не Швеции
Так же можно вместо not поставить !

|

     monitor_event FactionTurnStart ! FactionType sweden
     terminate_monitor
     end_monitor


Иногда нам нужно делать заметки, чтобы сами разобратся что мы написали, через определенное время, или к примеру хотим посмотреть что будет без определенной проверки или команды, тут нам на выручку приходя комментарии, ставятся они просто точная с зяпятой;

|

     monitor_event FactionTurnStart ! FactionType sweden
     ;historic_event war_with_Polan отключаем ибо захотелось
     set_counter war_Kiev 5 ; ставим счетчик на 5
     terminate_monitor
     end_monitor

все что после точки с зяпятой ; игнорируется

Надеюсь понятно объяснил основы, а теперь немножко о другом, о счетчиках и что с ними едят




Объявляем простой счетчик, который будет часто использоваться на самом то деле, хотя и может использоваться только внутри файла campaign_script

Объявление должно быть в обязательном порядке, и оно в самом начале имеет значение 0
     declare_counter < команда обявление
     war_start_after_2_ages < условное имя

     declare_counter war_start_after_2_ages

Обьявление должно быть перед тем как мы будем использовать наш счетчик, так же оно не должно быть в monitor_event
пример

|

declare_counter war_start_after_2_ages

monitor_event FactionTurnStart FactionType sweden
terminate_monitor
end_monitor


Присваиваем счетчику значение

     set_counter war_start_after_2_ages 100

Мы можем просвоить любое значение сразу же после обьвяления, оно сработает только 1 раз

|

declare_counter war_start_after_2_ages
set_counter war_start_after_2_ages 100

monitor_event FactionTurnStart FactionType sweden
terminate_monitor
end_monitor


Добавляем или отнимаем к счетчику значение
     inc_counter war_start_after_2_ages -50 или 10


Это условие которое проверяет показатель счетчика
     I_CompareCounter


Оно может использовать в условиях монитора

Цитата

monitor_event FactionTurnStart FactionType sweden < когда фракция Швеция начнет свой год
and I_CompareCounter war_start_after_2_ages = 1 < проверяем наше значение

set_counter war_start_after_2_ages 100

end_monitor


А так же внутри монитора может использовать

|

monitor_event FactionTurnStart FactionType sweden < когда фракция Швеция начнет свой год

if I_CompareCounter war_start_after_2_ages = 1
set_counter war_start_after_2_ages 100
end_if

end_monitor


Операторы = > < ! думаю всем знакомы еще со школы
= равно
< меньше
> больше
<= меньше равно
>= больше равно
!= не равно


Евентовый счетчик, он может использоваться почти везде и не нужно делать объявление, в отличии от простого счетчика counter

Так же любое историческое событие является евент счетчиком, к примеру любое событие из descr_event является счетчиком
event historic new_era_begins
date 180
Когда событие не случилось стоит 0, когда оно случится(в данном случае в 180 году), счетчик примет значение 1


     set_event_counter historic_event_Holy_War_2 56

Так же как и в обычном, добавить или отнять у счетчика
     inc_event_counter historic_event_Holy_War_2 -50 или 10

Создается случайный счетчик и выбирается случайное число от 1 до 20(границы могут быть и другие от 30 до 100 и т.д.)
     generate_random_counter RandomCounter 1 20

Команда совмещает в себе характеристики inc и random, то есть можно к примеру добавить случайное число в рамках от 10 до 20
использовать только на event_counter, к обычному не применять

     random_counter_inc RandomCounter 10 20


Отличие от обычного счетчик еще в том, что здесь есть собственная проверка изменяется ли event_counter

Срабатывает в случае изменения какого либо из счетчиков
     monitor_event EventCounter

Имя счетчика
     EventCounterType

Проверка числа
     EventCounter

|

monitor_event EventCounter EventCounterType historic_event_Holy_War_2
and EventCounter > 5

end_monitor



Так же есть как и в обычном счетчике проверка и может использоваться так же как и обычный
     I_EventCounter

|

monitor_event FactionTurnStart FactionType sweden
and I_EventCounter historic_event_Holy_War_2 = 1
set_counter historic_event_Holy_War_2 100
end_monitor


А так же внутри монитора может использовать

|

monitor_event FactionTurnStart FactionType sweden
if I_EventCounter historic_event_Holy_War_2 = 1
set_counter historic_event_Holy_War_2 100
end_if
end_monitor


Он может использоватся в трейтах, анчах, тригерах гильдий и т.д., там в принципе будет все выглядить как и в обычных скриптах, кроме файла строительства и наемников
там оно будет выглядить следующим образом в EDB

recruit_pool "iqta'dar" 0 0.08 1 0 requires factions { turks, } and event_counter some_event_counter 1

в EDB так же можно использовать not

recruit_pool "iqta'dar" 0 0.08 1 0 requires factions { turks, } and not event_counter some_event_counter 1

в descr_mercenaries , здесь срабатывает проверка, если event_counter равен 1, когда 0 отключает

unit Numidian Cavalry exp 1 cost 315 replenish 0.04 - 0.13 max 2 initial 0 events { some_event_counter}




Создать событие, появится сообщение о событии, текст берется из historic_events, и так же для него создаться event_counter
     historic_event rebel_attack_London

Так же событие можно ограничить по фракциям, к примеру
     historic_event rebel_attack_London { england, }

Можно добавить видео
     historic_event rebel_attack_London faction/rebel_attack.bik { england, }

Так же можно добавить выбор да или нет, для игрока, для ИИ разве что сделать выбор случайным,
или прописать соответствующие условия, при каких будет принимать или отвергать

     historic_event rebel_attack_London true faction/rebel_attack.bik { england, }

создастя отдельно два event_counter с именем события и праставками _accepted и _declined
rebel_attack_London_accepted
rebel_attack_London_declined

Если нажали да

|

monitor_conditions I_EventCounter rebel_attack_London_accepted = 1
set_event_counter rebel_attack_London_accepted 0 или terminate_monitor если событие одноразовое
end_monitor


Если нажали нет

|

monitor_conditions I_EventCounter rebel_attack_London_declined = 1
set_event_counter rebel_attack_London_declined 0 или terminate_monitor если событие одноразовое
end_monitor


Для ИИ можно сделать так

|

monitor_event *****

historic_event rebel_attack_London true faction/rebel_attack.bik { england, }

generate_random_counter random_accept 0 10

if I_EventCounter random_accept <= 5
set_event_counter rebel_attack_London_accepted 1
end_if

if I_EventCounter random_accept > 5
set_event_counter rebel_attack_London_declined 1
end_if

end_monitor



Надеюсь все было понятно, если что можете смело задавать вопросы, я почти не кусаюсь
     Frei von Sorgen
    • Imperial
    Imperial
    Форумчанин

    Дата: 22 марта 2020, 16:09

    Приветствую, камрад. Благодарю за статью.
    Я сам очень продвинутый скриптер с гордым уровнем "ниже начинающего", потому могу сморозить глупость, за что заранее извиняюсь.
    Но так как Вы предложили смело задавать вопросы, то я бы хотел вот что спросить.
    Есть Для просмотра ссылки Зарегистрируйтесь от очень уважаемого мной камрада bitterhowl, который лежит у меня в закладках как подручное пособие на каждый день моих попыток что-то скриптовать, и в этом туторе упоминается, что условие monitor_conditions является достаточно нежелательным для использования в скриптах и 70 таких условий ложат игру до 1 фпс (по некоторым данным). Понятно, что всё условно и где-то быстродействие приносится в жертву очень важному и безальтернативному скрипту. Вы советуете использовать monitor_conditions для универсальных проверок, где простой monitor_event не срабатывает. Теперь, собственно, вопрос: а не лучше ли использовать комбинацию monitor_event с if вместо "одиозных" monitor_conditions?
    Типа не:

    Norinke

    monitor_conditions I_CompareCounter TestCounter = 1
    historic_event bla_bla_bla
    end_monitor

    а

    Цитата

    monitor_event PreFactionTurnStart FactionIsLocal (или другое условие, типа FactionTurnStart TrueCondition и т.д. по ситуации)
    if I_CompareCounter TestCounter = 1
    historic_event bla_bla_bla
    end_if

    Не будет ли это лучшим вариантом с существенно меньшей нагрузкой, тем более что под if*ы можно напихать ещё ворох похожих условий в одном мониторе, лишь бы нужных универсальных проверок хватало? Или я что-то не понимаю и где-то туплю в рассуждениях?
    Спасибо за ответ.
       bitterhowl
      • Imperial
      Imperial
      El Compilator

      Дата: 22 марта 2020, 16:22

      Условие monitor_event EventCounter EventCounterType mongol_invasion

      полностью заменяет функционал monitor_conditions.

      А еще есть более тяжелый оператор while.
         Norinke
        • Imperial
        Imperial
        Отец моддинга

        Дата: 22 марта 2020, 17:55

        Все зависит от ситуации, абсолютно все нельзя запихнуть через if, где можно там используется система из if, condition я написал для ситуации где нужнен быстрый ответ, а не наследующий ход

        Я читал, абсолютно не согласен с данными что monitor_condition, может положить систему, только в кривых руках, а в кривых руках способен любой скрипт положить систему

        - - - Сообщение автоматически склеено - - -

        К примеру сделайте скрипт 10000 monitor_event с абсолютно любым параметрами, и одной командой (можно просто сделать пустую строку между monitor и end_motiror), и увидите как долго будет идти ход, потому что игра перебирает абсолютно все когда берется за евент, не важно что вы взялись за FactionTurnStart, оно будет брать все и перебирать

        Теперь возьмите 10000 monitor_condition с не валидными параметрами(те что не проходят проверку), и увидите что оно не грузит систему, потомк что он работает исключительно с универсальными проверками

        - - - Сообщение автоматически склеено - - -

        Если грамотно использовать condition можно хорошо оптимизировать код, да если оставить 10000 валидных(те что все время работают), игра будет глючить очень, но если все грамотно сделать, то нет

        - - - Сообщение автоматически склеено - - -

        А while это же цикл банальный, тут честно говоря особого применения ему я не вижу, разве что исключительно для боевой части использовать

        - - - Сообщение автоматически склеено - - -

        И да, можно как вариант сделать как написала битер, вместо condition, для быстрого ответа, если работает с event_counter

        не рабочий вариант

        monitor_event EventCounter

        If I_EventCounter random_counter = 1
        End_if

        End_monitor


        Все зависит от ситуации и ваших нужд



        фикс, работать будет только так, пишем в каждом месте где нужна проверка
        set_event_counter all_event 1

        monitor_event EventCounter EventCounterType all_event
        and EventCounter = 1

        If I_EventCounter random_counter = 1
        random_counter 0
        End_if

        set_event_counter all_event 0
        End_monitor
           bitterhowl
          • Imperial
          Imperial
          El Compilator

          Дата: 22 марта 2020, 18:46

          Ивент EventCounter срабатывает в момент изменения значения счетчика. Я так сходу не назову ситуацию где conditions работает, а EventCounter нет.

          Логично сравнивать рабочие EventCounter с рабочими conditions, мне кажется. В любом случае это все умозрительно - никто не будет сравнивать 10 тысяч мониторов просто ради интереса.

          Скрипт Булатки 2.1.5 без conditions быстрее скрипта 2.1.4 с ними.
             Norinke
            • Imperial
            Imperial
            Отец моддинга

            Дата: 22 марта 2020, 19:11

            bitterhowl (22 марта 2020, 18:46):

            Ивент EventCounter срабатывает в момент изменения значения счетчика. Я так сходу не назову ситуацию где conditions работает, а EventCounter нет.

            Логично сравнивать рабочие EventCounter с рабочими conditions, мне кажется. В любом случае это все умозрительно - никто не будет сравнивать 10 тысяч мониторов просто ради интереса.

            Скрипт Булатки 2.1.5 без conditions быстрее скрипта 2.1.4 с ними.

            Monitor_event просто существование нагружает систему, без разницы проходит проверку или нет(не нагружает только в случае если его терминатором убить),condition нагружает только в случае когда их очень много одновременно работает

            EventCounter срабатывает при изменение Event счетчиков в том числе когда случается какое-то событие, а monitor_condition не только для I_EventCounter I_CompareCounter используется

            На счет булатки, там же почти нет condition, они не влияют и к тому же при срабатывании они убиваются потом, у себя проверял не раз

            - - - Сообщение автоматически склеено - - -

            Как бы я просто создал мониторы пустышки 10000, сначала с factionTurnStart замерял удалил, потом с CharacterTurnStart замерял удалил, потом с BecomeFactionLeader замерял удалил и везде одно и то же время на ходу
               bitterhowl
              • Imperial
              Imperial
              El Compilator

              Дата: 22 марта 2020, 19:45

              Сразу скажу - не претендую на истину в какой-либо инстанции. Сколько людей - столько мнений. Да, в исходном раннем скрипте 2.1.4. 116 monitor_conditions. из них 104 в Германикусе, эти я не трогал. Убрал только 12 штук. У Алексея наверняка есть тайминг скрипта кампании 2.1.4 и 2.1.5

              Действительно хороший метод вы предлагаете -

              Спойлер (раскрыть)


              Таки образом убираем все ситуации считывания счетчиков событий под один монитор. (Я думал не заработает просто строка monitor_event EventCounter без дополнительного параметра типа TrueCondition хотя бы )
                 Norinke
                • Imperial
                Imperial
                Отец моддинга

                Дата: 22 марта 2020, 19:59

                bitterhowl (22 марта 2020, 19:45):

                Сразу скажу - не претендую на истину в какой-либо инстанции. Сколько людей - столько мнений. Да, в исходном раннем скрипте 2.1.4. 116 monitor_conditions. из них 104 в Германикусе, эти я не трогал. Убрал только 12 штук. У Алексея наверняка есть тайминг скрипта кампании 2.1.4 и 2.1.5

                Действительно хороший метод вы предлагаете -

                Спойлер (раскрыть)


                Таки образом убираем все ситуации считывания счетчиков событий под один монитор. (Я думал не заработает просто строка monitor_event EventCounter без дополнительного параметра типа TrueCondition хотя бы )

                угу, главное не забыть на 0 потом поставить, так же сделал недавно в булатке, оно в патче будущем стоит, проще контролировать все эту беду
                   Norinke
                  • Imperial
                  Imperial
                  Отец моддинга

                  Дата: 22 марта 2020, 20:16

                  вуууппс... мой косяк, ноч не спал, перемешалось в голове, это я в начале так планировал, просто так monitor_event EventCounter(пустота) не работает, даже с TrueCondition, ему нужен EventCounterType, я сделал там один универсальный event_counter для всех historic_event_accept
                     bitterhowl
                    • Imperial
                    Imperial
                    El Compilator

                    Дата: 22 марта 2020, 20:26

                    Я проверил у себя, прежде чем постить - работает с "путотой" и записи в логе нет.
                      • 7 Страниц
                      • 1
                      • 2
                      • 3
                      • 4
                      • Последняя »
                       Похожие Темы
                      TОбсуждение Total War: Pharaoh
                      Очередная часть серии игр Total War
                      Автор O OlegDo
                      Обновление Мин. назад
                      DLet's play Total War: Rome 2 - Александр Великий (Divide et Impera)
                      Сложность ВХ-ВХ, без пауз на тактике, с несколькими сабмодами
                      Автор S Sonar
                      Обновление 45 мин. назад
                      D[TW:W-3] Total War: WARHAMMER III - Thrones of Decay
                      [TW:W-3] Total War: WARHAMMER III - Thrones of Decay
                      Автор O OlegDo
                      Обновление Сегодня, 10:11
                      Воспользуйтесь одной из соц-сетей для входа
                      РегистрацияВход на форум 
                      «Империал» · Условия · Ответственность · Визитка · 25 апр 2024, 11:25 · Зеркала: Org, Site, Online · Счётчики