Сообщество Империал: Скриптописание в Total War: Shogun 2 - Shogun 2: Total War - Серии Total War - Библиотека - Сообщество Империал

  • Поиск
  • Законы
  • Сообщество
  • Репутация
  • Экономика
  • Больше

Реклама отключена для зарегистрированных посетителей

[ Регистрация ] · [ Авторизация ]

Рассказать друзьям



Информация об авторе

  • Автор: DenStark

Информация по статье

  • Добавлено: 22 Окт 2014, 06:56
  • Просмотры: 1176

Дополнительно

Репутация: 4
Скриптописание в Total War: Shogun 2

Описание: Скриптописание в Total War: Shogun 2
Читал как-то тутор от T.C. с ТВЦентра чтобы в Риме 2 было проще все это понять, заодно перевел. :)
Оригинал тут

The S2 Script-o-Rama - скриптописание в Total War: Shogun 2 (На основе Napoleon: Total War)

Содержание:

I. Введение и основы скриптов
I.1 Основы
I.2 Эффекты - Effects
I.3 CampaignUI
I.4 Игровой интерфейс - Game Interface
I.5 События - Events
II. Учебник написания скриптов
II.1 Как использовать события
II.2 Создание пользовательских миссий
II.3 Как написать и использовать лог
II.4 Как редактировать компоненты пользовательского интерфейса (основы)


Раздел I: Введение и основы скриптов

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

I.1 Основы:

Язык скриптов:
NTW использует Lua. Так что же такое Lua?
Lua это мощный, быстрый, легкий, встраиваемый скриптовый язык.
Lua это язык с открытым исходным кодом, очень быстрый, широко используемый скриптовый язык. Это значит, что скриптинг в игре технически не ограничивается функциями, предоставляемыми игрой - мы можем расширять его операторами и функциями, которые не входят в скриптовый код CA. Хотя это не даст нам много для написания простых скриптов, но это может принести большую пользу тем, кто заинтересован в скриптах более сложных.

Чувствительность к регистру:
Все Lua функции и объекты вводятся с учетом регистра. То есть, CampaignUI не равно campaignui, campaignUi или что-нибудь подобное. То есть скрипт вызовет ошибку и не будет работать.

Пробелы:
Lua игнорирует пробелы, где это возможно. Так, 3 > 1, то же самое, что и 3>1, или 3> 1.

Ключевые понятия:
Строки: строками являются предложения, содержащие цифры, знаки или символы. Они начинаются и заканчиваются кавычками. Например:
"Hello World"

Булевы значения: логические значения, могут быть только истиной или ложью
Тип: тип переменной может быть логическим, функцией, ноль, числом, строкой, таблицей, потоком или пользовательскими данными. Если какая-либо функция просит переменную определенного типа, а получает переменную другого, это вполне может привести к вылету.
int: Отрицательное или положительное целое число
Комментарии: Комментарии являются частью кода скрипта, котор будет проигнорирована в игре. Нормальный комментарий начинается с "--" (без кавычек) и идет до конца строки. Длинный комментарий начинается с "--[[" (без кавычек) и заканчивается "]]--" (без кавычек). Длинный комментарий включает все, что внутри данных тегов, так что может быть использован для эффективного комментирования больших блоков кода. Примеры:
--Это короткий комментарий
--[[А теперь 
Вы
видите
длинный
комментарий ]]--


Основные операторы и формулировки Lua:
Арифметические операторы:
Сложение:
+
Вычитание:
-
Умножение:
*
Деление:
/
Возведение в степень:
^
Операторы сравнения:
Равно:
==
Не равно:
~=
Меньше:
<
Меньше или равно:
<=
Больше:
>
Больше или равно:
>=
Логические операторы:
Примечание: Логические операторы иногда называют булевыми операторами, но они могут вернуть небулево значение.
and
and принимает два или более аргументов и возвращает истину только если они все верны
or
or возвращает ложь, только если оба его аргумента являются ложью
not
not это, проще говоря, логическое нет.
Основные операторы:
if
while
while один тип цикла.
for другой тип цикла.
Что они собой представляют легко можно найти в гугле..
Экранирование (Очень важно для логов):
Ввод в тексте специальных символов
\n - Новая строка.
\t - Tab.
\\ - Обратный слэш.
\" - Двойные кавычки.
Конкатекация (объединение строк):
Конкатекация в Lua записывается следующим образом:
..

Это две точки без пробела между ними.
Он используется для сращивания строк вместе:
print("Hello".."World")
ScriptORamaVariable = "World"
print("Hello "..ScriptORamaVariable)

На выходе получится:
HelloWorld
Hello World


Обратите внимание, что он не ставит пробела между аргументами, так что это должно быть сделано вручную (второй пример).

I.2 Эффекты - Effects

С помощью эффектов в игре вы можете делать такие вещи, как редактирование казны, трейтов, анчей и т.д.
Следующие функции описаны здесь:
adjust_treasury
ancillary
remove_ancillary
trait
remove_trait
historical_event


