Перейти к содержанию

grif

Советник
  • Публикаций

    89
  • Зарегистрирован

  • Посещение

  • Победитель дней

    1

grif стал победителем дня 26 сентября 2017

grif имел наиболее популярный контент!

Репутация

34 Это карма

1 Подписчик

  • Alex_teri

Информация о grif

  • Звание
    Пятидесятник

Информация

  • Пол
    Мужчина
  1. Приветствую всех! И мои поздравления победившей команде разработчиков мода! Мне выпала честь огласить список мастеров, которые принимали участие в разработке столь легендарного мода - Русичи TW, и являются твовцами. Итак, администрация TWoW.ru, помимо заявленного сохранения победившего мода в граните (на нашем фтп), решила вручить им соответствующие Ордена и Знаки отличия Мастеров модостроения! Svarogych Maxim Suvorov Lance Tower Ronin Sargon-1 Пума-12 vlad (список возможно будет дополнен, выясняем у кого из остальных есть профили на форуме)
  2. ----------------------------------------------------------------------------------- ----------------------------------------------------------------------------------- -- -- Руководство по основам скриптописания -- ----------------------------------------------------------------------------------- ----------------------------------------------------------------------------------- -- Файлы скриптов находятся в папке campaigns\main_attila - Главная кампания, либо любой другой кампании -- -- символы после которых можно писать любые ваши комментарии, они не будут читаться игрой, игра эту стройку просто перескакивает ----------------------------------------------------------------------------------- -- Ниже файлы - по порядку их важности ----------------------------------------------------------------------------------- 1. scripting.lua -- Первичный файл, загружаемый по сценарию, в котором прописываются имена всех других, работающих в этой кампании, файлов скриптов -- Он не должен изменяться по любой кампании, за исключением имён файлов обратного вызова прописываемых в нижней части пример ввода: require("antonina_incident"); -- требуемый файл с данным именем, окончание не пишется ram = require("random_army"); -- добавляем требуемый файл с данным именем, окончание не пишется ----------------------------------------------------------------------------------- 2. att_start.lua -- Главный файл, в котором прописываются первичные переменные\ключи - то есть, вызываемые ещё до сценария любого другого файла -- В нём же скрипты правил показа Интро роликов, Значения камеры и Вывод каких либо событий в начале кампании ----------------------------------------------------------------------------------- 3. ВСЕ ОСТАЛЬНЫЕ ФАЙЛЫ, прописанные в нижней части файла scripting.lua ----------------------------------------------------------------------------------- -- РАЗБОР ПОЛЁТОВ - основы Скриптописания ----------------------------------------------------------------------------------- Основы - фигуральное описание: Первоначально необходимо прописать переменные, функции, чтоб прочесть и положить данные в память! Главные\важные переменные\функции лучше прописать в att_start, а именно в функцию: start_game_all_factions() - из которой они и читаются, тогда они обязательно будут прочтены машиной в самом начале! Далее следите за выводом переменных\функций по порядку чтения, как это делает машина! Пример: в start_game_all_factions() - лежит Я_Вася(), машина переходит и читает что ежит в Я_Вася(), после этого обратно в start_game_all_factions() или - если в Я_Вася() есть функция ХочуЕсть() - идёт в ХочуЕсть() и тд.! -- ==================================================== Основы - как есть: Для начала прописываем переменную (ввод в память переменой) и её значение по умолчанию: SAFE_DISTANCE_FROM_PLAYER = 20; -- прописываем любую придуманную вами переменную, здесь её Инициализация\зарождение (дисстанция до игрока 20) -- ==================================================== Пример ввода функции: function start_game_all_factions() -- функция с именем "Старт_игры_всех_фракций" output("start_game_all_factions() called"); -- вывод в лог событий какого то текста start_all_hun_preservation_systems(); -- прописываем вывод функции, то есть - игра переходит на данную функцию, читает её следующей end -- закрытие данного блока действия end; -- закрытие всего блока -- ==================================================== Пример ввода наблюдателя: cm:add_listener( -- вывод наблюдателя (следящий за сигналом) - это какое либо произошедшие событие (ниже описание события) "FactionTurnStart_UNIT", -- любое имя события "FactionTurnStart", -- а вот это уже тип события - в данном случае FactionTurnStart - ФракцияВНачалеХода true, function(context) -- во время события ФракцияВНачалеХода - срабатывает функция, имеющая в себе контекстом информацию Check_faction_list(context); -- ваше имя срабатываемой функции с контекстом информации Check_faction_list2(); -- вторая функция без контекста информации end, -- закрытие данного блока действия true ); -- закрытие всего блока ----------------------------------------------------------------------------------- -- БОЛЕЕ ДЕТАЛЬНО ----------------------------------------------------------------------------------- Добавляем обратный вызов, который является функцией или набором функций, которые будут вызываться при отправке заданного сигнала. Рассмотрим более детально каждый код: cm: add_listener ("name", "signalName", funcA, funcB) -- команда: Добавить_наблюдателя ("Имя", "ИмяСигнала", ФункцияA, Функция -- нужное вам имя сигнала - нужно найти в справочнике -- ==================================================== Разбор примеров Функций: Первый пример функции: chance = 5; -- переменная имеет значение 5 function(context) local faction = context:faction(); -- local переменная - это переменая использующая значение только в этой функции! return cm:random_number(100) <= chance and not faction:is_human() and faction:culture() == "wh2_main_lzd_lizardmen"; end -- вторая строчка: вернуть значение true если: фракция НЕ человек (= не игрок), является культурой ящериц и выпадает 5% шансов (бросок кубиков) -- следовательно, функция, имеющая 4-ри аргумента слушателя, запускается только тогда, когда этот кусок кода возвращает(передаёт) значение true\верно. -- ==================================================== Второй пример: function(context) local faction = context:faction(); return faction:is_human() and faction:culture() == "wh2_main_lzd_lizardmen" and cm:model():turn_number() % 10 == 0; end, -- вторая строчка: говорит что, условие - это фракция, является человеком (= игроком) и ящерицами и находится на номере_хода, когда номер_хода % 10 == 0 (= каждые 10 ходов) -- следовательно, функция запускается только тогда, когда этот кусок кода станет верен. ----------------------------------------------------------------------------------- -- Ссылки на важные справочники, на официальном сайте СА! ----------------------------------------------------------------------------------- Для Аттилы: События: http://wiki.totalwar.com/w/Total_War:_ATTILA_KIT_-_Extra_Scripting_Guides Действия: http://wiki.totalwar.com/w/Total_War:_ATTILA_KIT_-_Campaign_Script_Interface -- Справочники по другим играм ищите так же на оф. сайте, они все должны там быть! ----------------------------------------------------------------------------------- АВТОР: grif Под спойлером: Язык LUA - подробно разжёвано для чайников Язык LUA - подробно разжёвано для чайников Скрипты на языке Lua Написанный на Lua скрипт не имеет какой-либо специальной функции, с которой начиналось бы его выполнение. Скрипт можно рассматривать просто как набор команд (инструкций), который выполняется, начиная с первой инструкции. Скрипт может быть как очень простым, состоящим всего из одной команды, так и весьма сложным, содержащим десятки, сотни и даже тысячи инструкций. Следующие друг за другом инструкции могут разделяться точкой с запятой ( . Однако это требование не является обязательным, поэтому весь приведённый ниже код является корректным с точки зрения синтаксиса: a = 1; b = 2 a = 1 b = 2 a = 1; b = 2; a = 1 b = 2 Работа с переменными в Lua Переменные используются для хранения значений в процессе выполнения скрипта. Имена переменных в Lua Именами (идентификаторами) переменных в Lua могут быть любые последовательности из букв, цифр и символа подчеркивания, начинающиеся не с цифры. Обратите внимание Язык Lua различает регистр символов, поэтому abc, Abc, ABC являются различными именами. В таблице ниже приведены слова, которые зарезервированы языком Lua и не могут использоваться в именах переменных: and break do else elseif end false for function if in local nil not or repeat return then true until while Кроме того, все имена, начинающиеся с символа подчеркивания, за которым идут заглавные буквы (например, _VERSION) также являются зарезервированными. Какие переменные бывают в Lua? Переменные в Lua могут быть глобальными и локальными. Если переменная не объявлена явно как локальная, она считается глобальной. Глобальные переменные Lua Глобальная переменная появляется в момент присваивания ей первого значения. До присваивания первого значения обращение к глобальной переменной даёт nil. MsgBox(tostring (g)) --> nil g = 1 MsgBox(tostring (g)) --> 1 Глобальная переменная существует до тех пор, пока существует среда исполнения скрипта и доступна любому Lua-коду, выполняемому в этой среде. При необходимости удалить глобальную переменную можно явным образом, просто присвоив ей значение nil. g = 1 — создаем глобальную переменную g со значением 1 ... g = nil — удаляем глобальную переменную g MsgBox(tostring (g)) --> nil Все глобальные переменные являются полями обычной таблицы, называемой глобальным окружением. Эта таблица доступна через глобальную переменную _G. Поскольку полями глобального окружения являются все глобальные переменные (включая саму _G), то _G._G == _G. Локальные переменные Lua Любые локальные переменные должны быть объявлены явно с использованием ключевого слова local. Объявить локальную переменную можно в любом месте скрипта. Объявление может включать в себя присваивание переменной начального значения. Если значение не присвоено, переменная содержит nil. local a — объявляем локальную переменную a local b = 1 — объявляем локальную переменную b, присваиваем ей значение 1 local c, d = 2, 3 — объявляем локальные переменные c и d, присваиваем им значения 2 и 3 Область видимости локальной переменной начинается после объявления и продолжается до конца блока. Примечание Областью видимости переменной называется участок кода программы, в пределах которого можно получить доступ к значению, хранящемуся в данной переменной. Под блоком понимается: тело управляющей конструкции (if-then, else, for, while, repeat); тело функции; фрагмент кода, заключённый в ключевые слова do...end. Если локальная переменная определена вне какого-либо блока, её область видимости распространяется до конца скрипта. a = 5 — глобальная переменная a local i = 1 — переменная i локальна в пределах скрипта while i <= a do — цикл от 1 до 5 local a = i^2 — переменная а локальна внутри цикла while MsgBox(a) --> 1, 4, 9, 16, 25 i = i + 1 end MsgBox(a) --> 5 (здесь обращение к глобальной a) if i > 5 then local a — переменная а локальна внутри then a = 10 MsgBox(a) --> 10 else MsgBox(a) --> 5 (здесь обращение к глобальной a) end do local a = 20 — переменная а локальна внутри do-end MsgBox(a) --> 20 end MsgBox(a) --> 5 (здесь обращение к глобальной a) Обратите внимание Когда возможно, рекомендуется использовать локальные переменные вместо глобальных. Это позволит избежать «засорения» глобального пространства имён и обеспечит лучшую производительность (поскольку доступ к локальным переменным в Lua выполняется несколько быстрее, чем к глобальным). Типы данных Lua Какие типы данных поддерживает язык Lua? Lua поддерживает следующие типы данных: 1. Nil (ничего). Соответствует отсутствию у переменной значения. Этот тип представлен единственным значением — nil. 2. Boolean (логический). К данному типу относятся значения false (ложь) и true (истина). При выполнении логических операций значение nil рассматривается как false. Все остальные значения, включая число 0 и пустую строку, рассматриваются как true. 3. Number (числовой). Служит для представления числовых значений. В числовых константах можно указывать необязательную дробную часть и необязательный десятичный порядок, задаваемый символами «e» или «E». Целочисленные числовые константы можно задавать в шестнадцатеричной системе, используя префикс 0x. Примеры допустимых числовых констант: 3, 3.0, 3.1415926, 314.16e-2, 0xff. 4. String (строковый). Служит для представления строк. Строковые значения задаются в виде последовательности символов, заключённой в одинарные или двойные кавычки: a = «это строка» b = 'это вторая строка' Строки, заключённые в двойные кавычки, могут интерпретировать C-подобные управляющие последовательности (escape-последовательности), начинающиеся с символа «\» (обратный слэш): \b (пробел), \n (перевод строки), \r (возврат каретки); \t (горизонтальная табуляция), \\ (обратный слеш); \'' (двойная кавычка); \' (одинарная кавычка). Обратите внимание Символ в строке также может быть представлен своим кодом с помощью escape-последовательности: \ddd, где ddd — последовательность из не более чем трёх цифр. Кроме кавычек для определения строки могут также использоваться двойные квадратные скобки: local a = [[Компания «Кронос»]] Определение строки с помощью двойных квадратных скобок позволяет игнорировать все escape-последовательности, т. е. строка создаётся полностью так, как описана: local a = [[string string1 string2 string3 ]] — «string string1 string2 string3» Примечание При определении строки с помощью двойных квадратных скобок учитываются символы табуляции и переноса. Двойные скобки могут быть вложенными. Для того чтобы их не перепутать, между скобками вставляется символ«равно» (=): local a = [=[определение строки [[string]] в Lua]=] — будет срока: «определение строки [[string]] в Lua» 5. Function (функция). Функции в Lua могут быть записаны в переменные, переданы как параметры в другие функции ивозвращены как результат выполнения функций. 6. Table (таблица). Таблица представляет собой набор пар «ключ» — «значение», которые называют полями илиэлементами таблицы. Как ключи, так и значения полей таблицы могут иметь любой тип, за исключением nil. Таблицы не имеют фиксированного размера: в любой момент времени в них можно добавить произвольное число элементов. Подробнее — в статье «Создание таблиц в Lua» 7. Userdata (пользовательские данные). Является особым типом данных. Значения этого типа не могут быть созданы или изменены непосредственно в Lua-скрипте. Userdata используется для представления новых типов, созданных в вызывающей скрипт программе или в библиотеках, написанных на языке С. Например, библиотеки расширений Lua для «CronosPRO» используют этот тип для представления таких объектов, как: банки данных (класс Bank); базы данных (класс Base); записи (класс Record) и т. п. 8. Thread (поток). Соответствует потоку выполнения. Эти потоки никаким образом не связаны с операционной системой и поддерживаются исключительно средствами самого Lua. Как в Lua задать тип переменной? Lua не предусматривает явного задания типа переменной. Тип переменной устанавливается в момент присвоения переменной значения. Любой переменной может быть присвоено значение любого типа (вне зависимости от того, значение какого типа она содержала ранее). a = 123 — переменная a имеет тип number a = «123» — теперь переменная a имеет тип string a = true — теперь переменная a имеет тип boolean a = {} — теперь переменная a имеет тип table Обратите внимание Переменные типа table, function, thread и userdata не содержат самих данных, а хранят ссылки на соответствующие объекты. При присваивании, передачи в функцию в качестве аргумента и возвращении из функции в качестве результата копирования объектов не происходит, копируются только ссылки на них. a = {} — создаем таблицу. В переменную a помещается ссылка на таблицу b = a — переменная b ссылается на ту же таблицу, что и a a[1] = 10 — элементу таблицы с индексом 1 присвоено значение 10 MsgBox(b[1]) --> '10' b[1] = 20 MsgBox(a[1]) --> '20' Остальные данные являются непосредственными значениями. a = 10 b = a a = 20 MsgBox(a) --> '20' MsgBox( --> '10' Как в Lua получить тип переменной? Тип значения, сохранённого в переменной, можно выяснить при помощи стандартной функции type. Эта функция возвращает строку, содержащую название типа («nil», «number», «string», «boolean», «table», «function», «thread», «userdata»). t = type («это строка») — t равно «string» t = type (123) — t равно «number» t = type (type) — t равно «function» t = type (true) — t равно «boolean» t = type (nil) — t равно «nil» t = type (CroApp.GetBank()) — t равно «userdata» Как в Lua преобразовать тип переменной? Lua при необходимости автоматически преобразует числа в строки и наоборот. Например, если строковое значение является операндом в арифметической операции, оно преобразуется в число. Аналогично числовое значение, встретившееся в том месте, где ожидается строковое, будет преобразовано в строку. a = «10» + 2 — a равно 12 a = «10» + 2 — a равно «10 + 2» a = "-5.3e-10"*«2» — a равно -1.06e-09 a = «строка» + 2 — Ошибка! Невозможно преобразовать «строка» в число Значение любого типа можно явным образом преобразовать в строку с помощью стандартной функции tostring. a = tostring (10) — a равно «10» a = tostring (true) — a равно «true» a = tostring (nil) — a равно «nil» a = tostring ({[1] = «это поле 1»}) — a равно «table: 06DB1058» Из предыдущего примера видно, что содержимое таблиц функцией tostring не преобразуется. Выполнить такое преобразование можно с помощью функции render. a = render (10) — a равно «10» a = render (true) — a равно «true» a = render (nil) — a равно «nil» a = render ({[1] = «это поле 1»}) — a равно "{[1] = «это поле 1»}" Для явного преобразования значения в число можно использовать стандартную функцию tonumber. Если значение является строкой, которую можно преобразовать в число (или уже является числом), функция возвращает результат преобразования, в противном случае возвращает nil. a = tonumber («10») — a равно «10» a = tonumber («10»..".5") — a равно 10.5 a = tonumber (true) — a равно «nil» a = tonumber (nil) — a равно «nil» Расстановка комментариев в Lua Комментарий в Lua начинается двумя знаками «минус» (--) и продолжается до конца строки. local a = 1 — однострочный комментарий Если непосредственно после символов «--» идут две открывающие квадратные скобки ([[), комментарий являетсямногострочным и продолжается до двух закрывающих квадратных скобок (]]). local a = 1 — [[ многострочный комментарий ]] Двойные скобки в комментариях могут быть вложенными. Для того чтобы их не перепутать, между скобками вставляется знак равенства (=): local a = [[Компания «Кронос»]] — [=[ local a = [[Компания «Кронос»]] ]=] Количество символов «=» определяет вложенность: local a = [=[определение некоторой строки [[string]] в языке Lua]=] --[==[ local a = [=[определение некоторой строки [[string]] в языке Lua]=] ]==] Операции, применяемые в Lua В выражениях, написанных на Lua, могут применяться следующие виды операций: 1. Арифметические операции. Lua поддерживает следующие арифметические операции: + (сложение); — (вычитание); * (умножение); / (деление); ^ (возведение в степень); % (остаток от деления). Обратите внимание Арифметические операции применимы как к числам, так и к строкам, которые в этом случае преобразуются в числа. 2. Операции сравнения. В Lua допустимы следующие операции сравнения величин: == (равно); ~= (не равно); < (меньше); > (больше); <= (меньше или равно); >= (больше или равно). Обратите внимание Операции сравнения всегда возвращают логическое значение true или false. Правила преобразования чисел в строки (и наоборот) при сравнениях не работают, т. е. выражение «0» == 0 даёт в результате false. 3. Логические операции. К логическим операциям относятся: and (логическое И). Операция and возвращает свой первый операнд, если он имеет значение false или nil. В противном случае, операция возвращает второй операнд (причём этот операнд может быть произвольного типа). a = (nil and 5) — a равно nil a == (false and 5) — a равно false a == (4 and 5) — a равно 5 or (логическое ИЛИ). Операция or возвращает первый операнд, если он не false и не nil, иначе он возвращает второй операнд. a == (4 or 5) — a равно 4 a == (false or 5) — a равно 5 Обратите внимание Логические операции and и or могут возвращать значения любых типов. Логические операции and и or вычисляют значение второго операнда только в том случае, если его нужно вернуть. Если этого не требуется, второй операнд не вычисляется. Например: a == (4 or f()) — вызова функции f() не произойдет not (логическое НЕ). Операция not всегда возвращает true или false. 4. Операция конкатенации. Для конкатенации (объединения) строк служит операция… (две точки). a = «Кронос».."-"..«Информ» — переменная a получит значение «Кронос-Информ» Обратите внимание Если один или оба операнда являются числами, выполняется их преобразование в строки. a = 0..1 — переменная a получит значение «01» 5. Операция получения длины. В Lua определена операция длины #, которую можно использовать для получения длины строки. a = «строка» len = #a — len равно 6 len = #«ещё строка» — len равно 10 Обратите внимание С помощью операции # можно также узнать максимальный индекс (или размер) массива. Подробнее — в статье «Работа с массивами в Lua» . Приоритет операций в Lua В языке Lua выполнение операций осуществляется в соответствии со следующим приоритетом (в порядке убывания): 1. ^ 2. not # — (унарный) 3. * / % 4. + - 5. .. 6. < > <= >= ~= == 7. and 8. or Вызов скриптов из форм С каждой формой (включая вложенные формы) связан отдельный скрипт, который обычно содержит функции, выполняющие обработку событий формы и её элементов. Когда форма запускается, её скрипт загружается в глобальное окружение. При возникновении события формы или её элемента система вызывает сопоставленную этому событию функцию-обработчик. Необходимо отметить, что скрипт формы, хотя и не содержит вызова функции module, фактически является модулем. Это означает, что переменные, объявленные в скрипте формы без ключевого слова local, не выносятся в глобальное окружение и доступны только внутри этого скрипта. Если необходимо сделать какое-либо значение доступным для скриптов других форм, его следует явным образом определить в глобальной таблице _G: _G.var = 123 Другой скрипт форм сможет прочитать это значение следующим образом: local a = _G.var Блоки операторов (инструкций) К основным операторам Lua относятся: присваивание; условный оператор; операторы для организации циклов. Группа операторов может быть объединена в блок (составной оператор) при помощи конструкции do… end. do — начало блока <оператор1> — тело блока <оператор2> ... <операторN> end — конец блока Блок открывает новую область видимости, в которой можно определять локальные переменные. a = 5 — глобальная переменная a do local a = 20 — внутри do-end определяется локальная переменная а MsgBox(a) --> 20 end MsgBox(a) --> 5 (здесь обращение уже к глобальной a) Оператор присваивания в Lua Присваивание изменяет значение переменной или поля таблицы. В простейшем виде присваивание может выглядеть так: a = 1 — переменной a присвоено значение 1 a = b + c — переменной a присвоена сумма значений переменных b и с a = f(x) — переменной a присвоено значение, возвращённое функцией f(x) В Lua допускается так называемое множественное присваивание, когда несколько переменных, находящихся слева от оператора присваивания, получают значения нескольких выражений, записанных справа от оператора присваивания: a, b = 1, 5*c — a равно 1; b равно 5*c Если переменных больше чем значений, «лишним» переменным присваивается nil. a, b, c = 1, 2 — a равно 1; b равно 2; c равно nil Если значений больше чем переменных, «лишние» значения игнорируются. a, b = 1, 2, 3 — a равно 1; b равно 2; значение 3 не использовано Множественное присваивание можно использовать для обмена значениями между переменными: a = 10; b = 20 — a равно 10, b равно 20 a, b = b, a — теперь a равно 20, b равно 10 Условный оператор (if) в Lua Оператор if проверяет истинность заданного условия. Если условие является истинным, выполняется часть кода, следующая за ключевым словом then (секция then). В противном случае, выполняется код, следующий за ключевым словом else (секция else). if a > b then return a — если a больше b, вернуть a else return b — в противном случае — вернуть b end Секция else является необязательной. if a < 0 then a = 0 — если a меньше 0, присвоить a значение 0 end Вместо вложенных операторов if можно использовать конструкцию elseif. Например, приведенный код: if a == 1 then return «Иван» — если a равно 1 else if a == 2 then return «Петр» — если a равно 2 else if a == 3 then return «Сергей» — если a равно 3 else return «Нет такого игрока» — если a — ни одно из перечисленных end end end будет проще для восприятия, если заменить его следующим: if a == 1 then return «Иван» — если a равно 1 elseif a == 2 then return «Петр» — если a равно 2 elseif a == 3 then return «Сергей» — если a равно 3 else return «Нет такого игрока» — если a — ни одно из перечисленных end Цикл с предусловием (while) в Lua Оператор while предназначен для организации циклов с предусловием и имеет следующий вид: while <condition> do … — тело цикла end Перед каждой итерацией цикла проверяется условие <condition>: если условие ложно, цикл завершается и управление передаётся первому оператору, следующему за оператором while; если условие истинно, выполняется тело цикла, после чего все действия повторяются. i = 10; t = {} while i > 0 do — цикл от 10 до 1 t = «поле »..i i = i — 1 end Для выхода из цикла до его завершения можно использовать оператор break. a = {3, 5, 8, -6, 5} i = #a while i > 0 do — ищем в массиве отрицательное значение if a < 0 then break end — если найдено, прерываем цикл i = i — 1 — иначе переходим к следующему элементу end if i > 0 then MsgBox («Индекс отрицательного значения: »..i) else MsgBox («Массив не содержит отрицательных значений») end Цикл с постусловием (repeat) в Lua Оператор repeat предназначен для организации циклов с постусловием и имеет следующий вид: repeat … — тело цикла until <condition> Тело цикла выполняется до тех пор, пока условие <condition> не станет истинным. Проверка условия осуществляется после выполнения тела цикла, поэтому в любом случае тело цикла выполнится хотя бы один раз. — суммируем значения массива a, пока сумма не превысит 10 a = {3, 2, 5, 7, 9} i = 0; sum = 0 repeat i = i + 1 sum = sum + a until sum > 10 MsgBox («Сложено »..i.." элементов. Сумма равна "..sum) Для выхода из цикла до его завершения можно использовать оператор break. Примечание Подробнее об особенностях использования оператора break — в статье «Операторы break и return» Циклы с оператором for в Lua Оператор for предназначен для организации циклов и допускает две формы записи: простую (числовой for); расширенную (универсальный for). Простая форма оператора for Простая форма оператора for имеет следующий вид: for var = exp1, exp2, exp3 do … — тело цикла end Тело цикла выполняется для каждого значения переменной цикла (счётчика) var в интервале от exp1 до exp2, с шагом exp3. Примечание Шаг может не задаваться. В этом случае он принимается равным 1. for i = 1, 10 do — цикл от 1 до 10 с шагом 1 MsgBox («i равно »..i) end for i = 10, 1, -1 do — цикл от 10 до 1 с шагом -1 MsgBox («i равно »..i) end Обратите внимание Выражения exp1, exp2 и exp3 вычисляются всего один раз, перед началом цикла. Так, в примере ниже, функция f(x) будет вызвана для вычисления верхнего предела цикла только один раз: for i = 1, f(x) do — цикл от 1 до значения, возвращенного функцией f() MsgBox («i равно »..i) end Переменная цикла является локальной для оператора цикла и по его окончании не определена. for i = 1, 10 do — цикл от 1 до значения, возвращенного функцией f() MsgBox («i равно »..i) end MsgBox («После выхода из цикла i равно »..i) — Неверно! i равно nil Обратите внимание Значение переменной цикла нельзя изменять внутри цикла: последствия такого изменения непредсказуемы. Для выхода из цикла до его завершения используется оператор break. a = {3, 5, 8, -6, 5} for i = 1,#a do — ищем в массиве отрицательное значение if a < 0 then — если найдено... index = i — сохраняем индекс найденного значения... break — и прерываем цикл end end MsgBox («Индекс отрицательного значения: »..index) Примечание Подробнее об особенностях использования оператора break — в статье «Операторы break и return» ) Расширенная форма оператора for В расширенной форме оператора for для последовательного получения значений переменной цикла используется вызов итератора. Цикл завершается, когда итератор возвращает nil. Примечание Под итератором понимается любая конструкция, позволяющая перебирать элементы некоторого набора. При каждом обращении к итератору он возвращает очередной элемент набора. В Lua итераторы обычно реализуются в виде функций. Расширенная форма оператора for имеет следующий вид: for var1, var2, …, varN in <explist> do … — тело цикла end где: var1, var2, ..., varN — список переменных, получающих значения на каждом шаге цикла. Список может состоять из одной или нескольких переменных, разделённых запятыми. Первую в списке переменную называют управляющей переменной цикла. Когда эта переменная получает возвращённое итератором значение nil, цикл завершается. Остальные переменные на ход выполнения цикла влияния не оказывают; <explist> — список выражений, разделённых запятыми. Обычно список состоит из единственного выражения — вызова функции-фабрики итераторов. Такая функция возвращает функцию-итератор, состояние и начальное значение управляющей переменной цикла. Оператор for в расширенной форме имеет те же особенности, что и числовой for: переменные цикла var1, var2, ..., varN являются локальными для оператора цикла и по его окончании не определены; значения переменных цикла нельзя изменять внутри цикла. В качестве примера использования расширенной формы оператора for рассмотрим типичный код, выполняющий обход всех полей таблицы. for key, val in pairs(t) do MsgBox («key == »..key.."; val == "..val) end Список переменных в данном примере включает два элемента — key и val. На каждом шаге цикла переменная keyполучает ключ очередного поля таблицы t, а переменная val — соответствующее ключу значение поля. В список выражений входит только один элемент — вызов функции-фабрики итераторов pairs. Работает расширенный оператор for следующим образом: Вызывает функцию pairs(t), от которой принимает три значения: стандартную функцию next в качестве итератора; таблицу, которую требуется обойти (t), в качестве состояния; nil в качестве начального значения управляющей переменной цикла. Вызов функции pairs выполняется только один раз. Оператор for приступает к выполнению, собственно, итераций цикла: вызывает функцию-итератор next с двумя параметрами: таблицей t и nil. Функция next, вызванная с этими параметрами, возвращает начальный ключ таблицы и соответствующее ему значение (при условии, что таблица не пуста); вновь вызывает функцию next, передавая ей таблицу t и ключ, полученный на первой итерации. Функция nextвозвращает следующую пару ключ-значение. Этот процесс продолжается до тех пор, пока функция next не вернётnil. Описываемые действия можно представить в виде следующего кода: do local f, s, next_key = pairs(t) while true do local key, val = f(s, next_key) next_key = key if next_key == nil then break end MsgBox(«key == »..key.."; val == "..val) end end Выполняющий все описанные действия цикл for можно реализовать и без использования функции pairs. Известно, чтоpairs возвращает функцию next и таблицу, которую следует обойти. Поэтому вызов pairs можно заменить списком соответствующих переменных: for key, val in next, t do MsgBox («key == »..key.."; val == "..val) end Примечание Помимо pairs, стандартные библиотеки Lua предоставляют ещё несколько функций-фабрик итераторов. Так, для перебора элементов массива предусмотрена функция ipairs, а для итерирования по строкам файла — функция io.lines. Вы можете создавать свои собственные итераторы и фабрики итераторов. Для получения необходимой информации рекомендуем Вам обратиться к специализированной литературе по программированию на языке Lua. Операторы break и return в Lua Оператор break прерывает цикл (while, repeat или for), в теле которого встречается. В результате выполнения оператора break управление передаётся первой инструкции, следующей непосредственно за оператором цикла. for i = 1,#a do — ищем в массиве отрицательное значение if a < 0 then — если найдено... index = i — сохраняем индекс найденного значения... break — и прерываем цикл end end Оператор return возвращает результаты из функции (или блока). function f (x) return x^2 end Оператор return может просто завершать работу функции (блока), не возвращая никаких результатов. Обратите внимание Операторы break и return могут быть только последними операторами блока (иначе следующие за ними операторы никогда не выполнятся). Если действительно необходимо вставить return или break в середину блока, например, чтобы временно отключить выполнение части кода функции, эти операторы следует заключить в свой блок do–end. function f1 (x) return — НЕВЕРНО! <другие операторы> end function f2 (x) do return end — Правильно <другие операторы> end Создание таблиц в Lua. Работа с полями Создать пустую таблицу можно следующим образом: t = {} Для доступа к полю таблицы используется запись вида: имя_переменной[ключ] t = {} — создаем пустую таблицу t[1] = «first» — новое поле таблицы, с ключом 1 и значением «first» t[2] = 20 — новое поле, с ключом 2 и значением 20 k = «name» t[k] = «Jane» — новое поле, с ключом «name» и значением «Jane» a = t[1] — переменная a получает значение «first» b = t[2] — переменная b получает значение 20 c = t[«name»] — переменная c получает значение «name» В случае строковых ключей вместо записи t[«name»] можно использовать запись t.name: t.name = «name» — эквивалентно t[«name»] = «name» a = t.name — эквивалентно a = t[«name»] Обратите внимание Выражение t.name не равнозначно t[name]. Первое выражение представляет поле таблицы, ключом которого являетсястрока «name» (то есть эквивалентно t[«name»]). Второе выражение представляет поле, ключом которого является значение переменной name. Различия между этими выражениями показаны в следующем примере: t = {} name = «somebody» t[name] = «Jane» — в поле «somebody» помещено значение «Jane» a = t[name] — переменная a получает значение поля «somebody» («Jane») b = t.name — поля «name» не существует, переменная b получает nil c = t.somebody — переменная c получает значение поля «somebody» («Jane») Если поля таблицы с заданным ключом не существует, обращение к нему дает nil: t = {} a = t.name — переменная a получает значение nil Для удаления поля таблицы достаточно присвоить ему nil: t.second = nil Таблицу можно заполнить значениями непосредственно при создании. Для этого в фигурных скобках следует перечислить ключи и значения элементов таблицы (в формате [ключ]=значение). Элементы отделяются друг от друга запятыми (,) или точками с запятой ( : t = {[«red»]=«красный», [«green»]=«зеленый», [«blue»]=«синий»} Приведённая запись эквивалентна следующему коду: t = {} t.red = «красный»; t.green = «зеленый»; t.blue = «синий» В случае строковых ключей квадратные скобки (и двойные кавычки) можно не указывать: t = {red=«красный», green=«зеленый», blue=«синий»} Если необходимо создать таблицу, поля которой также являются таблицами, это можно сделать следующим образом: points = { a = {x=20, y=1}, b = {x=40, y=2} } Приведённая запись эквивалентна следующему коду: points = {} p.a = {x=20, y=1}, p.b = {x=40, y=2} Работа с массивами в Lua Массив — это таблица, ключами которой являются целые положительные числа. Чтобы создать массив, достаточно перечислить в фигурных скобках значения его элементов: t = {«красный», «зеленый», «синий»} Это выражение эквивалентно следующему коду: t = {[1]=«красный», [2]=«зеленый», [3]=«синий»} Обратите внимание В Lua массивы индексируются, начиная с 1 (а не с 0, как в некоторых языках программирования). Оператор получения длины #, применённый к массиву, возвращает его максимальный индекс (или размер): t = {«красный», «зеленый», «синий»} n = #t — n равно 3 В примере ниже приведён ряд типичных для Lua синтаксических конструкций (идиом), основанных на использовании оператора #: a = t[#t] — присвоим переменной a значение последнего элемента массива t t[#t] = nil — удалим последний элемент массива t t[#t+1] = a — добавим значение переменной a в конец массива t Обратите внимание При работе с массивами следует учитывать важную особенность оператора #. Этот оператор рассматривает любой неинициализированный (имеющий значение nil) элемент массива как признак конца массива. Поэтому, например, для таблицы: t = {[1]=«first», [3]=«third»} — элемент с индексом 2 отсутствует (t[2]==nil) оператор получения длины вернёт 1, а не 2 или 3. Таким образом, для корректной работы оператора # необходимо, чтобы массив не содержал «пустых» элементов. Если таблица не содержит целочисленных ключей (либо элемент с индексом 1 равен nil), оператор # возвращает 0: t = {red=«красный», green=«зеленый», blue=«синий»} n = #t — n равно 0 t = {[2]=«красный», [3]=«зеленый», [4]=«синий»} n = #t — n равно 0 (поскольку t[1] имеет значение nil) Обход элементов таблицы в Lua Для обхода всех элементов таблицы обычно используют расширенную форму оператора for совместно со стандартной функцией pairs. t = { name = «Евгений», surname = «Степанов», age = 12 } for key, val in pairs(t) do MsgBox(key..": "..val) end На каждом шаге цикла переменная key получает ключ очередного поля таблицы t, а переменная val — соответствующее ключу значение поля. Цикл выполняется по всем полям таблицы. Для обхода массива, то есть таблицы с целочисленными ключами, удобнее использовать другую стандартную функцию Lua — ipairs. t = { «Иванов», «Степанов», «Петров» } for i, val in ipairs(t) do MsgBox("№"..i..": "..val) end На каждом шаге цикла переменная i получает числовой индекс очередного поля таблицы t, а переменная val— соответствующее индексу значение поля. Цикл продолжается до первого целого ключа, отсутствующего в таблице. Примечание При обходе массива необходимость в получении индекса зачастую отсутствует. В этом случае переменную i можно не вводить, заменив её символом подчеркивания (_). t = { «Иванов», «Степанов», «Петров» } for _, val in ipairs(t) do MsgBox(val) end Обойти массив можно и с помощью обычного числового for. t = { «Иванов», «Степанов», «Петров» } for i = 1, #t do MsgBox(«Значение элемента №»..i..": "..t) end Определение функций в Lua Типичное определение функции выглядит следующим образом: function f(x,y) return x*y — тело функции end Как видно из этого примера, определение функции состоит из следующих элементов: ключевого слова function; имени (f в данном примере); заключённого в круглые скобки списка аргументов функции (возможно, пустого); тела функции, размещённого между закрывающей скобкой и ключевым словом end. Приведённое выше определение функции является просто более удобным способом записи следующего выражения: f = function (x,y) return x*y — тело функции end Таким образом, определение функции фактически выполняет два действия: Создаёт объект типа «функция» (это делает выражение function (x,y)… end). Помещает ссылку на созданную функцию в переменную или поле таблицы (в нашем примере — в переменную f). Обратите внимание Имя f принадлежит переменной, в которую помещена ссылка на функцию, но не самой функции. Любые функции в Lua анонимны, то есть не имеют имён. Когда говорят об имени функции, например, «функция f», на самом деле подразумевают переменную f, содержащую ссылку на эту функцию. У переменных, содержащих ссылки на функции, нет жёсткой привязки к самим функциям; работа с такими переменными осуществляется точно так же, как и с любыми другими переменными. function f(x,y) return x*y end — создаем функцию, переменная f содержит ссылку на эту функцию MsgBox(f(2,3))--> 6 s = f — переменная s ссылается на ту же функцию, что и f MsgBox(s(2,3))--> 6 t = {} t.sqr = f — поле sqr таблицы t ссылается на ту же функцию, что и f MsgBox((t.sqr(2,3))--> 6 f = MsgBox — f теперь «превратилась» в функцию MsgBox f(«Привет, мир!») --> «Привет, мир!» Несмотря на то, что обычно ссылка на созданную функцию присваивается переменной, такое присваивание не является обязательным. В приведённом ниже примере создаётся безымянная функция, которая сразу передаётся в качестве параметра в функцию table.sort: table.sort (t, function (a, return (a > end) Вызов функций в Lua Вызов функции состоит из имени переменной, содержащей ссылку на функцию, и заключённого в круглые скобки списка аргументов (возможно, пустого). a = f(2,3) — вызов функции f с двумя аргументами: 2 и 3 — возвращаемое функцией значение помещается в переменную a Если функции передаётся только один аргумент, и этот аргумент является строковой константой или конструктором таблицы, круглые скобки при вызове функции можно не использовать. require «myscript» — то же самое, что и require («myscript») MsgBox [[Это многострочное значение]] — то же самое, что и MsgBox([[Это многострочное значение]]) render {x=1, y=2} — то же самое, что и render({x=1, y=2}) Ссылка на функцию может быть полем таблицы. В этом случае вызов функции будет выглядеть так: t.f() — вызов функции, на которую ссылается поле f таблицы t В Lua имеется возможность вызова функции в объектно-ориентированном стиле: t:f() --эквивалентно t.f(t) Таким образом, конструкция t:f() вызывает функцию, на которую ссылается поле f таблицы t, и эта же таблица передаётся в функцию в качестве неявного первого аргумента. В качестве аргументов функция может принимать несколько значений. Если при вызове функции последние значения не заданы, им присваивается nil. Если значений больше, чем аргументов, «лишние» значения отбрасываются. Аргументы функции являются локальными переменными внутри функции. function f(x, y) — определение функции MsgBox («x=»..tostring(x).."; "..«y=»..tostring(y)) end f() — вызов функции. x, y равны nil f(1) — вызов функции. x = 1, y равен nil f(1, 2) — вызов функции. x = 1, y = 2 f(1, 2, 3) — вызов функции. x = 1, y = 2, 3 — лишний параметр Функции с переменным числом аргументов в Lua Функция может принимать переменное число параметров. Для этого список аргументов в определении функции должен заканчиваться многоточием (...). function f(x, y, ...) end Все значения, скрытые за многоточием, передаются функции через локальную таблицу arg. Поле n этой таблицы содержит число переданных аргументов. Поэтому значения переданных в функцию аргументов можно получить, например, так: function f(...) for i = 1, arg.n do MsgBox (tostring(arg)) end end f (1,2,3) Возврат значений из функции Lua Функции могут возвращать одно или несколько значений, а также не возвращать значений вообще. function f0() — функция f0 не возвращает значений MsgBox («Вызвана функция f0») end function f1() MsgBox («Вызвана функция f1») return 1 — функция f1 возвращает одно значение end function f3() MsgBox («Вызвана функция f3») return 1, 2, 3 — функция f3 возвращает три значения end f0() — вызов функции f0 a = f1() — вызов функции f1. a = 1 a, b, c = f3() — вызов функции f3. a = 1, b = 2, c = 3 Если количество возвращаемых функцией значений превышает число переменных, которым эти значения должны быть присвоены, «лишние» значения отбрасываются. Если возвращаемых значений меньше, чем переменных, отсутствующие значения заменяются nil. a = f3() — a = 1, значения 2 и 3 отброшены a, b, c = f3() — a = 1, b = 2, значение 3 отброшено a, b, c = f0() — a = nil, b = nil, c = nil a, b, c = f1() — a = 1, b = nil, c = nil Вне зависимости от того, возвращает функция значения или нет, её можно вызвать как оператор. Все возвращаемые функцией значения в этом случае будут отброшены: f3() — значения, возвращенные функцией f3, отброшены Возникают ситуации, когда функция возвращает несколько значений, а переменной требуется присвоить только одно из них. Например, функция возвращает три значения, а для работы нужно только последнее: local a, b, c = f3() Как не задавать лишних имён переменных? Здесь общепринятым способом является использование переменной с именем «_» (символом подчёркивания). Это упрощает внешний вид выражения и указывает на реально используемые переменные. local _, _, c = f3() — нам нужно только третье возвращаемое значение В данном случае, переменная «_» принимает первое, а потом второе возвращаемое значение. Такой же подход часто используется в работе с итераторами: for _, value in pairs() do … — нам нужно только очередное значение, ключ будет присвоен переменной _ end Обратите внимание Переменная с именем «_» является обычной переменной. При использовании этой переменной в других выражениях, она будет переопределяться, т. е. содержать то значение, которое было ей присвоено в последний раз: local _, _, c = f3() — переменная _ будет содержать второй параметр ... f4(_, true) — первым параметром функуции f4 будет не пустое значение, а значение содеражащееся в переменной _ Возврат значений при множественном присваивании При использовании множественного присваивания все возвращаемые функцией значения учитываются только в том случае, если вызов функции является последним (или единственным) выражением в списке выражений справа от оператора присваивания. В противном случае в присваивании участвует только одно (первое) возвращённое функцией значение. a, b, c, d = 5, f3() — a = 5, b = 1, c = 2, d = 3 a, b, c, d = f3(), 5 — a = 1, b = 5, c = nil, d = nil Аналогичным образом учитываются результаты вызова функции, включённого в конструктор таблицы, список аргументов другой функции и в список результатов, возвращаемых оператором return. t = {5, f3()} — t = {5, 1, 2, 3} t = {f3(), 5} — t = {1, 5} func (5, f3()) — вызов функции func с аргументами 5, 1, 2, 3 func (f3(), 5) — вызов функции func с аргументами 1, 5 return 5, f3() — возврат значений 5, 1, 2, 3 return f3(), 5 — возврат значений 1, 5 Возврат функций из функций Функции можно возвращать из функций. Например: function outer() function inner() return 1 end return inner end local i = outer() — значение переменной i равно функции inner local a = i() — вызываем функцию i, значение переменной a равно 1 Базовая библиотека стандартных функций Lua Функции базовой библиотеки Lua Функции базовой библиотеки Lua размещаются в глобальном контексте. В базовую библиотеку входят следующие функции: Имя функции — Описание assert- Генерирует ошибку с необязательным сообщением об ошибке, если значение первого аргумента false или nil. collectgarbage -Обеспечивает интерфейс к сборщику мусора. Первый аргумент определяет выполняемое действие (остановка, запуск сборщика мусора, выполнение сборки мусора и др.). error- Завершает выполнение последней функции, вызванной в защищённом режиме, с заданным сообщением об ошибке. getfenv — Возвращает таблицу контекста заданной функции. Аргумент, определяющий функцию, может быть как, собственно, Lua-функцией, так и числом, определяющим уровень стека, на котором расположена функция. Если он равен 0, возвращается глобальный контекст. getmetatable- Если объект не имеет метатаблицы, возвращает nil. Иначе, если в метатаблице есть поле __metatable, возвращает значение этого поля. В противном случае возвращает метатаблицу объекта. ipairs — Возвращает итератор, таблицу и 0. Возвращаемый итератор проходит таблицу по целочисленным индексам от значения 1 до первого индекса со значением nil. Итератор возвращает текущий индекс и соответствующее ему значение. next- Возвращает следующий (после заданного) индекс в таблице и соответствующее ему значение. Позволяет последовательно получить все поля таблицы. pairs — Возвращает итератор next(), таблицу и nil. Возвращаемый итератор проходит таблицу по всем значениям индекса. Итератор возвращает текущий индекс и соответствующее ему значение. pcall — Вызывает заданную функцию с аргументами в защищённом режиме. Возвращает статус успешности выполнения. rawequal — Сравнивает два объекта, без вызова каких-либо метаметодов. Возвращает значение типа boolean. rawget- Возвращает реальное значение с заданным индексом из таблицы, без вызова каких-либо метаметодов. rawset — Помещает значение в поле таблицы с заданным индексом, без вызова каких-либо метаметодов. select — Если первый аргумент функции имеет числовое значение, возвращаются все аргументы, следующие за аргументом с этим номером. Если первый аргумент — строка ’#’, возвращается общее число полученных аргументов. setfenv — Устанавливает таблицу в качестве контекста для заданной функции. Аргумент, задающий функцию, может быть числом, определяющим положение функции на стеке вызовов. Если он равен 0, устанавливается глобальный контекст текущего потока. setmetatable — Устанавливает (удаляет) метатаблицу для данной таблицы. Если метатаблица содержит поле __metatable, генерирует ошибку. tonumber — Пытается конвертировать аргумент в число. Если конвертирование не удаётся, возвращает nil. tostring — Преобразует аргумент любого типа в строку. type — Возвращает тип аргумента в виде строки. unpack- Возвращает элементы из заданной таблицы. xpcall — Вызывает заданную функцию в защищённом режиме. В отличие от pcall, позволяет установить обработчик ошибок. Не поддерживает передачу аргументов в функцию. Глобальные переменные Помимо функций, базовая библиотека предоставляет также следующие глобальные переменные: Имя переменной Описание _G Таблица, содержащая глобальное окружение скрипта. _M Таблица, содержащая текущий модуль. Библиотека для работы со строками Lua Все функции для работы со строками собраны в таблице string. Поэтому для вызова функций используется запись вида: string.имя_функции(...) Например: string.trim(s) Поддерживается также объектно-ориентированная форма записи. Например: s:trim() — эквивалентно string.trim(s) В библиотеку для работы со строками входят следующие стандартные функции: Имя функции- Описание len- Возвращает длину строки. rep — Возвращает строку, содержащую указанное число копий исходной строки. lower — Заменяет все прописные буквы в строке на строчные. upper — Заменяет в строке все строчные буквы на прописные. reverse — Возвращает строку, в которой символы исходной строки расположены в обратном порядке. format- Генерирует строку по форматной строке и аргументам по правилам, принятым в языке C. byte — Возвращает числовые коды символов строки. char — Преобразует набор числовых кодов символов в строку. find — Выполняет поиск в строке первого вхождения подстроки, соответствующей заданному шаблону. Возвращает индексы начального и конечного символов найденной подстроки. match- Выполняет поиск в строке первого вхождения подстроки, соответствующей заданному шаблону. Возвращает найденную подстроку. gmatch- Возвращает итератор, который на каждой итерации возвращает подстроку, соответствующую заданному шаблону. sub — Возвращает подстроку исходной строки. gsub — Возвращает копию исходной строки, в которой все вхождения шаблона заменены на строку, заданную третьим аргументом. Этот аргумент может быть строкой, таблицей или функцией. dump- Возвращает строку, содержащую двоичное представление функции Lua с заданным именем. Библиотека для работы с таблицами Lua Все функции для работы с таблицами собраны в таблице table. Для вызова функций используется запись вида: table.имя_функции(...) Например: table.maxn(t) В данную библиотеку включены следующие стандартные функции: Имя функции- Описание insert- Вставляет элемент в заданную позицию таблицы, сдвигая остальные элементы таблицы вправо. remove — Удаляет заданный элемент таблицы, сдвигая остальные элементы влево. Возвращает значение удалённого элемента. sort- Сортирует элементы таблицы в заданном порядке. Вторым аргументом может быть задана функция, которая будет использована вместо стандартного оператора «<» для сравнения элементов в процессе сортировки. concat- Выполняет склейку указанных элементов массива через заданный разделитель. По умолчанию разделителем является пустая строка. maxn- Возвращает наибольший положительный числовой индекс в таблице. Возвращает 0, если таблица не имеет положительных числовых индексов. Математическая библиотека Lua Функции математической библиотеки Lua Математические функции собраны в таблице math. Для вызова функций используется запись вида: math.имя_функции(...) Например: math.abs(x) В данную библиотеку включены следующие стандартные функции: Имя функции- Описание abs — Возвращает модуль числа. ceil- Возвращает наименьшее целое число, большее или равное заданному (выполняет округление «вверх»). floor- Возвращает наибольшее целое число, меньшее или равное заданному (выполняет округление «вниз»). max- Возвращает максимальный из аргументов. min- Возвращает минимальный из аргументов. fmod- Возвращает остаток от деления одного числа на другое. modf- Возвращает целую и дробную части исходного числа. frexp- Возвращает нормализованную мантиссу и показатель аргумента. ldexp- Строит число по мантиссе и показателю. pow- Возводит число в степень. Вместо вызова функции возможно использование выражения вида x^y. sqrt- Вычисляет квадратный корень числа. Вместо вызова функции возможно использование выражения вида x^0.5. exp- Возвращает ex. log- Вычисляет натуральный логарифм. log10- Вычисляет логарифм по основанию 10. cos- Вычисляет косинус угла, заданного в радианах. sin- Вычисляет синус угла, заданного в радианах. tan- Вычисляет тангенс угла, заданного в радианах. cosh- Вычисляет гиперболический косинус. sinh- Вычисляет гиперболический синус. tanh- Вычисляет гиперболический тангенс. acos- Вычисляет арккосинус (в радианах). asin- Вычисляет арксинус (в радианах). atan- Вычисляет арктангенс (в радианах). atan2- Возвращает арктангенс x/y (в радианах), но использует знаки обоих параметров для вычисления «четверти» на плоскости. Также корректно обрабатывает случай когда y равен нулю. deg- Переводит величину угла из радиан в градусы. rad- Переводит величину угла из градусов в радианы. random- Функция, вызванная без аргументов, возвращает псевдослучайное число из интервала [0, 1). Эта же функция, вызванная с аргументом n, возвращает целое псевдослучайное число из интервала [1, n]. Эта же функция, вызванная с двумя аргументами l, u возвращает целое псевдослучайное число из интервала [l, u]. randomseed Устанавливает стартовое число генератора псевдослучайных чисел. Переменные математической библиотеки Lua Таблица math предоставляет следующие переменные: Имя переменной — Описание huge- Наибольшее представимое число. pi- Число пи. Библиотека ввода/вывода в Lua Библиотека ввода-вывода предоставляет два различных «стиля» для работы с файлами. Использование неявных дескрипторов файлов Существуют операции для установки стандартных (используемых по умолчанию) файлов ввода и файлов вывода, и все операции ввода/вывода работают с этими файлами. Функции для работы с неявными дескрипторами собраныв таблице io. Для вызова функций используется запись вида: io.имя_функции(...) Например: io.close() Ниже приведён список стандартных функций ввода/вывода, предоставляемых таблицей io: Имя функции — Описание open- Открывает файл в заданном режиме. input- При вызове с указанием имени файла, открывает данный файл (в текстовом режиме), и направляет его поток на стандартный поток ввода. При вызове с дескриптором файла, делает дескриптор файла стандартным дескриптором ввода (перенаправляет поток, соответствующий дескриптору файла, на стандартный поток ввода). При вызове функции без параметров, возвращает текущий файл ввода по умолчанию. В случае ошибок, данная функция возбуждает ошибку вместо того, чтобы возвратить код ошибки. output- Аналогична io.input, но работает со стандартным файлом вывода. close- Закрывает файл. Эквивалентна file:close. Вызванная без параметра, закрывает стандартный файл вывода. read- Аналогична io.input():read. lines- Открывает файл с заданным именем в режиме чтения и возвращает функцию-итератор (iterator function), которая при каждом последующем вызове возвращает новую строчку из файла. При обнаружении функцией-итератором конца файла, она возвращает nil (для окончания цикла) и автоматически закрывает файл. Вызов io.lines без указания имени файла эквивалентен io.input():lines(); таким образом, он обрабатывает строки стандартного файла ввода. В этом случае файл по окончанию итераций не закрывается автоматически. write- Эквивалентна io.output():write. flush- Сохраняет все данные, записанные в стандартный поток вывода. Эквивалентна file:flush для стандартного потока вывода. tmpfile- Возвращает дескриптор для временного файла. Этот файл открывается в режиме изменения и автоматически удаляется при завершении программы. type- Проверяет, является ли объект, переданный функции в качестве параметра, корректным дескриптором файла. Возвращает строку «file», если объект является открытым дескриптором файла; строку «closed file» — если объект является закрытым дескриптором файла; nil — если объект не является дескриптором файла. Использование явных дескрипторов файлов При использовании явных файловых дескрипторов сначала создаётся объект-дескриптор file (для этого используется функция io.open), после чего все операции с файлом выполняются при помощи методов данного дескриптора. Для вызова методов используется запись вида: handle: имя_метода(...), где handle — имя переменной, содержащей объект-дескриптор. Ниже приведён список стандартных функций ввода/вывода, предоставляемых объектом file: Имя функции- Описание read- Читает данные из файла в соответствии с заданными форматами. lines- Возвращает функцию-итератор, которая при каждом вызове возвращает новую строку из файла. В отличие от io.lines, эта функция не закрывает файл по окончании цикла (т. е. достижении конца файла). При вызове функции без параметров, возвращает текущий файл ввода по умолчанию. В случае ошибок, данная функция возбуждает ошибку вместо того, чтобы возвратить код ошибки. write- Записывает в файл значения всех своих аргументов. flush- Сохраняет все данные, записанные в файл. setvbuf- Устанавливает режим буферизации для выходного файла. seek- Устанавливает текущую позицию в файле. close- Закрывает файл. Библиотека для доступа к средствам операционной системы в Lua Функции, обеспечивающие доступ к средствам операционной системы, собраны в таблице os. Для вызова функций используется запись вида: os.имя_функции(...) Например: os.clock() В данную библиотеку включены следующие стандартные функции: Имя функции- Описание clock- Возвращает примерное количество времени (в секундах), которое программа выполнялась на CPU. date- Возвращает строку или таблицу, содержащую дату и время, отформатированные в соответствии с заданными параметрами. При вызове функции без параметров, возвращает текущий файл ввода по умолчанию. В случае ошибок, данная функция возбуждает ошибку вместо того, чтобы возвратить код ошибки. difftime- Возвращает число секунд, прошедшее от времени t1 до времени t2. execute- Передаёт заданную команду на исполнение оболочке операционной системы. getenv- Возвращает значение заданной переменной окружения или nil, если переменная не определена. remove- Удаляет файл или папку с заданным именем. Папки должны быть пусты. rename- Переименовывает файл или папку. time- Возвращает текущее время при вызове без аргументов, или время и дату, указанные в передаваемой таблице. Эта таблица должна иметь поля year, month, и day, и может иметь поля hour, min, sec, и isdst. tmpname- Возвращает строку с именем файла, который может быть использован в качестве временного файла. Файл должен быть явно открыт до использования и явно удалён, если больше не будет нужен. автор: Андрей Аурис
  3. Сбор ополчения (Milĭtes):
  4. Собственные видео, без озвучки: Моё первое видео: Русский язык: Видео обзор мода от камрада Lord Eagle и его Канала: ----------------------------------------------------------------------- Испанский язык: Batalla Masiva en Judex Rex: -----------------------------------------------------------------------
  5. Ай, хорош оправдываться, тут все так делают! Кто Аветиса знает те за него и голосуют, а его многие и давно знают. Это нормально! Жаль тут нету нового мода от АртСтудио - пока не вышел,ну и Рекс пока в закрытом тестировании! Предлагаю открыть новое голосование в 2018 году, когда данные проекты уже будут в сети! Почему то, мне кажется что в 18-м году лидер изменится...
  6. Судья-Рекс сравнялся с победившим? Неплохо для мода который пока ещё закрыт для большинства!?
  7. Хороший мод! Я так понял нужна русская локализация? Это я могу подсобить! А кто делает, вы вроде русский знаете.. или я чего то не так понял? Отправил письмо в личку, отпишите пожалуйста!
  8. HxD - шестнадцатеричный редактор Данное руководство полезно людям занимающимся шкурками, в простонародии текстурированием.. или наоборот?! В игре есть много хороших моделей, но всегда хочется их исправить\доработать, но ещё чаще добавить свои на основе ванильных. Для этого вам будет полезен инструмент HxD. Все программы, для данной работы: 1)Hex Editor. Я использую hxd 2) Сама игра (точнее файлы моделей) 3) Pack File Manager 4) Графический редактор для редактирования текстур. Процесс: В примере, я использую roman_cavalry_helmet_1 из models3.pack 1) Открываем Pack File Manager, открываем нужный пак (models3.pack), находим нужную модель (variantmeshes\_variantmodels\man\helmets) с расширением rigid_model v2. 2) Правой кнопкой мыши нажимаем: Extract\Extract Selected.. - извлекаем модель! Так же мы извлекаем и текстурки которые лежат в той же папке, но в папке tex. Извлечённые файлы будут видимо здесь: \Steam\steamapps\common\Total War Attila\data\variantmeshes\_variantmodels\man\helmets. 3) Откройте вашу rigid model в hex-редакторе. Мы пытаемся переименовать эти текстуры на свои собственные текстуры с другим именем. То, что мы ищем – это участки, где перечисляется каждая текстура, используемая в модели. Это произойдет 3 - 4 раза для каждого уровня детализации (LOD). Однако есть одна сложность. Нам надо это сделать не удаляя или добавляя значения, а заменяя их. Можете менять имя в ручную, не удаляя, а заменяя имя ванильной, на ваше, но с таким же количеством знаков\букв! Главное чтоб размер данного файла остался неизменным, иначе ваши текстуры не будут отображаться! Ещё обязательно нужно чтоб ваши текстуры были сохранены аналогичным способом (допустим в Фотошоп, в формате DX5) что и ванильные, а текстуры имели одинаковый с ванилью вес, иначе.. аналогично - не будут отображаться! Вам нужно будет сделать это для каждого имени заменяемой текстуры. Не забудьте сделать переименования для всех текстур. Лично я делаю немного проще, чем искать каждую запись лода - я ищу поиском(кнопка ПОИСК) все записи с данным именем, нажимаю ЗАМЕНИТЬ ВСЁ и все записи заменяются автоматически! Не забывайте поставить точку в Направление - ВЕЗДЕ, как показано на скрине! 4) Сохраняем ваш новый файл rigid models, переименовываем его на любое придуманное вами имя и занимаемся редактированием текстур. 5) Теперь вам будет нужно добавить ваши новые текстуры и ваш новый rigid model в папку data\variantmeshes\_variantmodels\man\helmets, текстуры в папку tex. Добавляем ваши текстуры в ваш мод пак и всё, но есть одна особенность! Чтоб проверить всё ли сделано правильно, вам нужно убрать папку variantmeshes из data или заменить её имя! Иначе вы можете забыть положить одну текстуру в пак мода, но не увидите этого в игре, так как первоначально игра читает папки, а уж потом паки! Говоря простым языком - в папке variantmeshes будет всё как вы задумали, но геймеры не увидят ваши текстуры, так как вы забыли их положить в пак, хотя вы и проверили в игре - вы видели вани модели\текстуры и у вас было всё правильно!
  9. Набор инструментов «Assembly Kit» Assembly Kit содержит в себе программы: TWeak с тремя утилитами: TERRY - редактор тактической карты - (вначале Terry работал, но спустя некоторое время он перестаёт работать, и постоянно вылетает. По крайней мере в Рим2 и Аттиле он уже не работает!) DaVE – редактор баз данных Variant Editor – для редактирования внешнего вида юнитов и кораблей BOB – для обработки (извлечения и редактирования) таких данных как: Текстуры Модели Анимация Таблицы данных (DB таблицы) Формаций Стартовых установок компаний Упаковка файлов и паков файлов в мод-паки Экспортеры: Модели в 3ds max Анимация в Motion Builder и Maya Data файлы: Примеры файлов для каждого типа данных И полный рабочий комплект баз данных с доступом Версия программы: Beta Автор: The Creative Assembly ------------------------------------------------------- Это базовое руководство по основам. Установка: Перейдите в вашу «Библиотеку» Steam, в выпадающем меню выберите «Tools/Инструменты». Прокрутите вниз к «Total War: Rome II - Assembly Kit» - или любоя другая игра СА, правой кнопкой мыши нажимаем установка. Инструменты будут находиться ~ C:\Program Files (x86)\Steam\SteamApps\common\Total War Rome II\assembly_kit Вы будете работать, главным образом, с двумя приложениями: TWeak и BOB, остальные пользуются гораздо меньшей популярностью BOB. -(BOB – означает «Build On One Button/Сборка Одной Кнопкой» Исполняемые файлы находятся в папке: «Total War Rome II\assembly_kit\binaries» и называются: TWeak.AssemblyKit - для редактирования, например, редактирования статов юнитов(отрядов, подразделений). BOB.AssemblyKit - для создания .pack-файлов вашего мода. Рабочий процесс: Последовательность выполняемых действий может показаться сложной по началу, но потом вы к ним привыкните. Существует большая разница между простым и удобным PFM и данным набором, не зря вечно носящим имя BETA! Советую использовать данный набор крайне редко, если только замены ему нет! Тех кто уже лысый это не касается, вам выдирать больше нечего, поэтому можно смело править всё в AK направо и налево А если серьёзно, то повторю ещё раз! Если вам нужно править таблицы, то советую пользоваться только PFM для этого! С PFM вы отбираете, какие файлы входят в ваш pack-файл, редактируете их, сохраняете pack-файл. С инструментами «Assembly Kit» вы редактируете файлы, которые вам нужны в программе TWeak, затем в программе BOB вы отбираете файлы для включения в ваш pack-файл и если вы не допустили ОШИБКУ или в вашем моде не валяется хоть один рабочий файл с именем на русском или просто файлы которые ВОВ не определит для себя - как файлы игры, то возможно он и испечёт для вас ваш pack-файл или startpos! ИСПЕЧЬ - Я пользуюсь именно данным словом для определения процесса -который делает ВОВ при создании файлов игры. Использование DAVE: DAVE – это «DAtabase Visual Editor/Визуальный редактор баз данных». Запустив TWeak.AssemblyKit.exe, вы увидите серый экрана, с меню верху. Используем выпадающее меню «Tools/Инструменты»: нажмите DAVE. Советую редактировать только файлы начинающиеся с имени: start_pos, всё остальное есть в PFM - не тратьте себе нервы редактированием других файлов в этой программе! start_pos - файлы отвечающие за стартовые позиции армий, персонажей, городов и так далее. Совет №1: Перед началом работы в АК, отключите его обновление, иначе всё что вы измените - может быть заменено новым обновлением данной программы и все ваши труды будут напрасны! Совет №2: Перед началом работы сохраните у себя чистую папку db, путь: Steam\steamapps\common\Total War Rome II\assembly_kit\raw_data. Совет №3: После редактирования файлов старпоза - сохраните у себя исправленную папку db, и далее делайте это с постоянной регулярностью! Я общаюсь с многими мододелами с TWC и устал им объяснять что ошибку сделать легко, а вот исправить её бывает невозможно и ваш мод может стать одним из тех, кто обломался поиском мелкой ошибки и канул в небытие! С помощью сохранения данной папки, вы защитите себя от этого, сможете вернуться к рабочей версии просто заменив эти файлы! Меню: «Connection/Соединение» позволяет нам подключаться/отключиться к(от) баз данных. «View/Вид», где мы имеем доступ к разным компонентам редактора DAVE, позволяющего нам соверщать различные типы редактирования. «Export/Экспорт» позволяет нам экспортировать элемент базы данных из первичных данных в наши действующие данные. «Extra Tasks/Дополнительные задачи» и «Options/Опции», в большой степени не нужные на этой стадии для нас, не обращайте внимания на них. «View/Вид»→«Table Launcher/Лунчер таблиц»: откроет окно, которое позволит вам выбрать таблицу базы данных для редактирования. «View/Вид»→«Query Launcher»: это снова откроет окно, что позволит вам выбрать таблицу базы данных для редактирования, но ваши опции здесь базируются на данных, которые будут сохранены в файле формата «.esf». «View/Вид»→«Form Launche»: это позволяет вам иметь доступ к большинству вложенных инструментов внутри редактора DAVE, которые при помощи «GUI/графического интерфейса пользователя» легко редактировать таблицы базы данных, как например, редактор построек. В примере мы создаём новые стартовые позиции поселений, персонажей, армий и тд. А) Основной способ редактирования - используем Table Launcher (Лаунчер таблиц): Данный способ простой, но зато самый безопасный! Каждая строка изменённая вами будет гореть жёлтым либо зелёным цветом и вы всегда будете видеть где вы вносили изменения, а где остались ванильные значения. 1. В TWeak откройте View\Table Launcher, найдите таблицу базы данных, которая содержит таблицы старпоза. Дважды щелкните по таблице, чтобы открыть ее. 2. Редактируйте нужные значения! 3. Теперь, в верхней части приложения нажмите кнопку «Apply/Применить». Вы заметите, в самом низу программы полосы состояния(статуса), записи нашего изменения: «17:15:18> Значение для записи «КАКОЕ ТО ЗНАЧЕНИЕ» ({8da7b901-cb9a-4038-a287-3905a99f99b2}) в таблице «КАКОЙ ТО ТАБЛИЦЕ» было изменено с «допустим 01» на «допустим 02». Б) Второстепенный способ редактирования - используем Form Launcher (Лаунчер в виде формы): Данный способ более быстрый и удобный, но считается опасным, так как сделать здесь ошибку легко, а вот найти её будет очень проблематично! Удобство данного способа - заключается в том, что здесь вы сразу в Форме окна видите самые важные параметры стартовых позиций, но изменив один из параметров, подсвечивать здесь ничего уже не будет и если вы случайно тыкнули не туда, у вас может появиться новый персонаж, армия, город, трейнт и мн. др. - который может не иметь связей с основными таблицами, что в свою очередь приведёт к ошибке! Допустив такую ошибку, вам останется только вспоминать, куда вы могли тыкнуть, а не вспомнив, можете начинать всё с начала! 1. В TWeak откройте View\Form Launcher, найдите таблицу starting_position. Дважды щелкните по ней. Перед вами появится большое окно с кучей параметров. Все параметры интуитивно понятны и не требуют пояснений. 2. Редактируйте нужные значения! Нажимать «Apply/Применить» теперь нигде не нужно! Изменения происходят сразу как только вы изменили какой то параметр. Вы заметите, в самом низу программы полосы состояния(статуса), записи нашего изменения: «17:15:18> Значение для записи «КАКОЕ ТО ЗНАЧЕНИЕ» ({8da7b901-cb9a-4038-a287-3905a99f99b2}) в таблице «КАКОЙ ТО ТАБЛИЦЕ» было изменено с «допустим 01» на «допустим 02». Экспорт изменённых таблиц: 1. Выберите в верхней части из выпадающего меню пункт «Export/Экспорт», затем выберите «Export Single Table(s)/Экспорт выбранной таблицы». Вы теперь получите новую форму. Это форма, где мы будем выбирать, какие таблицы мы используем. 2. Вы заметите окно списка изменённых вами таблиц, в левой части экрана. Двойным кликом нажмите на каждую! Они должны появиться в правой части экрана - Tables for export! Проверьте совпадают ли они?! Возможно вы не слишком быстро нажали на мыш и изменения в одной из таблиц не произойдут! Затем нажать «Export/Экспорт» в правой нижней части программы для экспорта наших таблиц. Работа в программе TWeak закончена. 3. Теперь открываем программу BOB.AssemblyKit.exe, она экспортирует наши таблицы из наших исходных данных xml-файлов, и помещает ее в наш рабочий комплект данных. Она сейчас, также, в бинарной форме(двоичном виде), готова к использованию в pack-файле. Мы видим окно с тремя колонками. Одна показывает наши исходные данные, другая показывает рабочие данные и еще одна показывает – .packs-файлы. Программа BOB является инструментом, который использует наши исходные данные и превращает их в рабочие данные (двоичные файлы), которые вы сможете вложить в packs-файлы вашего мода. В колонке Working data выбираем Campaigns - main_rome - ставим галку у startpos Затем ставим галку Campaign/Process start pos (main rome). Если бы мы делали только изменения стартпоза - на этом надо было бы остановится и стартовать, но у нас изменен файл Start_pos_past_events - поэтому мы ставим галку и у Pack/Create pack file (mod.pack) Вот теперь - старт! BOB начинает работу. Теперь СРОЧНО нажимаем на программу STEAM, чтоб она была открыта... через какое то время.. как правило несколько секунд.. появляется небольшое окно к котором находится две кнопки, разрешаю или нет! Жмём разрешаю! В процессе запускается меню начала вашей игры, но сама игра не запускается, а долгое время как бы висит! Идет проверка на пригодность созданного вами пака и само запекание вашего пака или файла startpos.esf - вам остаётся уповать на то что вы ше совершили ошибку и запекание пройдёт успешно! Успешный итог запекание это когда в ВОВе будет весь список зелёным цветом, не успешный - последняя стока списка - красным цветом! Использование Variant Editor: Variant Editor – это Визуальный редактор юнитов. Запустив TWeak.AssemblyKit.exe, вы увидите серый экрана, с меню верху. Используем выпадающее меню «Tools/Инструменты»: нажмите Variant Editor. Кнопки главного меню: File: New Definition - Новая Дефиниция Load Definition - Загрузить Дефиницию Save Definition - Сохранить Дефиницию ------------------------------------------------------ Load Uniform - Загрузить униформу Другие кнопки абсолютно бесполезны! Для начала нам нужно взять что-то за основу, то бишь берём ванильные файлы variantmeshdefinitio (файл сборки юнита) из игры, для этого: Нажимаем File\Load Uniform - Загрузить Униформу из базы данных игры. Перед вами появится новое узкое окно в котором вы сможете выбрать любой файл сборки юнита. Всё, перед вами ванильный юнит - берём и правим его! Для этого нажимаем.. допустим на helmets в левой части экрана сборки юнита. Потом выбираем в правой части экрана, самая правая верхняя кнопка, тоже helmets. Далее выбираем.. допустим такой симпотичный гребень - двойным кликом мыши! Теперь он у нас в левой части экрана, чуть ниже ванильных шлемов. Сохраняем под своим именем(только англ. текст) и далее используем уже его. Всё, данным инструментом вы уже научились пользоваться!
  10. Версия 0.5.1 - ФИНАЛ Доработка, Настройка Исправлена критическая ошибка, иногда приводящая к вылету: при загрузке сохранённой игры и в конце битвы Исправлена лояльность Феодосия, не дающая ему стать мятежником Исправлены стартовые позиции всех Гуннов: их частое передвижение на юг, в сторону Сасанидов Исправлены ошибки русской локализации Исправлен ход событий: Рождения Аттилы, Становления лидером(leads horde) и тд. Исправлена лояльность армий ИИ Исправлена ошибка нехватки пищи для Гуннов Мораль всех новых юнитов увеличена в соответствии с юнитами других фракций Обновлено несколько юнитов до версии 2.0: Legionis Arabum (limitan) Legionis Palaestinorum (limitan) Legionis Aegyptiorum (limitan) Equites Saraceni Разработка кампании закончена! Теперь можно смело начинать новую кампанию, следующее обновление будет очень не скоро! В этом году обновлений точно не будет! Работы приостановлены на неопределённый срок!
  11. Релиз: Глава 5 ______Judex - Rex______ Глава V - Великий Исход Версия - 0.5 Большой пакет скриптов: 1.Спавн армий трёх фракций Гуннов ИИ 2.Бессмертие некоторых важных персонажей 3.Объявление мира, войны, вассалитета 4.Договор о Федератах 5.Восстание повстанцев(Римский повстанец, Грейтунги) 6.Дармовые юниты для 13 фракций Исхода(переселенцев) ИИ 7.Возрождение и Спавн 17 фракций Исхода - юниты исхода 8.Дармовые юниты для всех фракций ИИ Много других доработок: Добавлены боевые формации всем юнитам полководцев, для всех фракций Существенно увеличен лимит рекрутинга юнитов Координально усилены фракции под управлением ИИ Увеличен шанс детей достигнуть взрослого возраста Исправлена ошибка в генеалогическом древе Вестготов Исправлена ошибка расстановки армий варваров на карте кампании Добавлен исторический персонаж для: Правителя Лахмидов: Imru' al-Qays II ibn 'Amr и многое другое...
  12. В данной теме размещаются инструкции по пользованию программами для модинга. Ссылки на скачивание ищем в соседней теме! PackFileManager Самая популярная программа у модмейкеров это Pack File Manager, более 95% мододелов работают в ней. Эта программа позволяет редактировать файлы с расширением .pack. В этих файлах прописаны очень многие значения. Автор: daniu Установка: Распаковать архив, поместить папку с программой в любое удобное место на вашем компьютере, произвести для удобства ассоциацию файлов pack с программой, запускать программу через PackFileManager.exe. Если путь к вашей игре изменён от дефолтного C:\Program Files (x86)\Steam\steamapps\common\Total War Rome II, то вам необходимо внести корректировки в файл gamedirs.txt в паке программы. Под спойлером: ИЗОБРАЖЕНИЕ Меню File: New – Создать новый пак Open – Открыть пак My Mods Меню кастомных паков(модов) None – не используется Перечень модов если есть загруженные New –создать новый пак с названием My Mods Delete My Mods – Удалить кастомный пак Install My Mods – установить мод установит в паку текущий пак Uninstall My Mods – удалит установленный пак Open Data Path откроет папку с вашими модами Open CA pack выпадающих список всех дефолтных файлов юpack Save Сохранить Save As Сохранить как… Change Pack Type Выбрать тип пака, пока это довольно относительно в плане установить точно то что нужно, некоторые виды могут не работать и наоборот работать с паки не относящимися к этому виду: Boot,BootX,Release,Patch,Mod,Movie,Shader,Shader2. Export File List – Экспортировать список файлов. Чрезвычайно нужная операция, позволяет создать список файлов.txt всего пака, что способствую быстрому поиску внутри пака, так как функция «поиск» в программе работает только внутри открытых файлов а не в проводнике. Небольшой совет как с помощью этой функции оптимизировать свою работу в моддинге игры: Создайте нужный список с помощью этой команды, у вас появится файл txt с названием: «название пака.pack-file-list», далее вам нужно как то упорядочить записи в нём Все записи имеет вид адреса проводника с названием файла в конце. Я упорядочил следующим образом: У меня есть папка с названием игры в которой есть папки с названиями паков, в каждой папке есть файлы с названиями подпапок внутри паков. Примерно вот так: Рим2\Пак дата рим2\база данных файлы\сами файлы. Далее что бы не искать среди лишнего я удалил(вырезал в отдельные файлы) все файлы текстур и моделей(их большинство так же удали и кое какие другие редко используемые), сделать это довольно просто: при помощи инструментов Notepad++ конкретно закладок, т.е я выделил все строки с записью dds, png и при помощи команды вырезать все строки с закладкой вырезал их в отдельный документ. А быстро сортировать файлы по другим файлам можно просто заменяя первые адреса с помощью команды заменить, заменяя первые значения в строках на пустое место. Что же теперь с этим всем делать, а всё довольно просто в Notepad++ есть команда поиск по файлам в меню поиск, указываем там директорию папку в настройках программы ставим показывать полный путь к файлу и спокойненько можем искать в нашем упорядоченном списке видя весь путь. Если мне необходимо добраться до текстур то я ищу в папке с ними, позже я так же просто смогу находить всю анимацию или модели. Плюс все файлы вы можете упорядочить с помощью плагина TextFXп в алфавитном порядке, что намного облегчает поиск когда ищешь что то не совсем конкретное. В дополнение у меня вторая половина этих документов переведена банально Гугле транслейтом, что при моем знание английского, помогает мне намного быстрее понимать за что отвечает файл. Вставить вторую часть текста на лист можно с помощью инструментов работы со столбцами. Вот так потратив всего полчаса времени вы сэкономите много времени и нервов в дальнейшей работе Exit – Выход из программы Files – Меню файл работа с файлами: Add – Меню добавления фалов в пак Empty Directory – Добавить пустую директорию, как поддиректорию текущей(выделенной) Directory – добавляет полную директорию, стоит учесть что при добавлении добавляется вся структура папок с их названиями File(s)- Добавить файлы в пак, добавляются в выделенную директорию DB file from TSV – Добавляет DB файлы из файлов TSV. У меня не работает Delete – Удалить выбранное Replace File – Перезаписать файл, на указанный Rename Переименовать Open – Открыть файл Open External – Открыть с помощью программы по умолчанию для типа файла(двойной клик по фпайлу). Почему то работа при открытии программы только один раз. Open DecodeTool – Открыть при помощи встроенного Hex идитора Open as Text – Открыть в окне редактирования как текстовый файл Extract – Извлечь из текущего пака Extract Selected – Извлечь выделенное(учтите, создается папка с полной структурой до файла в директории где находится текущий пак) Extract All – Извлечь весь пак (создастся полная структура папок пака) Extract Unknown – Извлечь как неизвестный формат. Без расширения файла Extract All as TSV – Извлечь всё как файлы TSV Create ReadMe – Создать xml файл с описанием пака(или уточнениями по нему) Search Files – Поиск по файлу, не по директориям, только по окну редактирования Postprocess: Rename – Изменить название (добавляет префикс к началу файла) Rename Selected - Изменить название выделенного, всплывает окно в которое вы можете вписать префикс Rename All - Изменить название у всех файлов, всплывает окно в которое вы можете вписать префикс Minimize DB Files - Архиважная команда. Позволяет удалить двойные строки из DB файлов, возникают при импорте файлов, помечает ркасным всё что вы не правили, остальное удаляете из своего пака Game: Текущие игры – Так как инструмент работает с несколькими играми серии тут будет список поддерживаемых и установленных, я писал выше где это прописывается Load all Game Packs – Загрузит все паки из папки datа. У меня не грузит)) Open Game Directory – Открыть директорию игры Open Data Directory – Открыть папку Data Open Encyclopedia Directory – Открыть директорию энциклопедии Open User Directory - Открыть пользовательскую директорию ~ C:\Users\HunterWolf\AppData\Roaming\The Creative Assembly\Rome2 Open Scripts Directory - Открыть пользовательскую директорию папку scripts ~C:\Users\HunterWolf\AppData\Roaming\The Creative Assembly\Rome2\scripts Open Replays Directory Открыть пользовательскую директорию папку ~C:\Users\HunterWolf\AppData\Roaming\The Creative Assembly\Rome2\replays. Options: CA Packs Are Read Only – Настройка защищающая исходные файлы от перезаписи, что бы вносить изменения и сохранять файлы исходников игры галку надо убрать, во всплывающем окне нажать «I'm not afraid, coward! – Я не трус, я не боюсь, что я напортачу» Всё это окошко наполнено, ну прям искромётнейшим юмором, с точки зрения автора Update on Startup – Обновляет файлы при старте программы. Я без понятия какие Show Decode Tool on Error – Показывать ошибки при работе с инструментов декодирования (встроенном Hex идиторе) Extract TSV File Extension csv или tsv – Выбрать тип файлов при экспорте из DB DB Descriptions – Меню связанное с особенностями DB файлов. О фалах schema в смотрите в описании программы: Search for Update – Искать обновление для файлов Load from File - Загрузить обновления из schema.xsd файла Save to Directory – Сохранить файл schema, сохранится пользовательский schema_R2TW_user.xml в папке программы Update DB Files – Обновит DB файлы Update Current – Обновит текущий Update All – Обновит всё файлы связанные с DB Более подробно о нескольких встроенных утилитах программы: Редактор для работы с файлами TSV. Довольно сносный инструмент, если бы не отсутствие каких либо расширенных наборов инструментов для работы с самим текстом. Но зато присутствуют чек боксы для выбора хейдеров(Довольно утрировано: так называют некие значения которые заложены уже в код и используются как некие константы). Более подробно, если интересно, расскажет википедия о header. Верхнее меню при работе с инструментом TSV Add Row – Добавить строку Clone Row(s)- Клонировать строку Copy – Копировать Paste - Вставить Export TSV – Экспорт TSV Import TSV – Импорт TSV Use First Column As Row Header – Использовать первую колонку как первую строку для хейдеров, там где это необходима. На деле наоборот, когда галка стоит не использует, когда снята использует Use Combo Box Cells –Использовать комбобоксы( выпадающие меню с хейдерами)в каждом окошке таблицы Shоw all columns – Показывать все колонки Инструмент для работы с файлами .esf, более подробно можно прочитать в описании инструмента EditSF, тут его интегрированная версия.
  13. Набор инструментов «Assembly Kit» Assembly Kitr – Является по официальным набором инструментов и примеров от студии The Creative Assembly. На данный момент Assembly Kit содержит: TWeak с двумя утилитами: DaVE – редактор баз данных Variant Editor – для редактирования внешнего вида юнитов и кораблей BOB – для обработки (извлечения и редактирования) таких данных как: Текстуры Модели Анимация Таблицы данных (DB таблицы) Формаций Стартовых установок компаний Упаковка файлов и паков файлов в мод-паки Экспортеры: Модели в 3ds max Анимация в Motion Builder и Maya Data файлы: Примеры файлов для каждого типа данных И полный рабочий комплект баз данных с доступом Скачать можно только на Стиме, во вкладке БИБЛИОТЕКА\Инструменты, для каждой игры свой! -------------------------------------------------------------------------------------------------------------------------------------------- HxD Hex Editor HxD Hex Editor – это удобный шестнадцатеричный редактор, обладающий хорошим набором функций, и, ко всему прочему, являющийся бесплатным. Программа без каких-либо затруднений позволяет работать с файлами любого размера при наличии модификаций оперативной памяти. То есть, возможно редактирование не только тех файлов, которые находятся на жестком диске, но непосредственно из "оперативки". Так же присутствует множество других функций, вроде разделения и объединения файлов, создание статистики и закладок, безвозвратное безопасное удаление, заливка по выбранному шаблону, вставка байтов и так далее. Редактор HxD очень хорошо продуман и интуитивно понятен даже не опытным пользователям, поэтому не требует отдельного руководства. Программа русскоязычная, но возможен выбор других языков. Скачать: HxD Hex Editor
  14. Я не играю в данные игры, к сожалению. Я просто хочу подсказку дать другим!
  15. А я дам небольшую подсказку на второй вопрос! О нём написана целая биография, его современником, дошедшая до наших дней!
×

Важная информация

Политика конфиденциальности Политика конфиденциальности.