Трюки
В этой теме рассмотрены различные вспомогательные механизмы для работы с кодом.
Упрощения в условиях
Код скриптов можно упрощать, используя сам язык C#. Например, если при выполнении условия надо совершить только одну команду, которая соответствует делегату System.Action, мы можем написать только ссылку на метод. До:
После:
Это тоже касается для блока else:
Особенно это полезно при вызове методов @break
и @continue
.
Модели поездов
Каждый тип поезда требует загрузки определённых моделей. Чтобы их не искать, в класс Train встроен статический метод GetModelsByType
, который возвращает массив с моделями для конкретного типа поезда:
Результат:
Небезопасный код
Вы можете добавить любой код в скрипт. Для этого есть метод unsafe_code
. Как и метод hex, он не проверяет содержимое и печатает указанную строку в том виде, в котором её изначально указали. Этот подход позволяет добавлять код, который не имеется в арсенале генератора. Пример использования:
Этот метод отлично справляется с кодом, в котором не используются глобальные переменные или массивы, нет работы с миссиями, потоками и внешними скриптами. Если переданный скрипт содержит одну их вышеупомянутых сущностей, то придётся делать делать замены в строке, чтобы SB не перезаписал значения переменных, используемых в генераторе. Собственно последнее как раз заставило меня назвать метод unsafe (небезопасный).
Обработка глобальных переменных
Если добавленный код содержит глобальную переменную, то вот рекомендации как избежать возможных плохих последствий:
Найдите все глобальные переменные, которые есть в скрипте.
Отсортируйте их по длине имени. Некоторые имена могут частично совпадать с другими переменными.
Декларируйте эти глобальные переменные в классе скрипта.
Сделайте замену всех переменных с исходного варианта на новые переменные с класса.
Предположим, что у нас есть такой код:
Переменные $1500
, $1501
, и $1502
могут вызвать сбой. Тогда пользуясь инструкцией выше, сделаем замены строки на новые декларированные переменные. Пример:
Делать замену можно в любом текстовом редакторе и любым способом. Название $VARNAME
заменяем на " + VARNAME + @"
, где VARNAME — имя декларированной переменной в классе. Процедуру повторяем, пока в коде не будет глобальных переменных.
Индексы $ON_MISSION, $PLAYER_ACTOR, $PLAYER_GROUP и $PLAYER_CHAR полностью совпадают с индексами в генераторе, который эти переменные декларирует самостоятельно. Поэтому нет необходимости в их замене. Если это всё таки нужно сделать, то достаточно использовать декларированные имена OnMission, PlayerActor, PlayerGroup и PlayerChar соответственно, а не создавать новые переменные.
Обработка массивов
Если в коде встречается массив, то тактика коррекции кода немного отличается. Мы по-прежнему должны декларировать массив, указав его конкретный размер; но для корректной замены нужно декларировать ещё одну переменную, которая будет иметь индекс первого элемента массива. Получить индекс мы можем используя метод Int.IndexOf( _1600 )
, где _1600 — декларируемый массив или другая переменная с контекстом. Для примера возьмем следующий код:
Алгоритм действий таков:
Ищем размер массива в коде и его тип. В нашем случае размер равен 3-м, а тип — Int;
Декларируем глобальный массив в классе MAIN;
Декларируем новую переменную внутри метода START, используя методы
global
иIndexOf
. Это нужно для того, чтобы генератор успел инициализировать массив перед тем как получать индекс.Делаем замену имени массива в исходном варианте на декларированную переменную (не массив).
Как всё получится в итоге:
Процедуру повторяем, пока в коде не будет глобальных массивов.
Статический метод IndexOf доступен не только в классе "Int", но и в большинстве других. Проще будет привыкнуть именно к "Int", так как метод возвращает целое число.
Обработка потоков, миссий и внешних скриптов
Если внутри текста будет вызов потока, то надо убедиться, что в проекте нет класса с таким именем. Тогда можно обойтись без замен. Если поток в коде будет вызываться в нескольких скриптах, то лучше этот поток реализовать в коде, чтобы генератор о нём знал и не создавал дубликатов. Для этого мы должны изолировать вызов потока от остального текста:
Аналогично всё делается с миссиями и внешними скриптами. При этом стоит учитывать, что надо делать замену для всех методов, которые связаны с этими сущностями.
Last updated