Documentation:
adjust_treasury(int amount, context)
effect.adjust_treasury изменяет казну определенной фракции.
Параметры: Сумма денег (int), context
Пример:

events.FactionTurnStart[#events.FactionTurnStart+1] =
function (context)
	effect.adjust_treasury(-1000,context)
end


ancillary(Ancillary name (string), Chance of ancillary being added (int), context)
effect.ancillary() добавит указанный анч выбранному персонажу.
Параметры: Название анча (string), Шанс получения анча % (int), context
Пример:

events.CharacterTurnEnd[#events.CharacterTurnEnd+1] = 
function (context)
	effect.ancillary("Anc_Balloonist", 100,  context)
end


remove_ancillary(Ancillary name (string), context)
effect.remove_ancillary() удалит указанный анч у выбранного персонажа.
Параметры: Название анча (string), context
Пример:

events.CharacterTurnEnd[#events.CharacterTurnEnd+1] = 
function (context)
	effect.remove_ancillary("Anc_Balloonist", context)
end


trait(Trait name(string), Game entity type(string), Trait points to add(int), % Chance of trait being added(int), context)
effect.trait() добавит указанный трейт выбранному объекту игры.
Параметры: Название трейта(string), Тип объекта игры(string), Количество добавляемых очков трейта(int), Шанс получения трейта %(int), context
Пример:

events.CharacterTurnEnd[#events.CharacterTurnEnd+1] = 
function (context)
	effect.trait("C_Admiral_Attacker_Good", "agent", 2, 12, context)
end


remove_trait(Trait name(string), POSSIBLY NEEDS: Game entity type(string), context)
effect.remove_trait() удалит указанный трейт у выбранного объекта игры.
Параметры: Название трейта(string), При необходимости: Тип объекта игры(string), context
Пример:

events.CharacterTurnEnd[#events.CharacterTurnEnd+1] = 
function (context)
	effect.remove_trait("C_Admiral_Attacker_Good", "agent", context)
end


historical_event(Event key(string), context)
effect.historical_event() вызовет историческое событие.
Параметры: Код события(string), context
Пример:

events.HistoricalEvents[#events.HistoricalEvents+1] = 
function (context)
	effect.historical_event("luddite_movement", context)
end


I.3 Campaign UI

CampaignUI имеют множество полезных функций.Главное преимущество использования CamaignUI в том, что функции часто не требует аргументов и возвращают логические значения, что делает их очень полезными. Основное применение CUI - получение данных из игры - от них очень мало пользы для фактического изменения чего-либо.
Следующие функции описаны здесь:
CurrentSeasonString
CurrentTurn
CurrentYear
DisplayingTurns
EndTurn
EntityTypeSelected
FactionDetails
IsPlayersTurn
InitialiseRegionInfoDetails
IsCharacterPlayerControlled
PlayerFactionId
PrestigeDetails
RetrieveDiplomacyDetails
RetrieveDiplomaticOpinions
RetrieveDiplomaticStanceString
RegionsOwnedByFaction
RetrieveFactionRegionList
RetrieveFactionMilitaryForceLists


Documentation:
CurrentSeasonString()
Вызов CampaignUI.CurrentSeasonString() вернет текущий сезон в виде строки.
Возвращает: Текущий сезон в виде строки. Лето или Зима.
Пример:

CampaignUI.CurrentSeasonString() == "Summer"


CurrentTurn()
Вызов CampaignUI.CurrentTurn() возвращает номер текущего хода.
Возвращает: номер хода в виде числа.
Пример:

CampaignUI.CurrentTurn() == 0


CurrentYear()
Вызов CampaignUI.CurrentYear() вернет текущий год.
Возвращает: текущий год в виде числа.
Пример:

CampaignUI.CurrentYear() >= 1700


DisplayingTurns()
Вызов CampaignUI.DisplayingTurns() укажет вам, отображается игра в годах или ходах.
Возвращает: Boolean: true если в ходах, false если в годах
Пример:

if CampaignUI.DisplayingTurns() then
...
end


EndTurn()
Вызов CampaignUI.EndTurn() закончит ход.
Пример:

CampaignUI.EndTurn()


EntityTypeSelected()
CampaignUI.EntityTypeSelected() даст вам информацию о выбранном в данный момент типе объекта.
Возвращает: Таблицу деталей объекта. Важно здесь CampaignUI.EntityTypeSelected().Entity, оно содержит указатель (например, указатель персонажа), который может быть использован в других функциях
Пример:

CampaignUI.EntityTypeSelected()


Вернет таблицу, содержащую эту информацию:

  Character: boolean: true
  Unit: boolean: false
  Slot: boolean: false
  Settlement: boolean: false
  Entity: userdata
    type: string: Pointer<CHARACTER>
    __tostring: function
    __eq: function
  LocalPlayerOwned: boolean: true
  Fort: boolean: false


FactionDetails(string faction_key)
CampaignUI.FactionDetails() вернет таблицу с информацией о выбранной фракции.
Параметры: ID Фракции string
Возвращает: Таблицу деталей фракции
Пример:

CampaignUI.FactionDetails("britain")


Вернет таблицу, содержащую эту информацию:

Спойлер (скрытая информация)



IsPlayersTurn()
IsPlayersTurn возвращает правду или ложь
Возвращает: true или false в зависимости от того игрока этот ход или нет.
Пример:

CampaignUI.IsPlayersTurn()


InitialiseRegionInfoDetails(<Pointer>REGION)
InitialiseRegionInfoDetails возвращает всю информацию вы можете получить об определенном регионе. Вы должны предоставить указатель (получите его от RegionsOwnedByFaction например)
Параметры: указатель региона
Возвращает: Таблицу деталей региона
Пример:

tab = CampaignUI.RegionsOwnedByFaction("france")
	details = CampaignUI.InitialiseRegionInfoDetails(tab[1].Address)


Вернет таблицу, содержащую следующую информацию:


Спойлер (скрытая информация)


IsCharacterPlayerControlled(CharacterPointer pointer)
CampaignUI.IsCharacterPlayerControlled() скажет вам, является ли персонаж под контролем игрока.
Возвращает: boolean true или false
Пример:

entity = CampaignUI.EntityTypeSelected()
if entity.Character then
	if CampaignUI.IsCharacterPlayerControlled(entity.Entity) then
		...
	end
end


PlayerFactionId()
Calling CampaignUI.PlayerFactionId() возвращает фракцию игрока.
Возвращает: Фракцию игрока как строку, например "britain"
Пример:

CampaignUI.PlayerFactionId() == "britain"


PrestigeDetails()
CampaignUI.PrestigeDetails() даст вам доступ к очкам престижа каждой фракции
Возвращает: таблицу престижа фракций
Example:

CampaignUI.PrestigeDetails()


Вернет таблицу со следующей информацией:


Спойлер (скрытая информация)



RetrieveDiplomacyDetails(Faction Key (string))
RetrieveDiplomacyDetails возвращает таблицу с деталями дипломатии данной фракции.
Возвращает: таблицу с деталями дипломатии фракции.
Пример:

RetrieveDiplomacyDetails("france")


Пример вывода:


TradeRights	table: 1AD793B8
				wurttemberg	table: 1AD79518
						Flag	data\ui\flags\wurttemberg/small.tga
						Name	Baden-Wurttemberg
						Label	wurttemberg
				italy_kingdom	table: 1AD79458
						Flag	data\ui\flags\italy_kingdom/small.tga
						Name	Kingdom of Italy
						Label	italy_kingdom
				netherlands	table: 1AD7FF58
						Flag	data\ui\flags\united_netherlands/small.tga
						Name	Batavian Republic
						Label	netherlands
				swiss_confederation	table: 1AD79478
						Flag	data\ui\flags\swiss_confederation/small.tga
						Name	Swiss Confederation
						Label	swiss_confederation
				spain	table: 1AD7FDD8
						Flag	data\ui\flags\spain/small.tga
						Name	Spain
						Label	spain
AtWar	table: 1AD79378
				austria	table: 1AD794B8
						Flag	data\ui\flags\austria/small.tga
						Name	Austria
						Label	austria
				sicily	table: 1AD795B8
						Flag	data\ui\flags\naples_sicily/small.tga
						Name	Kingdom of Sicily
						Label	sicily
				naples	table: 1AD79558
						Flag	data\ui\flags\naples/small.tga
						Name	Kingdom of Naples
						Label	naples
				britain	table: 1AD794D8
						Flag	data\ui\flags\britain/small.tga
						Name	Great Britain
						Label	britain
				sweden	table: 1AD7FDF8
						Flag	data\ui\flags\sweden/small.tga
						Name	Sweden
						Label	sweden
				russia	table: 1AD79498
						Flag	data\ui\flags\russia/small.tga
						Name	Russia
						Label	russia
Protectorates	table: 1AD793F8
ProtectorOf	table: 1AD79418
Allies	table: 1AD79398
				wurttemberg	table: 1AD794F8
						Flag	data\ui\flags\wurttemberg/small.tga
						Name	Baden-Wurttemberg
						Label	wurttemberg
				bavaria	table: 1AD79578
						Flag	data\ui\flags\bavaria/small.tga
						Name	Bavaria
						Label	bavaria
				italy_kingdom	table: 1AD79438
						Flag	data\ui\flags\italy_kingdom/small.tga
						Name	Kingdom of Italy
						Label	italy_kingdom
				netherlands	table: 1AD799B8
						Flag	data\ui\flags\united_netherlands/small.tga
						Name	Batavian Republic
						Label	netherlands
				swiss_confederation	table: 1AD79538
						Flag	data\ui\flags\swiss_confederation/small.tga
						Name	Swiss Confederation
						Label	swiss_confederation
				spain	table: 1AD799D8
						Flag	data\ui\flags\spain/small.tga
						Name	Spain
						Label	spain



RetrieveDiplomaticOpinions(Faction Key 1 (string), Faction Key 2(string))
RetrieveDiplomaticOpinions возвращает дипломатическое отношение двух фракций.
Возвращает: строка с указанием дипломатического отношения данных фракций
Пример:

CampaignUI.RetrieveDiplomaticOpinions("france", "britain")


Пример результата:

Hostile --(враждебные)


RetrieveDiplomaticStanceString(Faction Key 1 (string), Faction Key 2(string))
RetrieveDiplomaticStanceString возвращает дипломатическое состояние двух фракций.
Возвращает: строка с указанием дипломатического состояния данных фракций (война, союз и т.п.)
Пример:

CampaignUI.RetrieveDiplomaticStanceString("france", "britain")


Пример результата:

at war


RegionsOwnedByFaction(<faction_key>)
CampaignUI.RegionsOwnedByFaction() даст вам список всех регионов фракции
Параметры: фракция
Возвращает: Таблицу со списком указателей регионов и локализованными названиями регионов
Пример:

CampaignUI.RegionsOwnedByFaction("britain")


Вернет таблицу со следующей информацией:


1: table
  Name: string: Ireland
  Address: userdata
    type: string: Pointer<REGION>
    __tostring: function
    __eq: function
2: table
  Name: string: England
  Address: userdata
    type: string: Pointer<REGION>
    __tostring: function
    __eq: function
3: table
  Name: string: Jamaica
  Address: userdata
    type: string: Pointer<REGION>
    __tostring: function
    __eq: function
4: table
  Name: string: Bahamas
  Address: userdata
    type: string: Pointer<REGION>
    __tostring: function
    __eq: function
5: table
  Name: string: Rupert's Land
  Address: userdata
    type: string: Pointer<REGION>
    __tostring: function
    __eq: function
6: table
  Name: string: Scotland
  Address: userdata
    type: string: Pointer<REGION>
    __tostring: function
    __eq: function



RetrieveFactionRegionList(<faction_key>)
CampaignUI.RetrieveFactionRegionList() даст вам список всех населенных пунктов фракции. Подобно RegionsOwnedByFaction, но возвращает указатели поселений вместо указателей регионов
Параметры: фракция
Возвращает: таблицу со списком указателей поселений
Пример:

CampaignUI.RetrieveFactionRegionList("britain")


Вернет таблицу со следующей инфо:


1: table
  SettlementAddress: userdata
    type: string: Pointer<SETTLEMENT>
    __tostring: function
    __eq: function
2: table
  SettlementAddress: userdata
    type: string: Pointer<SETTLEMENT>
    __tostring: function
    __eq: function
3: table
  SettlementAddress: userdata
    type: string: Pointer<SETTLEMENT>
    __tostring: function
    __eq: function
4: table
  SettlementAddress: userdata
    type: string: Pointer<SETTLEMENT>
    __tostring: function
    __eq: function
5: table
  SettlementAddress: userdata
    type: string: Pointer<SETTLEMENT>
    __tostring: function
    __eq: function
6: table
  SettlementAddress: userdata
    type: string: Pointer<SETTLEMENT>
    __tostring: function
    __eq: function



RetrieveFactionMilitaryForceLists(<faction_key>,armies/navies)
CampaignUI.RetrieveFactionMilitaryForceLists() даст вам список всех армий или флотов фракции
Параметры: название фракции, армия или флот как правда или ложь (армия = true)
Возвращает: таблицу с огромным списком деталей армий или флота
Пример:

CampaignUI.RetrieveFactionMilitaryForceLists("france",true)


Вернет таблицу со следующей информацией:


Спойлер (скрытая информация)



I.4 Игровой интерфейс - Game Interface

Вызывается с помощью scripting.game_interface (после требуемого пакета EpisodicScripting) это основной пакет, позволяющий нам изменять положение вещей в игре. К сожалению, пока нет слишком много информации.
Следующие функции описаны здесь:
add_exclusion_zone
add_restricted_unit_record
add_restricted_building_level_record
disable_movement_for_faction
enable_movement_for_faction
episodic_attack
episodic_defend
force_diplomacy
grant_faction_handover
grant_unit
remove_restricted_building_level_record
remove_restricted_unit_record
show_shroud
spawn_town_level
trigger_custom_mission


Documentation:
add_exclusion_zone(left(int), top(int), right(int), bottom(int), exclude_armies(bool), exclude_navies(bool), exclude_agents(bool), faction key(string))
add_exclusion_zone добавляет непроходимую зону для AI.
Параметры: left(int), top(int), right(int), bottom(int), exclude_armies(bool), exclude_navies(bool), exclude_agents(bool), faction key(string)
Пример:

scripting.game_interface:add_exclusion_zone(-100, 100, 100, -100, true, true, true, "britain")


add_restricted_unit_record(<unit_key>)
add_restricted_unit_record позволяет удалить юнита из найма во всем мире (по аналогии с SF юнитами)
Параметры: Unit key как строка (как указано в таблице юнитов)
Пример:

scripting.game_interface:add_restricted_unit_record("euro_expat_infantry_regiments_etrangeres"
)


add_restricted_building_level_record(building key(string))
add_restricted_building_level_record позволяет сделать недоступными здания во всем мире.
Параметры: Building key как строка (как указано в db)
Пример:

scripting.game_interface:add_restricted_building_level_record("tFactory1_manufactory"
)


disable_movement_for_faction(Faction Key(String))
disable_movement_for_faction замораживает движение указанной фракции
Параметры: фракция как строка (как указано в db)
Пример:

scripting.game_interface:disable_movement_for_faction("france")


enable_movement_for_faction(Faction Key(String))
enable_movement_for_faction размораживает фракцию
Параметры: фракция как строка (как указано в db)
Пример:

scripting.game_interface:enable_movement_for_faction("france")


episodic_attack(faction key (string), target faction(string))
episodic_attack советует AI атаковать фракцию. Это в значительной степени непроверено, результаты могут отличаться
Параметры: фракция (string), целевая фракция(string)
Пример:

scripting.game_interface:episodic_attack("france", "britain")


episodic_defend(faction key (string), region(string))
episodic_defend советует AI защищать регион. Это в значительной степени непроверено, результаты могут отличаться
Параметры: фракция (string), регион(string)
Пример:

scripting.game_interface:episodic_defend("france", "eur_norway")


force_diplomacy(faction_key(string), target_faction(string), diplomatic option(string), can offer (bool), will accept(bool))
force_diplomacy заставляет принять определенную позицию одной фракции по отношению к другой
Параметры: фракция(string), целевая фракция(string), дипломатические отношения(string), может предложить (bool), будет принимать(bool)
Пример:

scripting.game_interface:force_diplomacy("france", "britain", "war" true, true)


grant_faction_handover(recipient faction key(string), handed over faction key(string), first possible turn(int), last possible turn(int), context)
grant_faction_handover передает фракцию другой фракции.
Параметры: recipient faction key(string), handed over faction key(string), first possible turn(int), last possible turn(int), context
Пример:

scripting.game_interface:grant_faction_handover("britain", "france", 1, 2, context)


grant_unit(location(string), unit to grant(string))
Порождает данного юнита в заданном месте. Место должно быть поселением.
Параметры: location(string), unit to grant(string)
Пример:

scripting.game_interface:grant_unit("settlement:ita_milano:milan", "Inf_Light_Lombardy-Cisalpine_Legion")


remove_restricted_building_level_record(building key(string))
remove_restricted_building_level_record снимает ограничение на здания, которое было установлено ранее add_restricted_building_level_record
Параметры: Building key as string (as it appears in the db)
Пример:

scripting.game_interface:remove_restricted_building_level_record("tFactory1_manufactory"
)


remove_restricted_unit_record(<unit_key>)
remove_restricted_unit_record снимает ограничение на юнитов, которое было установлено ранее add_restricted_unit_record
Параметры: Unit key as string (as it appears in the units table)
Пример:

scripting.game_interface:remove_restricted_unit_record("euro_expat_infantry_regiments_etrangeres"
)


show_shroud(true/false)
show_shroud включает или отключает туман войны
Параметры: true/ false
Пример:

scripting.game_interface:show_shroud(false)


spawn_town_level(region key (string), level(int), notification(bool))
spawn_town_level повышает города до указанного уровня.
Параметры: region key (string), level(int), trigger notification(bool)
Пример:

scripting.game_interface:spawn_town_level("virginia", 1, true)


trigger_custom_mission(mission id (string), faction key(string), mission type(string), turn limit(int), Параметры(string), heading key(string), description key(string), reward key(string), reward money(int), reward faction key(string), context)
trigger_custom_mission запускает пользовательские миссии.
Параметры: mission id (string), faction key(string), mission type(string), turn limit(int), parameters(string), heading key(string), description key(string), reward key(string), reward money(int), reward faction key(string), context
Пример:

sscripting.game_interface:trigger_custom_mission("eur_prussia_alliance_austria"
,"prussia","forge_alliance", 0, "austria", "mission_text_text_eur_prussia_alliance_austria_heading", "mission_text_text_eur_prussia_alliance_austria_text",
"", 0, "", context


I.5 События - Events

Список событий, в основном названия говорят сами за себя

AdviceDismissed
AdviceFinishedTrigger
AdviceIssued
AdviceSuperseded
ArmySabotageAttemptSuccess
AssassinationAttemptSuccess
BattleBoardingActionCommenced
BattleCommandingShipRouts
BattleCommandingUnitRouts
BattleCompleted
BattleConflictPhaseCommenced
BattleDeploymentPhaseCommenced
BattleFortPlazaCaptureCommenced
BattleShipAttacksEnemyShip
BattleShipCaughtFire
BattleShipMagazineExplosion
BattleShipRouts
BattleShipRunAground
BattleShipSailingIntoWind
BattleShipSurrendered
BattleUnitAttacksBuilding
BattleUnitAttacksEnemyUnit
BattleUnitAttacksWalls
BattleUnitCapturesBuilding
BattleUnitDestroysBuilding
BattleUnitRouts
BattleUnitUsingBuilding
BattleUnitUsingWall
BuildingCardSelected
BuildingCompleted
BuildingConstructionIssuedByPlayer
BuildingInfoPanelOpenedCampaign
CameraMoverCancelled
CameraMoverFinished
CampaignArmiesMerge
CampaignBuildingDamaged
CampaignSettlementAttacked
CampaignSlotAttacked
CharacterAttacksAlly
CharacterBlockedPort
CharacterBrokePortBlocke
CharacterBuildsSpyNetwork
CharacterCandidateBecomesMinister
CharacterCanLiberate
CharacterCompletedBattle
CharacterCreated
CharacterCriticallyFailsAssassination
CharacterDamagedByDisaster
CharacterDisembarksNavy
CharacterEmbarksNavy
CharacterEntersAttritionalArea
CharacterEntersGarrison
CharacterFactionCompletesResearch
CharacterFactionSpyAttemptSuccessful
CharacterFactionSuffersSuccessfulSpyAttempt
CharacterInfoPanelOpened
CharacterLootedSettlement
CharacterPromoted
CharacterSelected
CharacterTurnEnd
CharacterTurnStart
ComponentLClickUp
DuelDemanded
DuelFought
DummyEvent
EspionageAgentApprehended
evaluate_mission
EventMessageOpenedBattle
EventMessageOpenedCampaign
FactionGovernmentTypeChanged
FactionRoundStart
FactionTurnEnd
FactionTurnStart
FortSelected
GarrisonResidenceCaptured
GovernorshipTaxRateChanged
HarassmentAttemptSuccess
HistoricalCharacters
HistoricalEvents
historical_events
HudRefresh
IncomingMessage
LandTradeRouteRaided
LoadingGame
LocationEntered
LocationUnveiled
MissionCancelled
MissionCheckAssassination
MissionCheckBlockePort
MissionCheckBuild
MissionCheckCaptureCity
MissionCheckDuel
MissionCheckEngageCharacter
MissionCheckEngageFaction
MissionCheckGainMilitaryAccess
MissionCheckMakeAlliance
MissionCheckMakeTradeAgreement
MissionCheckRecruit
MissionCheckResearch
MissionCheckSpyOnCity
MissionEvaluateAssassination
MissionEvaluateBlockadePort
MissionEvaluateBuild
MissionEvaluateCaptureCity
MissionEvaluateDuel
MissionEvaluateEngageCharacter
MissionEvaluateEngageFaction
MissionEvaluateGainMilitaryAccess
MissionEvaluateMakeAlliance
MissionEvaluateMakeTradeAgreement
MissionEvaluateRecruit
MissionEvaluateResearch
MissionEvaluateSpyOnCity
MissionFailed
MissionIssued
MissionNearingExpiry
MissionSucceeded
ModelCreated
MovementPointsExhausted
MultiTurnMove
NewCampaignStarted
NewSession
PanelviceRequestedBattle
PanelviceRequestedCampaign
PanelClosedBattle
PanelClosedCampaign
PanelOpenedBattle
PanelOpenedCampaign
PendingBankruptcy
PreBattle
RecruitmentItemIssuedByPlayer
RegionIssuesDemands
RegionRebels
RegionRiots
RegionStrikes
RegionTurnEnd
RegionTurnStart
ResearchCompleted
SabotageAttemptSuccess
SavingGame
SeaTradeRouteRaided
SettlementOccupied
SettlementSelected
SiegeLifted
SlotOccupied
SlotOpens
SlotRoundStart
SlotSelected
SlotTurnStart
SpyingAttemptSuccess
SufferAssassinationAttempt
SufferSpyingAttempt
TechnologyInfoPanelOpenedCampaign
TestEvent
TimeTrigger
Tooltipvice
TradeLinkEstablished
TradeRouteEstablished
UICreated
UIDestroyed
UngarrisonedFort
UnitCompletedBattle
UnitCreated
UnitSelectedCampaign
UnitTrained
UnitTurnEnd
VictoryConditionFailed
VictoryConditionMet
WorldCreated



Раздел II: Учебник написания скриптов

В этом разделе объясняется, как написать свой собственный скрипт и он будет содержать более продвинутые примеры.

II.1 Как использовать события.

Чтобы связать некоторый код с событием вам нужно добавить функцию в конец необходимой таблицы событий следующим образом::

events.EventName[#events.EventName+1] = function(context)
	code
end


Таким образом, следующий код добавляет немного денег фракции в начале ее хода.

events.FactionTurnStart[#events.FactionTurnStart+1] = function(context)
	effect.adjust_treasury(100000, context)
end


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

II.2 Создание пользовательских миссий.

Функции
Функция используемая для создания пользовательских миссий это scripting.game_interface:trigger_custom_mission(). Эта функция создает "пользовательские миссии" и не нуждается в db - все это управляется с помощью скриптов.
Она содержит 13 аргументов, а именно:
1. Name
Тип: String
Описание: Это название миссии. Оно должно быть уникальным, и используется для ссылки на миссию в других местах.
2. Faction key
Тип: String
Описание: Это фракции, которой миссия будет даваться. Запомните -миссии не даются А.И.
3. Mission Activity
Тип: String
Описание: Это одно из 15 действий, которые миссия может включать в себя, как это определено в missions_activities_tables. К ним относятся:
assassination
blockade_port
build_building
capture_city
capture_fort
duel
engage_character
engage_faction
gain_military_access
forge_alliance
make_trade_agreement
recruit
research
spy_on_city
4. Turn Limit
Тип: Integer
Описание: Это используется для определения количества времени, прежде чем миссия провалится. Установка в 0 дает неограниченное время.
5. Target Item
Тип: String
Описание: Это «мишень» миссии. Это может быть фракция, юнит, персонаж, технологии и т.д.
6. Heading key
Тип :String
Описание: Это должно соответствовать вводу текста в Loc. Это текст, который озаглавит всплывающую миссию. Чтобы оставить пустым, используйте пустые кавычки.
7. Description Key
Тип: String
Описание: То же самое, толькоо главное тело сообщения. Чтобы оставить пустым, используйте пустые кавычки.
8. unused Key
Тип: String
Описание: Это некоторые формы неиспользуемых наград. Всегда оставляйте пустым. Чтобы оставить пустым, используйте пустые кавычки.
9. Reward Key (Cash)
Тип: Integer
Описание: Используйте это, для суммы вознаграждения
10. Reward Key (Faction)
Тип: String
Описание: Это используется, чтобы вознаградить всю фракцию. Это запись должна быть действительным ключом фракции. Чтобы оставить пустым, используйте пустые кавычки.
11. Context
Тип: Userdata
Описание: Всегда устанавливается "context", без кавычек. Передача других аргументов является ненужным и приведет к возникновению ошибок.
12. Unknown argument
Тип:Boolean
Описание: Цель неизвестна. Почти всегда ложно.
13. Reward Key (Misc)
Тип:String
Описание: Используется как альтернативный способ, чтобы дать некоторые награды, а также награды которые обычно не доступны. Это должна быть строка, и может иметь несколько значений. Внутренние значения должны быть разделены запятой (,). Типы (с примерами):
money:1000
grant_experience_army:1
grant_unit:Inf_Line_Austrian_German_Fusiliers#settlement:eur_baden_wurttemberg:stuttgart
Есть, возможно, больше вариантов для этого.
Примеры использования
Следующий пример выдает миссию Австрии, вступить в союз с Пруссией. Дает в качестве награды 100 денег и фракцию Францию (немного чрезмерно, я знаю). Он имеет неограниченное время и называется "TutorialTestMission". Он не имеет заголовка или текста тела и вызывается внутри функции OnFactionTurnStart() scripting.lua

scripting.game_interface:trigger_custom_mission(
								"TutorialTestMission",
								"austria", "forge_alliance", 0, "prussia",
								"",
								"",
								"", 100, "france", context,
								false, ""
								)


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



Тут нет всплывающего окна что миссия завершена - они должны быть сделаны скриптами вручную.

II.3 Как написать лог журнал.

Лог журнал, безусловно, самый простой способ поиска ошибки, он говорит вам, что и как работает в скриптах. Следующие куски кода это функции (I) Создание журнала и (II) запись в журнал. Чтобы понять какие операторы мы использовали, я бы посоветовал вам посмотреть раздел Основы (I.1), который объясняет их подробно.

function TCS_Create_Log ()
	local DateAndTime = os.date()
	local TCSLog = io.open("data/Logs/log.txt","w")
	TCSLog:write("[Log Created] "..DateAndTime.."\n\n")
	TCSLog:close()
end


function TCS_Log_Update(update_arg)
	local DateAndTime1 = os.date("%H:%M.%S")
	local TCSLogU = io.open("data/Logs/log.txt","a")
	TCSLogU:write("\n["..DateAndTime1.."]\t\t"
..tostring(update_arg)) 
	TCSLogU:close()
end


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

-- создаем функцию, которая не принимает никаких аргументов
function TCS_Create_Log ()
	--устанавливает переменную времени и даты
	local DateAndTime = os.date()
	--открывает текстовый файл в каталоге. Установите режим записи ("W"), так что если текстовый файл 
	--существует, он будет перезаписан, если нет - он будет создан.
	local TCSLog = io.open("data/Logs/log.txt","w")
	--написать в заголовке дату в журнал, чтобы вы знали, когда это было обновлено.
	TCSLog:write("[Log Created] "..DateAndTime.."\n\n")
	--закрыть лог
	TCSLog:close()
end



--создать функцию, которая принимает только один аргумент
function TCS_Log_Update(update_arg)
	--установить дату в формате HMS переменной
	local DateAndTime1 = os.date("%H:%M.%S")
	--открыть журнал по указанному пути. Открыть в режиме добавления ("A"), который будет добавлять в
	--файл, а не перезаписывать его
	local TCSLogU = io.open("data/Logs/log.txt","a")
	--написать дату в формате HMS перед каждой записью журнала
 	TCSLogU:write("\n["..DateAndTime1.."]\t\t"
..tostring(update_arg)) 
	--закрыть лог
	TCSLogU:close()
end


Использование функции:
Функции должны быть определены, так что я бы посоветовал вам сделать это в начале вашего скрипта. Помните, что скрипты читаются логически (в основном), поэтому вы должны определить функцию до ее вызова. Сейчас я напишу как вы вызовете функцию, чтобы создать журнал только один раз, чтобы он переписывал все журналы, которые уже существуют. Это делается следующим образом:

TCS_Create_Log ()


Затем вы можете использовать обновления журнала так часто, как вы хотите. Вот пример основного использования:

TCS_Log_Update("hello World!")


Будет выводить следующее в файл журнала:

[12:46.13]		Hello World!


Если вы укажете аргумент функции, который не существует, он будет, скорее всего, пойман им, так как он использует ToString() преобразователь.
Так что код:

TCS_Log_Update(hello World!)


Выведет

[12:46.13]		nil


II.4 Как редактировать компоненты пользовательского интерфейса (основы).

Для редактирования компонентов UI наиболее эффективен такой способ - получить декомпилированный файл, исправить, отредактировать его и перекомпилировать. Это, очевидно, не вариант для большинства людей, так что далее следует простой пример того, как это сделать с помощью scripting.lua и episodicscripting.
Перво-наперво, вам нужно знать имя вашего компонента для редактирования. Нет простого способа сделать это, вы просто должны пролезть в файлы игры и найти где-то в другом месте, где он ссылается на глобальном уровне (то есть не на месте). Когда вы знаете название компонента для редактирования, необходимо добавить запись в таблицу m_features из таблицы episodicscripting. Это делается путем добавления кода в конец таблицы:

	["disable_end_turn"] = {
		["Enable"] = function()
			out.ting("End turn disabled")
			UIComponent(m_root:Find("button_end_turn")):SetVisible(false)
			UIComponent(m_root:Find("button_end_turn")):SetDisabled(true)
		end,
		["Disable"] = function()
			out.ting("End turn re-enabled")
			UIComponent(m_root:Find("button_end_turn")):SetVisible(true)
			UIComponent(m_root:Find("button_end_turn")):SetDisabled(false)
		end
		},


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

--установить функции название
	["disable_end_turn"] = {
		--определить функции включение
		["Enable"] = function()
			--код, который будет выполняться, когда включенная функция вызывается
			out.ting("End turn disabled")
			UIComponent(m_root:Find("button_end_turn")):SetVisible(false)
			UIComponent(m_root:Find("button_end_turn")):SetDisabled(true)
		end,
		--определить функции отключение
		["Disable"] = function()
			--код, который будет выполняться, когда отключение функции вызывается
			out.ting("End turn re-enabled")
			UIComponent(m_root:Find("button_end_turn")):SetVisible(true)
			UIComponent(m_root:Find("button_end_turn")):SetDisabled(false)
		end
		},


Чтобы действительно изменить компоненты пользовательского интерфейса, вам нужно использовать UIComponent() функцию. Это описано следующим образом:

UIComponent(m_root:Find(<<Name of component>>)):<<function to call on component>>


И например, здесь:

UIComponent(m_root:Find("button_end_turn")):SetDisabled(false)


Я видел только как SetDisabled или SetVisible используются в episodicscripting, но вот другие команды, используемые в luacs:
SetStateText(<<string>>)
SetState(<<string>>) (Only useable if you can compare to UI xmls)
SetTooltipText(<<string>>)
Есть много больше, но эти являются наиболее актуальными.
Так что теперь вы добавили функцию к таблице, вам необходимо ее назвать. Это довольно просто сделать - в scripting.lua (или в другом месте, где episodicscripting модуль загружается) просто использовать следующий код:

scripting.EnableFeature(<<feature name>>)
scripting.DisableFeature(<<Feature name>>)


EnableFeature будет выполнять любой код определяемый по "Enable" таблице и Функция отключения сделает то же самое по "Disable" таблице.
Пример использования:

scripting.EnableFeature("Hide_prestige_tab") 
scripting.DisableFeature("hide_campaign_hud")

Copyright © «Империал». Копирование информации с этой страницы возможно только при указании прямых ссылок на эту страницу.


      Стиль:
        03 Дек 2016, 01:23
    © 2016 «Империал». Условия предоставления. Ответственность сторон. Рекрутинг на Империале. Лицензия зарегистрирована на: «Империал». Счётчики