Tabletop Simulator

Tabletop Simulator

Not enough ratings
Урок 6. Сохранение и загрузка
By star
Для профессионалов.
Осваиваем сохранение и загрузку для скриптов в своих модах.
   
Award
Favorite
Favorited
Unfavorite
Введение
Сохранение и загрузка мода в игре хорошо описаны в документации[api.tabletopsimulator.com].

Однако проблемы возникают у нас, русских, при сохранении кириллицы. Здесь пойдёт речь о том, как решить эти проблемы.
Решение 1
Удобство
Низкое
Требования
Строки должны быть только русские (английские использовать нельзя)
Надежность
Максимальная (если требования выполнены)
Скорость
Высокая

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

Как пользоваться

https://pastebin.com/XdPdexyB

Для использования необходимо русские строки перед сохранением пропускать через специальную функцию RusEncode(), а при загрузке - через функцию RusDecode().

Вставтье этот код в начало скрипта (для каждого объекта, который участвует в сохранении и которому нужна поддержка русского языка):



Далее сформируйте фукнции onSave и onLoad в соответствии с логикой игры:

Решение 2
Удобство
Низкое
Требования
Строки должны быть только русские и английские, но не капсом и не смешанные (то есть либо русские, либо английские)
Надежность
Высокая (если требования выполнены)
Скорость
Средняя

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

Как пользоваться

https://pastebin.com/PAXCYEPs

Способ аналогичен предыдущему, только в начало скрипта нужно вставить чуть более умный скрипт:

Решение 3
Удобство
Высокое
Требования
Строки могут содержать только русские и ascii символы. Версия игры - v12.3.5
Надежность
Максимальная (если требования выполнены)
Скорость
Низкая

Решение может внезапнео сломаться, если разработчики исправят баги функции JSON.encode(), хотя вряд ли это случится скоро. Также может сломаться, если в сохранении будут символы, которые TTS не понимает (например, из других языков, кроме русского и английского). В остальном это универсальное и удобное решение, но сравнительно медленное.

Как пользоваться

https://pastebin.com/9XDqRk7w

Просто скопируйте этот код в начало скрипта и больше не вспоминайте. Он является фиксом API, поэтому в пределах данного скрипта проблем с сохранением русских строк быть не должно вообще.

Заключение
Ни один из способов не является лучшим. Берите и используйте то, что подходит именно вашему моду.

P.S. Если вы не сохраняете кириллицу, то, очевидно, все эти костыли вообще не нужны. То есть сам мод может быть русифицирован, но в сохранение идут только всякие цифры и идентификаторы - тогда незачем городить лишний код.
5 Comments
NorthernExile 18 Apr, 2023 @ 11:42pm 
Чёрта с два, спасибо огромное. Реально рабочий вариант, даже на текущей версии. По-крайней мере у меня последний вариант заработал на версии 13.2.2. А то задолбался копать информацию на то, есть ли какой-то вариант по-шаманить с самим API
star  [author] 4 Mar, 2023 @ 2:08pm 
@MoarDm,
Вставлять нужно в те скрипты, в которых происходит сохранение кириллицы. А происходить оно может как в global script, так и в любом другом.

Просто учитывай, что у каждого скрипта своё глобальное пространство. То есть скрипты по сути не связаны между собой. Вывод очевиден.
MoarDm 4 Mar, 2023 @ 1:01pm 
Подскажи пожалуйста, это решение до сих пор актуально? У меня ни один вариант не сработал, к сожалению. Пытаюсь разобраться.
Я правильно понял что эти скрипты необходимо вставлять в global script? И действие будет распространяться на все компоненты? Или это только на те которые задействуют в своих скриптах JSON.encode?

Вообще удивительно что это единственное решение которое можно нагуглить
star  [author] 28 May, 2020 @ 7:46am 
Можно, конечно. По идее замедлит процесс загрузки. Понадобится использовать регулярки, которые сами по себе - тяжелая артиллерия. Конечно, от объёма сохраняемых данных тоже зависит. Заметнее всего будет, когда админ несколько раз подряд будет откатывать игру (Ctrl+Z). Но если вдруг переделаете - с удовольствием добавлю ещё одно решение.
Fennex 28 May, 2020 @ 4:35am 
Спасибо за руководство! Очень хорошо, развернуто, а главное - понятно написано!
А вот чисто теоретический вопрос возник - можно ли кодировать не в отдельные символы, а в их сочетания? Чтобы "Б" превращалась не в "b" , а, допустим, в "~b@" ?
Или это слишком усложнит процесс поиска элементов для обратного перекодирования?