Paradox
©
Fisana

Перейти к содержимому


"); //]]>
Фотография

Script-o-Rama


В этой теме нет ответов

#1 DEN Stark

DEN Stark

    Брат-Сардельер

  • Сардельер
  • 4 494 сообщений
  • Откуда:Владивосток
  • Награды:
  • Должность:Бунчужный
  • Создатель:Пихалыч Мод; Ogniem i Mieczem 2:TW
Регистрация: 01.ноя.10
Слава: 703

Отправлено 29 Август 2013 - 07:08

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 записывается следующим образом:
Code:
..
Это две точки без пробела между ними.
Он используется для сращивания строк вместе:
Code:
print("Hello".."World")ScriptORamaVariable = "World"print("Hello "..ScriptORamaVariable)
На выходе получится:
Code:
HelloWorldHello 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

Пример:
Code:
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

Пример:
Code:
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

Пример:
Code:
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

Пример:
Code:
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

Пример:
Code:
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

Пример:
Code:
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() вернет текущий сезон в виде строки.
Возвращает: Текущий сезон в виде строки. Лето или Зима.

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

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

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

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

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

Пример:
Code:
CampaignUI.EntityTypeSelected()
Вернет таблицу, содержащую эту информацию:
Code:
Character: boolean: true  Unit: boolean: false  Slot: boolean: false  Settlement: boolean: false  Entity: userdata    type: string: Pointer    __tostring: function    __eq: function  LocalPlayerOwned: boolean: true  Fort: boolean: false

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

Возвращает: Таблицу деталей фракции

Пример:
Code:
CampaignUI.FactionDetails("britain")
Вернет таблицу, содержащую эту информацию:
Code:
Изображение Нажмите, чтобы прочитать

IsPlayersTurn()
IsPlayersTurn возвращает правду или ложь
Возвращает: true или false в зависимости от того игрока этот ход или нет.
Пример:
Code:
CampaignUI.IsPlayersTurn()
InitialiseRegionInfoDetails(REGION)
InitialiseRegionInfoDetails возвращает всю информацию вы можете получить об определенном регионе. Вы должны предоставить указатель (получите его от RegionsOwnedByFaction например)

Параметры: указатель региона

Возвращает: Таблицу деталей региона

Пример:
Code:
tab = CampaignUI.RegionsOwnedByFaction("france") details = CampaignUI.InitialiseRegionInfoDetails(tab[1].Address)

Вернет таблицу, содержащую следующую информацию:
Code:
Изображение Нажмите, чтобы прочитать
IsCharacterPlayerControlled(CharacterPointer pointer)
CampaignUI.IsCharacterPlayerControlled() скажет вам, является ли персонаж под контролем игрока.

Возвращает: boolean true или false

Пример:
Code:
entity = CampaignUI.EntityTypeSelected()if entity.Character then        if CampaignUI.IsCharacterPlayerControlled(entity.Entity) then           ...     endend
PlayerFactionId()
Calling CampaignUI.PlayerFactionId() возвращает фракцию игрока.

Возвращает: Фракцию игрока как строку, например "britain"

Пример:
Code:
CampaignUI.PlayerFactionId() == "britain"
PrestigeDetails()
CampaignUI.PrestigeDetails() даст вам доступ к очкам престижа каждой фракции

Возвращает: таблицу престижа фракций

Example:
Code:
CampaignUI.PrestigeDetails()
Вернет таблицу со следующей информацией:
Code:
Изображение Нажмите, чтобы прочитать

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

Возвращает: таблицу с деталями дипломатии фракции.

Пример:
Code:
RetrieveDiplomacyDetails("france")
Пример вывода:
Code:
Изображение Нажмите, чтобы прочитать

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

Возвращает: строка с указанием дипломатического отношения данных фракций

Пример:
Code:
CampaignUI.RetrieveDiplomaticOpinions("france", "britain")
Пример результата:
Code:
Hostile --(враждебные)
RetrieveDiplomaticStanceString(Faction Key 1 (string), Faction Key 2(string))
RetrieveDiplomaticStanceString возвращает дипломатическое состояние двух фракций.

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

