ГАРДАРИКА

исторический портал
Текущее время: 21 июл 2017, 19:37

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
Сообщение #1  Добавлено: 06 сен 2011, 18:34 
Не в сети
Ярл
Ярл

Зарегистрирован: 04 сен 2011, 13:25
Сообщения: 1975
Откуда: Уфа
Заслуженная репутация: 29
Скриптинг в Rome и Medieval II
(alpaca's Script-O-Rama)


Слово переводчика
Если честно, я хотел сам написать подобный тутор, но, уже закончив теоретическую часть, я обнаружил, что моих практических навыков явно недостаточно. Я отправился на поиски примеров основных скриптов, но наткнулся на это замечательное пособие. Этот тутор оказался как раз таким, каким я замышлял свой – в стиле учебников по программированию, где все понятно и структурированно, поэтому я решил не изобретать велосипед, а перевести то, что есть.


От автора
Нам очень нужен учебник по скриптингу. Я думаю, достаточно тяжело его изучать его самостоятельно, но это обязательно нужно сделать, если вы хотите создать хороший мод.
Итак, я начал создавать тутор, который помимо основ скриптинга содержит еще и дополнительные разделы:
- примеры скриптов (в основном практические рекомендации и туториалы о некоторых особых скриптовых возможностях)
- задачи по скриптингу (это скрипты, о которых скриптеры задумываются в первую очередь, с примерами их реализации)
- концепты скриптов (здесь я буду говорить о некоторых приемах и понятиях, которые я использую, они не очень тривиальны, но иногда могут быть достаточно полезны)

Содержание

Раздел I
I Туториал

II Практические рекомендации
1 Спаун армий и персонажей
2 Скриптинг параметров сложности для игрока и ИИ.
III Статьи
1 Отслеживание скриптов в log-файле
2 Доступные элементы интерфейса
3 Вещи, которые надо знать
IV Примеры
1 Хороший скрипт для 4 ходов в год
2 Скрипт для возрождающихся фракций
Раздел II – сложные задачи моддинга

Раздел I
ЧАСТЬ I – Туториал

Введение
[+]
Для выполнения этого туториала вам потребуется:
- распакованные файлы export_descr_character_traits.txt, export_descr_ancillaries.txt, text/export_VnVs.txt и text/export_ancillaries.txt. Два последних файла вам нужно будет конвертировать из формата .strings.bin при помощи моего .strings.bin-конвертера.
- рабочую папку мода или config с file_first.
- Файлы docudemon от СА.

Так же неплохо будет прочитать:
- мои туторы по триггерам и трейтам
- и статью «Вещи, которые надо знать», находящуюся в III части этого пособия.

В синтаксисе я буду пользоваться следующими обозначениями:
<x> – обязательный параметр
[x] – необязательный параметр
{x,y,z} – набор обязательных параметров (то есть, если вам встретится строчка {logic_token}, то это значит, вы сможете использовать одно из значений {<,<=,==,>=,>,!=} – меньше, меньше или равно, равно, больше или равно, больше, не равно).


Скриптинг
[+]
Написание туториала всегда является трудным процессом. Это влечет за собой много разочарований и требует больших временных затрат, но при этом позволяет поднять уровень своих знаний в той области, о которой вы его пишете.
Итак, зачем я пишу этот тутор? Чтоб потренироваться в скриптинге? Наверное, нет. Я уже достаточно умел в этом, и большая часть того, что здесь написано, для меня является обычной работой.
Я пишу этот тутор в первую очередь для того, чтобы облегчить доступ мододелов к одной из самых сложных, но и самых интересных областей моддинга.
Самая большая проблема, возникшая передо мной при написании данного тутора, - это трудность в объяснении основных концепций скриптинга, но как только вы их поймете, вам легче будет создавать свои скрипты.
И последнее, что я хотел бы сказать перед тем, как начать объяснение: вы должны обеспечить себе комфортную работу с трейтами, анчами и особенно триггерами. Это руководство будет неплохим способом начать работу со скиптами.
В этом туториале я хочу вас провести через шаги, которые вы должны сделать, чтобы создать свой первый собственный скрипт, который даст вам денег и создаст событие, как только вы турками завоюете Константинополь (обратите внимание, что я не начинаю с некоего аналога «hello, world!», а ввожу вас сразу в действие)


1. Скрипт кампании.
[+]
Скрипт кампании (data/world/maps/campaign/imperial_campaign/campaign_script.txt) исполняется единожды при старте кампании и работает до самого ее конца. Состояние скрипта кампании (в тои числе и значения переменных и т.п.), в отличие от RTW, хранится в файле сохранения. Итак, что вы сможете сделать с этим файлом? Если откроете его в текстовом редакторе и посмотрите, то заметите, что он по умолчанию уже довольно большой. Он содержит часть, обрабатывающую нашествия монголов и Тимуридов (связанных с descr_events.txt), а так же обучающие события для игрока.
Однако, для этого урока нам потребуется чистый файл. Поэтому сохраните резервную копию исходного файла, а в оригинальном удалите все, чтобы его содержимое выглядело следующим образом:

Код:
script

wait_monitors
end_script



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


2. Мониторы
[+]
Мониторы – это основной и наиболее важный компонент конструкции скрипта. Если вы хотите стать скриптером, выжно правильно понять принцип их работы.
Хорошо, но что такое монитор? В первую очередь, надо сказать, что существует два типа мониторов – monitor_event и monitor_conditions. Из них более важным и частым в использовании является monitor_event, потому что большинство условий требует триггера, поэтому не могут быть использованы в monitor_conditions. В этом уроке мы используем только один monitor_event, который будет отслеживать захват Константинополя:
Код:
monitor_event GeneralCaptureSettlement SettlementName Constantinople
    and FactionType Turks

add_events
    event historic turks_capture_constantinople
    date   0 0
end_add_events

console_command add_money turks, 20000
end_monitor


Этот монитор довольно простой. Он отслеживает захват генералом поселения, и если поселение – Константинополь, а генерал турок, то он запускает код. Ничего особенного здесь не происходит: мы запускаем историческое событие (мы опишем его позже, запомните) и добавляем туркам 20000 флоринов.

2.1 monitor_event
Структура monitor_event выглядит следующим образом:
Код:
monitor_event <Event> [not] <Condition>
[and [not] <Condition2>]
...
end_monitor


<Event> сообщает игре, когда нужно выполнить монитор, и проверяет, все ли <Conditions> верны. Только если все из них одновременно возвращают значение «правда», код будет выполнен.
Примерами событий (events) являются CharacterTurnEnd, FactionTurnStart и ButtonPressed, примерами условий (conditions) - I_TurnNumber, CharacterIsLocal и I_InBattle.
В основном, событие это то, что описано в операторе. У игры есть специальный движок, который выполняет некоторые триггеры и мониторы, когда происходят определенные события. Но я не уверен, в каком порядке они выполняются.
Для того, чтобы больше узнать о событиях и условиях, смотрите мой тутор по триггерам и условиям.

2.2 monitor_conditions
monitor_conditions – команда, во многом похожая на monitor_events. Наиболее существенной разницей является то, что вместо события, которое запускает монитор, она использует мета-событие, запускающее monitor_conditions время от времени, чтобы проверить все указанные условия.
Структура данного монитора выглядит следующим образом:

Код:
monitor_conditions [not] <Condition>
[and [not] <Condition2>]
...
end_monitor


Синтаксис, в основном, тот же самый, что и в предыдущем случае, только без инициирующего эвента.
Эта команда имеет некоторое преимущество, так как может мгновенно реагировать на некоторые условия. Недостаток здесь в том, что в случае, если вы будете использовать много таких мониторов, игра будет достаточно сильно тормозить.
Другим важным недостатком monitor_conditions является то, что у него нет события, которое экспортирует определённые условия. Для этого вы можете использовать т. наз. "независимые условия" (обозначаются приставкой l_, работают с любыми условиями).


3. Счетчики
[+]
Еще одним важным аспектом скриптинга являются так называемые счетчики (counters). Если вы немного изучали программирование в прошлом, то заметите, что они похожи на переменные, но не совсем.
Основная задача счетчиков состоит в том, чтобы хранить значения, однако часто трудно получить их снова. Иногда это требует творческого подхода и нестандартного мышления. Так что много счетчиков используется лишь для логических операций (типа да/нет).
Для того, чтобы использовать счетчик, его нужно объявить. Синтаксис для этого имеет следующую структуру:
Код:
declare_counter <name>


Это инициализирует счетчик и обратит его значение в 0.
Вы можете взаимодействовать с ним через команды set_counter, inc_counter и состояния I_CompareCounter.
set_counter:
устанавливает ваш счетчик в фиксированное значение. Синтаксис:
Код:
set_counter <name> <value>

inc_counter:
эта команда иногда бывает полезнее предыдущей – она изменяет значение счетчика на некоторое число. Синтаксис:
Код:
inc_counter <name> <value>
Число может быть отрицательным, чтобы уменьшить значение счетчика.
I_CompareCounter:
Это условие использует имя счетчика, знак логического сравнения и значение для сравнения в качестве аргумента. Синтаксис:
Код:
 I_CompareCounter <name> {<, <=, == ,> =,>,! =} <value>
Обратите внимание, что <value> может иметь только фиксированное значение (то есть введенное вами при создании скрипта), а не другой счетчик или условие (а обидно).
В нашем примере я хочу изменить монитор так, чтобы при повторном захвате города турки получили меньше денег, а в случае, если они дважды потеряют город, а затем захватят, не давать денег вообще (но все равно показывать сообщение).
В итоге мы получили следующий код:
declare_counter turks_capture_constantinople_counter

Код:
monitor_event GeneralCaptureSettlement SettlementName Constantinople
    and FactionType Turks

add_events
    event historic turks_capture_constantinople
    date   0 0
end_add_events

if I_CompareCounter turks_capture_constantinople_counter == 0
    console_command add_money turks, 20000
end_if
if I_CompareCounter turks_capture_constantinople_counter == 1
    console_command add_money turks, 10000
end_if

inc_counter turks_capture_constantinople_counter 1
end_monitor


4. Описание событий
[+]
На самом деле, это не имеет ничего общего со скриптами, но для того, чтобы закончить урок, мы должны сделать это. Чтобы добавить в игру событие turks_capture_constantinople, мы должны дать ему название и описание в файле data/text/historic_events.txt:
Код:
{TURKS_CAPTURE_CONSTANTINOPLE_TITLE}The Turks capture Constantinople
{TURKS_CAPTURE_CONSTANTINOPLE_BODY}An incredible event has occured! The Turks captured the unconquerable, glorious city of Constantinople and now have a foothold in Europe. The whole occident trembles in fear before the mighty new conquerors who were able to take one of the greatest cities of Christendom apparently effortlessly.

Если вы хотите к тому же добавить собственную картинку для этого эвента, вы должны добавить ее как data/ui/southern_european/eventpics/turks_capture_constantinople.tga соответственно для всех культур.
Теперь, наслаждайтесь новым историческим событием.


ЧАСТЬ II – Практические рекомендации
Вызов (spawn) персонажей и армий
[+]
Это одна из наиболее обыденных задач в скриптинге, и это на самом деле делается достаточно легко.

spawn_character
Чтобы создать персонажа (агента) с помощью скрипта, нужно использовать команду spawn_character. Она описан в docudemon как:
Код:
Identifier:         spawn_character
Parameters:         faction, character as in character description in historical battle
Description:        create an army at a particular location

Синтаксис выглядит следующим образом:
Код:
spawn_character <faction> <character description>

Описание персонажа <character description> такое же, как и в descr_strat, так что у вас не должно возникнуть с ним проблем. Просто выберите правильное место появления, тип и имя персонажа, и все будет готово.
Рабочий пример выглядит следующим образом:
Код:
spawn_character england William, diplomat, age 18, x 2 y 15

На самом деле, вы можете создать персонажа в любом месте. Вы можете вызвать дипломата, например, в лесу или на море, что сделает его неподвижным, и первая же буря убьет его.
Единственным ограничением этой команды является то, что вы не сможете сразу дать персонажу определенные трейты, но вы можете использовать в скрипте консольную команду console_command give_trait, потому что вы знаете имя созданного вами персонажа.

spawn_army
Эта команда достаточно похожа на предыдущую, но вместо агентов вызывает капитанов и именных персонажей (named_character, генералов) и армии для них. В docudemon эта команда описывается следующим образом:
Код:
Identifier:         spawn_army ... end
Parameters:         faction, character and units as in army description in historical battle (character description for general and unit descriptions for remainder of the army)
Description:        create an army at a particular location

Будьте осторожны с синтаксисом, так как команда очень к нему восприимчива. Описание персонажа почти такое же, как и в descr_strat (за исключением того, что упущено ключевое слово army). Рабочий пример:

Код:
spawn_army
   faction slave
   character   Primus Branka, named character, age 18, x 73, y 28
   traits GoodCommander 1
   unit      NE Catapult            exp 1 armour 0 weapon_lvl 0
end
Синтаксис команды выглядит следующим образом:
spawn_army
   faction <faction>
   character   <character description>
   [traits]
   unit   <unit description>
   ...
end

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

Я надеюсь, что этот небольшой how-to поможет вам разобраться в вызове армий и персонажей.


Изменение настроек сложности и передача фракции под управление ИИ/игроку при помощи скрипта
[+]
Скрипт настройки сложности
Код:
set_counter difficulty 2
 set_counter difficulty_set 1
 
 log always Campaign Difficulty: medium
 
 terminate_monitor
end_monitor
 
monitor_event FactionTurnStart FactionIsLocal
 and I_CompareCounter difficulty_set = 0
 and CampaignDifficulty = hard
 
  set_event_counter difficulty_easy 0
  set_event_counter difficulty_medium 0
  set_event_counter difficulty_hard 1
  set_event_counter difficulty_very_hard 0
 
 set_counter difficulty 3
 set_counter difficulty_set 1
 
 log always Campaign Difficulty: hard
 
 terminate_monitor
end_monitor
 
monitor_event FactionTurnStart FactionIsLocal
 and I_CompareCounter difficulty_set = 0
 and CampaignDifficulty = very_hard
 
  set_event_counter difficulty_easy 0
  set_event_counter difficulty_medium 0
  set_event_counter difficulty_hard 0
  set_event_counter difficulty_very_hard 1
 
 set_counter difficulty 4
 set_counter difficulty_set 1
 
 log always Campaign Difficulty: very_hard
 
 terminate_monitor
end_monitor


Скрипт ИИ/Игрок
[+]
Код:
declare_counter local_england
declare_counter ai_england
 
monitor_event FactionTurnStart FactionIsLocal
 and FactionType england
 
  set_event_counter local_england 1
  set_event_counter ai_england 0
 
 if not I_HotseatEnabled
  terminate_monitor
 end_if

end_monitor
 
monitor_event FactionTurnStart not FactionIsLocal
 and FactionType england
 
  set_event_counter local_england 0
  set_event_counter ai_england 1
 
 if not I_HotseatEnabled
  terminate_monitor
 end_if
 
end_monitor


Вы так же можете устанавливать уровень сложности для фракции в зависимости от того, управляет ей игрок или ИИ.
Код:
income_bonus bonus 200 requires factions { england, } and event_counter local_england 1 and event_counter difficulty_easy 1
 
income_bonus bonus 400 requires factions { england, } and event_counter ai_england 1 and event_counter difficulty_easy 1


Теперь вы можете использовать счетчик уровня сложности для событий, которые происходят для локальной фракции (под управлением игрока) и ИИ-фракции. Условие CampaignDifficulty работает корректно только для локальной фракции. Оно возвращает среднее значение для событий ИИ-фракций.
Код:
I_CompareCounter difficulty >= 3


ЧАСТЬ III-Статьи
Отображение скрипта в log-файле
[+]
Это довольно короткая, но, тем не менее, очень важная статья.
Я надеюсь, вы знакомы с log-файлом игры, так как он может дать вам много ценной информации о том, что происходит в игре. Нам, однако, вся информация не понадобится – нам не нужно знать, какие файлы были не найдены, когда мы занимаемся скриптами, поэтому правильными настройками для нас будут:
Код:
[log]
to=logs/system.log.txt
level=*script* trace

Это даст нам информацию, к примеру, когда определенный триггер засвечен в log-файле (с именем триггера в логе), а так же запишет ход выполнения команд скрипта. Но при этом в log-файле все равно будут отображаться важные сообщения других частей игры. Это очень полезная вещь для написания скриптов, и я бы посоветовал использовать данный метод всем, кто хочет повысить эффективность своей работы для проверки работоспособности того или иного триггера.


Доступные элементы интерфейса
[+]
Это мелочи, о которой знает мало кто, кроме ветеранов скриптинга RTW, но некоторые из этих мелочей могут быть очень полезны. К примеру, рассмотрим комбинацию события/условия ButtonPressed. Оно требует название элемента интерфейса в качестве параметра, но помимо просматривания .exe файла или файла советов есть только один способ получить эти самые названия: http://forums.totalwar.org/vb/showthread.php?54299-New-docudemon-files&p=929325#post929325
По ссылке приведен список элементов интерфейса для RTW, но большая часть из них осталась неизменной и в M2TW. Просто ищите хорошие варианты, и, если вам повезет, найдете то, что нужно.
Пример использования этих файлов: вы хотите, чтобы при нажатии на кнопку строительства запускался монитор. Правильным заголовком монитора в этом случает будет:
Код:
monitor_event ButtonPressed ButtonPressed construction_button

Обратите внимание, что вам придется использовать ButtonPressed два раза – один раз в качестве события и второй – в качестве условия.


Вещи, которые нужно знать
[+]
Скрипты в целом
- Если вы что-то измените в настройках скрипта, он не будет работать с сохраненными играми – надо начинать новую кампанию.
Команды
- Команда terminate_battle приводит к падению скриптового движка. После его использования, у меня не работал ни один монитор.
События (events)
- Порядок загрузки для событий  TurnStart и TurnEnd выглядит следующим образом: CharacterTurn[Start/End], SettlementTurn[Start/End],FactionTurn[Start/End]
- Будьте внимательны при использовании BuildingCompleted – после использования оно отключает на некоторое время консольную команду create_building. Подождите немного, пока отработает монитор.
Условия (conditions)
= MissionSucceeded, кажется, не работает должным образом. То есть оно появляется только для того, чтобы вызвать slightly_successful.


ЧАСТЬ IV-Примеры
Хороший скрипт для 4 ходов в год.
[+]
Я сделал очень лаконичную версию скрипта 4tpy, которая изменяет timescale до значения 0.25 в descr_strat (тогда год будет занимать 4 хода). Вот код:
Код:
declare_counter season_counter

monitor_event FactionTurnStart FactionIsLocal
   inc_counter season_counter 1
   
   ; 0 equals winter
   if I_CompareCounter season_counter == 0
      console_command season winter
   end_if
   if I_CompareCounter season_counter > 0
      console_command season summer
   end_if
   ; Reset the counter on the autumn turn so that it'll be 0 next turn
   if I_CompareCounter season_counter == 3
      set_counter season_counter -1
   end_if
end_monitor

Здесь имеется счетчик, который циклически принимает четыре значения (0,1,2,3), где состояния 1, 2 и 3 идентичны. Таки образом, это скрипт говорит игре, что зима наступает лишь каждый четвертый ход, а во все остальные – лето. Персонажи будут стареть только при переходе от зимы к лету, то есть за игровой год персонаж станет на год старше.
Данный скрипт легко приспосабливается к еще меньшей шкале времени (1/n, где n – это натуральное число, например 1/12=0,08333333), просто увеличивая требование для последнего состояния до n-1:
Код:
if I_CompareCounter season_counter == 11
   set_counter season_counter -1
end_if

Если вы используете меньшую шкалу времени, будьте осторожны с эвентами, потому что add_events с датой 0 больше работать не будет.


Скрипт создания оживающих фракций
[+]
Прежде всего, думаю, надо сказать, что я играю только на одном уровне сложности – Very Hard. Побочным эффектом игры в таком режиме является то, что некоторые фракции могут обанкротится в течение игры. Поэтому я создал чит-скрипт для фракций под управлением ИИ для того, чтобы они имели экономику, более-менее равную экономике фракций под управлением игрока (ИИ, как вы знаете, не в состоянии конкурировать с человеком в том, что касается экономики). Он необходим для возрождающихся фракций, потому что мне не хочется прописывать фиктивных юнитов без платы за содержание.
Во-вторых, как каждый знает, когда у вас есть 12+ поселений, вы практически выиграли.
Возрождающиеся фракции – это фича, которая добавляет сложностей фракции, уничтожившей какую-то другую и захватившую ее исходные территории. Сложности состоят в том, что несколько раз уничтоженная фракция будет возрождаться в виде генерала со стеком.
Мне иногда бывает обидно, что я не могу повоевать с какой-нибудь фракцией потому, что ее уничтожают до моего прихода. Теперь всегда можно будет столкнуться с ней в бою.
Сам скрипт. Скрипт сам по себе ничего не запускает, он опирается на события в descr_events. Когда событие происходит, оно запускает триггер в мониторе, проверяющем, уничтожена ли фракция, и на следующий ход с небольшой рандомизацией вызывается событие, при котором уничтоженная фракция возрождается.
После этого скрипт продолжает быть активным. Я имею в виду, что он вызывает событие возрождения через каждые х ходов, и делает это до самого конца игры, по сути сохраняя все фракции живыми, хотя и с возможным «мертвым интервалом» (между гибелью и возрождением).
Есть одно замечание. При вызове фракции невозможно создавать агентов. Потому что при отсутствии поселения агента вызвать невозможно.
Заметка: все фракции должны иметь возможность превращения в орду. О том, как это сделать, можно будет прочитать в следующей главе.
Код:
;SET FOLLOWING EVENT IN DESCR_EVENTS TO START THE RESPAWNING!!!
;;;event   counter    faction_respawn_trigger
;;;date   1

;Interval set at 40-80 years -> 80-160 turns.
;faction_respawn_event  ==> global spawn starter event

;faction_respawn_england  ==> per faction spawn event

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
script

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;the trigger on a seperate event so it can be used in like EDB, kill it once it has done its job!
;;;
   monitor_event EventCounter EventCounterType faction_respawn_trigger
      and EventCounter >= 1

      add_events
         event   counter   faction_respawn_event
         date   1
      end_add_events
         terminate_monitor
   end_monitor
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;COPY FOR OTHER FACTIONS!!!
;;;
   monitor_event FactionTurnStart FactionType england
      and Treasury <= 10000

      if I_LocalFaction england
         terminate_monitor
      end_if
      console_command add_money england, 12000
   end_monitor
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;check after the player did his/her turn, else we could miss out on yet an other victory.
;;;
   monitor_event FactionTurnEnd FactionIsLocal
      and I_EventCounter faction_respawn_event >= 1

;;;
;;;COPY FOR OTHER FACTIONS!!!
;;;
      if I_FactionLeaderTrait england Factionleader == 0
         add_events
            event   counter   faction_respawn_england
            date   3 25
         end_add_events
      end_if
;;;

;;;
;;;reset the counter and call the event again in order to have better control over the spawn-intervals.
;;;
      set_event_counter faction_respawn_event 0
      add_events
         event   counter   faction_respawn_event
         date   38 78
      end_add_events

   end_monitor
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;COPY FOR OTHER FACTIONS!!!
;;;
   monitor_event EventCounter EventCounterType faction_respawn_england
      and EventCounter >= 1

      spawn_army
         faction england
         character   William, named character, age 30, x 100, y 150, family
         traits GoodCommander 4 , Loyal 4 , ContentGeneral 3 , BattleChivalry 3 , GoodRiskyAttacker 2 , Fertile 2
         unit      NE Bodyguard         exp 2 armour 1 weapon_lvl 1
      end
   end_monitor
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

   wait_monitors

end_script
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


РАЗДЕЛ II – Сложные задачи скриптинга /пополняемый раздел/
#1 Оживающие фракции

[+]
Задача проста: сделать так, чтоб фракции могли оживать после уничтожения так, как это было в первом Medieval. Я не пытался это сделать самостоятельно, потому что не был уверен, возможно ли это. Теперь мы знаем, что это возможно.
Решение:
Решение этой задачи состоит из 2-х основных шагов. Первый – это создание орды восстанавливаемой фракции, второй – вызов армии для нее.

1. Создание орды
Чтобы создать орду для фракции, нужно в файл descr_sm_factions добавить несколько записей типа тех, что есть у монголов и Тимуридов.
Код:
horde_min_units            10
horde_max_units            20
horde_max_units_reduction_every_horde 10
horde_unit_per_settlement_population   250
horde_min_named_characters   2
horde_max_percent_army_stack 80
horde_disband_percent_on_settlement_capture   0
horde_unit               Mongol Infantry
horde_unit               Mongol Foot Archers
horde_unit               Mongol Heavy Archers
horde_unit               Mongol Heavy Lancers
horde_unit               Mongol Light Lancers
horde_unit               Mongol Horse Archers

Эти строчки определяют то, что происходит после того, как фракция теряет свое последнее поселение, и, что еще более важно, позволяет ей оставаться в списке живых даже после гибели. Эти вещи довольно просты, поэтому перейдем к шагу 2.
2. Создание армий
С вызовом армий мы познакомились выше, поэтому не буду описывать скрипт, который здесь используется. Чтобы фракция ожила после своей гибели, ей нужно создать полководца, который будет снова представлять ее в игре, с армией где-нибудь на карте. Хороший пример есть в исходном скрипте от парней из СА, где они вызывают орды монголов и Тимуридов:
Код:
spawn_army
         faction mongols
         character   Jebe, named character, age 30, x 292, y 166, family   ;command 8, dread 9, loyalty 7, piety 1
         traits EasternWarlord 3 , GoodCommander 2 , Bloodthirsty 2 , BattleDread 4 , StrategyDread 2 , PublicFaith 1 , Loyal 2 , ContentGeneral 3   ;command 8, dread 9, loyalty 7, piety 1
         unit      Mongol Bodyguard      exp 6 armour 0 weapon_lvl 0
         ...
      end

Заметьте, что слово «family» выделено. Это позволит восстановить семейное древо.
Это основа. Просто, не так ли?
У этого способа решения есть 2 основные проблемы. Во-первых, вы должны будете определить, где возрождать (или передвигать) армию своей фракции, если не хотите, чтоб армия всегда появлялась в одном и том же месте. Во-вторых, появляющиеся члены семьи будут всегда иметь одни и те же имена. Вы, конечно, можете добавить немного рандомизации, но это достаточно сильно увеличит размеры кода.
Что ж, весело проводите время со своими возрождающимися фракциями.


Источник:
Total War Center (оригинал)
© Автор тутора - alpaca. Перевод с английского и дополнения Basileus, Skiph

_________________
We're watching you, scum!
Изображение

Пиндосов можешь не любить, *удалено по требованию администрации*


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron

Powered by phpBB ® Forum Software © phpBB Group

Русская поддержка phpBB

Стиль Gardarike Light gardarike.org © 2012 Gardarike.org