Сам TLD написан на основе UNITY, под не слишком дорогой лицухой. Поэтому в tld.exe от игры если только название и возможность менять стартовые заставки - т.е. это переименованный UNITY лаунчер, сама игра в tld_Data\Managed\Assembly-CSharp.dll - штатно для UNITY.
Язык скриптования для UNITY - c#. Версию .net можно выцедить через первую строчку файла лога tld_Data\output_log.txt
Initialize engine version: 5.4.0p3 (dac96b578024)
Т.е. 5.4 F3 идем на сайт юнити и получаем что что это .net 4.0
Берем мелкосовтовской визуал-студио (родной для UNITY MONO заточен под юникс, а версия под винды убога и глючна, главное для с# в том что сам компилятор, какую бы среду не использовали, лежит не в среде разработки а в .net той версии что выставите - и до барабана до среды или вообще просто текстового редактора компилятор используется один и тот же).
Некоторую особенность составляет отладка аддонов к играм на UNITY в мс студио. Нужны три спец приблуды - отладчик под студио для юнити, конвертор отладочной информации из студио формата в моно и отладочный лаунчер юнити.
Первый есть на сайте мелкосовта - исправно обновляется и под новые версии студио и тщательно под изменения в inity/mono. Конкурентная борьба против моно, в свое время была куплена контора-разработчик этого отладчика и отдадчик сделан бесплатным. Работает и на бесплатной студио. Два последних в сдк юнити - в любой версии лицензии (бесплатной).Но это потребуется для написания "модов". Сейчас просто читаем сейв.
В простейшем виде создаем консольное c# приложение и референсом указываем Assembly-CSharp.dll. Смотрим что там в пабликах - а в пабликах там целый состав + вагон + тележка... Только вариантов json несколько.
Открываем в текстовом редактором файлик из сейва - похоже на json. Пошинкован только он чем то. Нужно восстановить.Ну дык в объект-броузере ищем в игровой dll compress или crypt - есть такое в одном классе
public class EncryptString
Эксперементируем - искомая функция
DecompressBytesToString
получаем строку json - идеальну, но с кучей палок - это означает что json комплексный - т.е. в одном json-е лежит другой и т.д. чем больше палок тем глубже вложенность.
Ну дык прям в игре лежит тулз для "потрошения". Newton.Json
Почитав доки и поэкспериментировав можно найти простой способ - см ParseData на картинке - построчный парсинг. (в качестве примера выбран не корневой - он прост - только набор суб-джсонов)
http://koavia.com/n1/TLD/save/vs1.jpg
Парсинг дает нечто в виде
http://koavia.com/n1/TLD/save/vs6.jpg
Т.е. класс должен содержать проперти m_SerializedItems - массив объектов с определением в виде класса с пропертями
String m_PrefabName
String m_SearializedGear
m_SearializedGear - следующий джсон
и т.д. во внутрь - получаем структуру классов в виде
http://koavia.com/n1/TLD/save/vs2.jpg
Если для чтения использовать тот же Newton то он значительно отличается от системного - он читает в целевой класс только проперти, причем читать можно не всё а вот "левые" проперти, коих имен нет в json вызывают исключение. Простые переменные игнорируются. Пытка прочитать все сразу на 99% обречена на неудачу. Поэтому у меня цепочечное чтение. Корень читается отдельно (vs1.jpg)
Код: |
JsonTextReader reader = new JsonTextReader(new StringReader(decData));
SaveRegion SR = (new JsonSerializer()).Deserialize<SaveRegion>(reader); |
остальное цепочечно по вызову
Восходящие звенья цепки в субклассах - одноменные ParseElements()
(vs2.jpg)
Глобальный подводный камень - библиотека игры не имеет своего отдельного пространства имен. И часть системных вызовов (например new для системных типов) без подключения пространства имен и модуля UnityEngine скомпилировать не удастся.
Ну, дальше полученные данные можно анализировать как угодно.
Я визуализировал в MS Visio (платное приложение, продаваемое отдельно или в составе "старших" (более дорогих) версий состава продуктов оффиса). Что-то среднее между компасом и фотошопом. В конце 90-х было куплено вместе с конторой что его разработало, в отличие от нокиа живет вот уже почти 20 лет, хотя и потеряло очень многое, а приобрело не ахти, впрочем как и остальные приложения офиса - все новое практически одна не продуманная попса). Как и все офисные приложения мелкософта он поддерживает внешнее com управление. Инициализируется как обычно -
подключением библиотеки с именем "Microsoft Visio 12.0 Type Library" - программно это пространство имен Microsoft.Office.Interop.Visio.
Для исключения перекрытия имен и сокращения писанины рекомендуют использовать алиас
using Visio = Microsoft.Office.Interop.Visio;
Окрытие приложения
Visio.Application App = new Visio.Application();
Далее согласно специфике приложения.
Открываем документ, предварительно масштабированный и "пакладенной" на него картой. Открываем файл предварительно сформированный файл шаблонов.
Код: |
Visio.Document Doc = App.Documents.Add(CurDir+"\\VisioData\\testmaptamlate.vsd");
Visio.Page Page = Doc.Pages.get_ItemU(1);
Visio.Document Stencil = App.Documents.Add(CurDir + "\\VisioData\\TLD_map.vss"); |
Ну а дальше по прочитанным из савки данным начинаем кидать из шаблонов на страницу префабы иконок, текста описания, соединителя, вписывать описание и соединять его с иконкой. Запихивать получившееся на соответствующий уровень.
http://koavia.com/n1/TLD/save/vs3.jpg
Вообще по VISIO, по его программированию - хелпа и инфы по нему кот наплакал, обычно на уровне как начать и преимущественно на бейсике, но тот сам по себе работает раза в 3-5 медленнее. Здесь как начать на с# получилось. В остальном - для получения кода-аналога действия в среде visio принцип следующий - запускаем запись макроса - совершаем действие. Анализируем код получившегося макроса (не забываем о пространствах имен (для макроса пространство абсолютно плоское) - используем объект броузер в среде бейсика visio), для с# имена функций могут отличаться суффиксами/префиксами, контроль типов жёстче.
на с#
Код: |
shape.get_CellsSRC( (short)Visio.VisSectionIndices.visSectionObject, (short)Visio.VisRowIndices.visRowXFormOut,
(short)Visio.VisCellIndices.visXFormLocPinY).FormulaU = "16.88 m"; |
в макросе бейсика visio
Код: |
shape.CellsSRC( visSectionObject,visRowXFormOut, visXFormLocPinY).FormulaU = "16.88 m"; |
CellsSRC разрешается в c# - если начать вводить CellsSRC то вариант-функция будет одна - get_CellsSRC(short,short,short);
Пространства VisSectionIndices и пр. разрешаются в бейсике visio: запускаем местный объект-броузер на поиск visSectionObject - он показывает путь в пространстве имен.
Он определен как enum, в c# требуется явное преобразование типов из enum в short.
Для управления объектом на странице можно использовать два типа методов:
- объектный и табличный (абсолютный или именной).
Объектный - любая окно/иконка_на_странице представляет собой класс которому можно отдавать команды именно его функциями или свойствами. Т.е. можно делать все что угодно.
Табличный - выделены общие, наиболее употребимые свойства объектов. Которые представлены в виде набора таблиц и доступ к ним - таблица-столбец-строка для относительного доступа или таблица-уникальное_имя для абсолютного. Таблицы можно посмотреть прямо в визио (если включить режим сервис-параметры-дополнительно-запускать_в_режиме_разработчика.
По правому клику на объекте на странице первым появится пункт Показать таблицу свойств фигуры.
http://koavia.com/n1/TLD/save/vs4.jpg
Т.е. контроль результатов программирования полный - видно изменение ( сравни команды vs3.jpg и значения vs4.jpg).
О системе координат и позиционировании фигур.
Абсолютный ноль лежит в левом нижнем углу прямоугольника рамки выравнивания - то что видно пунктиром вокруг фигуры с хвостиком наверху.
Ее навести курсор на хвостик то появится линия с точкой-Пином - это центр фигуры. Фигура вращается, масштабируется (не всегда) и имеет координаты равные положению Пина.
Рамка выравнивания доступна обычным смертным (поменять положение л.н. угла относительно изображения только через фигура-обновить_рамку_выравнивания. Пин можно таскать и визуально и в таблице.
width height - размеры рамки выравнивания.
angle - поворот рамки вокруг Пина.
PinX PinY - координаты Пина в документе.
LocPinX LocPinY - Пина в координатах рамки выравнивания.
В данном случае центр-Пин - крестик-коннектор между ушек мордочки 16.88 против 17.9/2 по умолчанию. Можно конечно сразу выставить в шаблоне. Дык последние попса-версии перезаписывают при кидании на страницу на попол высоты и смещают фигуру на разницу.
На счет масштабирования - в графике масштабирование тасканием за угол идет он левого нижнего угла всегда. Если использовать таблицу выставив пин, изменяя высоту/ширину рамки масштабируем именно относительно Пина. На данной карте левый нижний угол 200-100 - ставим его на пересечение линий на изображении карты-картинки. И задаем координаты в документе 200-100. Идем к линиям 2800-3100 и меняем в таблице ширину и высоту рамки выравнивания картинки-карты так что бы линии совпали с координатами документа. Получаем точно масштабированную картинку-карту картинку.
И последнее - объектная модель использует для ввода численно-дюймовую систему, табличная - строчную с указанием единиц. Поэтому при бросании шаблона (объектная) на страницу координаты множатся на 100/2,54, а при движении Пина (табличная) указаны единицы - метры.
Нафига я это написал - для себя - потом в профиле можно найти. И пригодится может кому.