Пример:
Code:
CampaignUI.RetrieveDiplomaticStanceString("france", "britain")
Пример результата:
Code:
at war
RegionsOwnedByFaction()
CampaignUI.RegionsOwnedByFaction() даст вам список всех регионов фракции

Параметры: фракция

Возвращает: Таблицу со списком указателей регионов и локализованными названиями регионов

Пример:
Code:
CampaignUI.RegionsOwnedByFaction("britain")
Вернет таблицу со следующей информацией:
Code:
Изображение Нажмите, чтобы прочитать

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

Параметры: фракция

Возвращает: таблицу со списком указателей поселений

Пример:
Code:
CampaignUI.RetrieveFactionRegionList("britain")
Вернет таблицу со следующей инфо:
Code:
Изображение Нажмите, чтобы прочитать

RetrieveFactionMilitaryForceLists(,armies/navies)
CampaignUI.RetrieveFactionMilitaryForceLists() даст вам список всех армий или флотов фракции

Параметры: название фракции, армия или флот как правда или ложь (армия = true)

Возвращает: таблицу с огромным списком деталей армий или флота

Пример:
Code:
CampaignUI.RetrieveFactionMilitaryForceLists("france",true)
Вернет таблицу со следующей информацией:
Code:
Изображение Нажмите, чтобы прочитать
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)

Пример:
Code:
scripting.game_interface:add_exclusion_zone(-100, 100, 100, -100, true, true, true, "britain")
add_restricted_unit_record()
add_restricted_unit_record позволяет удалить юнита из найма во всем мире (по аналогии с SF юнитами)

Параметры: Unit key как строка (как указано в таблице юнитов)

Пример:
Code:
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)

Пример:
Code:
scripting.game_interface:add_restricted_building_level_record("tFactory1_manufactory")
disable_movement_for_faction(Faction Key(String))
disable_movement_for_faction замораживает движение указанной фракции

Параметры: фракция как строка (как указано в db)

Пример:
Code:
scripting.game_interface:disable_movement_for_faction("france")
enable_movement_for_faction(Faction Key(String))
enable_movement_for_faction размораживает фракцию

Параметры: фракция как строка (как указано в db)

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

Параметры: фракция (string), целевая фракция(string)

Пример:
Code:
scripting.game_interface:episodic_attack("france", "britain")
episodic_defend(faction key (string), region(string))
episodic_defend советует AI защищать регион. Это в значительной степени непроверено, результаты могут отличаться

Параметры: фракция (string), регион(string)

Пример:
Code:
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)

Пример:
Code:
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

Пример:
Code:
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)

Пример:
Code:
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)

Пример:
Code:
scripting.game_interface:remove_restricted_building_level_record("tFactory1_manufactory")
remove_restricted_unit_record()
remove_restricted_unit_record снимает ограничение на юнитов, которое было установлено ранее add_restricted_unit_record

Параметры: Unit key as string (as it appears in the units table)

Пример:
Code:
scripting.game_interface:remove_restricted_unit_record("euro_expat_infantry_regiments_etrangeres")
show_shroud(true/false)
show_shroud включает или отключает туман войны

Параметры: true/ false

Пример:
Code:
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)

Пример:
Code:
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

Пример:
Code:
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

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

Изображение Нажмите, чтобы прочитать
Раздел II: Учебник написания скриптов

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

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

Чтобы связать некоторый код с событием вам нужно добавить функцию в конец необходимой таблицы событий следующим образом::
Code:
events.EventName[#events.EventName+1] = function(context)       codeend
Таким образом, следующий код добавляет немного денег фракции в начале ее хода.
Code:
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

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

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

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

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

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

Code:
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
Code:
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, поэтому я включил некоторые комментарии ниже.

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

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

Code:
TCS_Log_Update("hello World!")
Будет выводить следующее в файл журнала:

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

Code:
TCS_Log_Update(hello World!)
Выведет

Code:
[12:46.13]                nil
II.4 Как редактировать компоненты пользовательского интерфейса (основы).

Для редактирования компонентов UI наиболее эффективен такой способ - получить декомпилированный файл, исправить, отредактировать его и перекомпилировать. Это, очевидно, не вариант для большинства людей, так что далее следует простой пример того, как это сделать с помощью scripting.lua и episodicscripting.

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

Code:
["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             },

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

Code:
--установить функции название    ["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() функцию. Это описано следующим образом:

Code:
UIComponent(m_root:Find(>)):>
И например, здесь:

Code:
UIComponent(m_root:Find("button_end_turn")):SetDisabled(false)
Я видел только как SetDisabled или SetVisible используются в episodicscripting, но вот другие команды, используемые в luacs:
SetStateText(>)
SetState(>) (Only useable if you can compare to UI xmls)
SetTooltipText(>)

Есть много больше, но эти являются наиболее актуальными.

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

Code:
scripting.EnableFeature(>)scripting.DisableFeature(>)
EnableFeature будет выполнять любой код определяемый по "Enable" таблице и Функция отключения сделает то же самое по "Disable" таблице.

Пример использования:

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

  • 0

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

--------------------

Пихалыч Мод 1.0       http://yadi.sk/d/18I7TckI3_tfB
Фикс1 от 11.02.2013 http://yadi.sk/d/ECfr3nHe2mSja

Фикс2 от 07.04.2013 http://yadi.sk/d/FrjF2Yee3rerU

0dc86e7facf4.jpg

 





Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных

Total War: WARHAMMER

Мы ждали, мы верили. И наша вера была вознаграждена! Анонс Total War: WARHAMMER состоялся! Скептики были посрамлены, а вахоманы возликовали! Но разработчики на форумах успели уже рассказать немало подробностей. Во первых стало известно? что это будет не одна игра, а трилогия сдобренная целым сомном аддонов и дополнительного платного и бесплатного контента. Во-вторых фракций будет только четыре (Империя Сигмара, Зеленокожие, Гномы и Графы-Вампиры) но обещают сделать их максимально проработанными, богатыми на юниты и реально отличающимися друг от друга по геймплею. В третьих - главы фракций теперь не просто генералы которых не жалко потерять в бою. Теперь это Легендарные Лорды (Карл Франц, Гримгор, Торгрим и Маннфрэд фон Карштайн), герои со уникальным оружием, верховым животным, шмотками и набором квестов. Еще обещают такие новинки как летающие юниты, магию, танки, пушки и мущкеты... в общем вкуснятинка! В общем ждем больше информации и надеемся, что игра станет прорывом в серии.

Ну а апологетам историчности спешим успокоить - над Вархаммер трудится отдельная команда. Исторические игры Тотал Вар производство фэнтэзийной игры не тормозит.

Подробней о Total War: WARHAMMER

Total War: Attila

Анонс Total War: Attila с одной стороны немало удивил нас, а с другой еще раз доказал, что СА идет проторенной дорожкой. Ведь Аттила по сути это сиквэл аддона "Вторжение варваров" для Рима 1. Правда на этот раз они не стали скромничать и назвали его "новой игрой". Ок, мы не будем спорить. Отдельная игра про нашествие варварских племен на цивилизации античного мира - это прекрасно. Нужно отметиьт что разработчики действительно поработали на славу. По мнению большинства игроков, Аттила действительно оказался достойным продуктом, позволившим окунутся в мрачные эпохи.

Подробней о Total War: Attila Часть 1 и Часть 2

Total War: Rome 2

Анонс Rome II Total War состоялся 2 июля и это вызвало настоящую бурю восторга нашего сообщества! Настолько люди истосковались по рукопашному бою и легионерам, что анонс сиквела восприняли как настоящее чудо и "сбычу мечт". Снова вести в бой скованные железной дисциплиной легионы, непоколебимых греческих гоплитов и македонских сариссофоров, топтать врагов слонами и забрасывать отрубленными головами - это ли не счастье! Но ведь новые игры Total War это еще и морские баталии. И тут уж будет море фана, ведь разработчики обещают активное взаимодействие между сухопутными и военно-морскими силами. Обоюдный обстрел между береговыми укреплениями и боевыми кораблями на рейде даст новую степень свободы "стратегосам" античного мира.

Подробней о Total War: Rome II