Ïåðåíîñ äàííûõ èç îäíîé êàðòû â äðóãóþ ìåæäó ëþáûìè êàðòàìè
В общем я пытался создать кампанию в которой было бы больше 5 миссий. Приходится делать через обычные карты, но невозможность переноса все сильно ограничивает. Нагугливал на разных сайтах, что раньше можно было делать print_to прямо в файл, но как оказалось эту возможность давно убрали. Не придумал ничего лучше, чем дописать функцию в код игры самому. Выхукал где игра вызывает обычный print в консоль и собрал простейший DLL, который перехватывает их и сохраняет в файл, то что мне нужно. Для того, чтобы оно все сразу само переносилось в следующие миссии я записываю непосредственно скриптовые функции сразу в LUA файл, который потом может быть загружен в следующей карте (миссии кампании) через простейший doFile().
Пример переноса данных из одной карты в другую. На видео видно как между миссиями переносятся статы Атака и Защита героя Витторио. (собрано на коленке из говна и палок за 0.00001 наносек) Сохранение в файл происходит когда у синего игрока убивают героя. (но по сути можно прописать это в любой триггер, вообще в любой)
https://www.youtube.com/watch?v=2icBCpRaBp4
Если развивать эту тему, то можно в теории переносить любую информацию в другие карты на лету. Все можно скачать и попробовать во вложении. Исходник DLL компилится через MINGW GCC, но возможно MS VS его тоже сожрет.
Плюсы 1) Очевидно такой способ позволяет создавать кампании с количеством миссий больше 5, просто с переносом инфы между картами (или между несколькими кампаниями, если надо) 2) Можно выбирать, какую информацию переносить, не как в обычной кампании из редактора карт, а например, можно перенести только один определенный стат, навык, артефакт или даже армию. 3) Переносить инфу больше чем о 5 героях. 4) Наверное есть ещё, но пока не придумал. Минусы 1) Сейчас оно все захардкодено в DLL, возможно кто-то может подсказать как бы лучше это дело автоматизировать и облегчить, чтобы могли пользоваться даже люди, не способные скомпилировать DLL. 2) Приходится вручную прописывать print практически для каждого значения стата, так как в DLL выхукано именно вывод текста. Что-то типа print("ATAK=",A) оно не ловит, только обычный принт. 3) ChangeHeroStat именно добавляет статы а не ставит значения, поэтому сейчас приходится уменьшать их на оригинальное значение, а потом только добавлять. 4) Наверное есть ещё, но пока не придумал.
Вопрос: Есть ли у кого-то способ или скрипт как именно устанавливать значение статов, а не добавлять их как в ChangeHeroStat ?
Это очень хорошие открытие! Надо будет посидеть и обмозговать информацию, полученную вами. Может, как-то удастся упростить данный способ для большей доступности.
Не знаю на сколько это осуществимо : 1) Создать отдельное приложение в котором по средствам допустим выбора чекбоксов, указать какую информацию необходимо сохранить и в какой миссии-главе(например в 1-ой главе сохранить прокачку героя и армию, а во 2-ой главе что-либо иное). И сохранить выбранные настройки в файл допустим в виде 'ini' или 'xml'. 2) Уже из Dll распарсить файл с сохранёнными настройками, и подставлять необходимые для переноса данные в функцию которая будет создавать скрипт.
Блин, офигенная вещь! Статы можно выставить как delta-default (из дельты вычесть начальное значение), но вы это и так знаете, как вижу.
К слову хочу сказать, что данные (числа и строки, а также функции для parse'ра) можно передавать между сценариями через SetGameVar, а телепорт в новые миссии осуществлять автоматом через WarpToMap.
Видел вы писали на ютубе "Вот было бы круто, если бы переносились данные по карте map.xdb (положении обьектов к концу игры итд)." В теории можно запомнить любую информацию, которую можно узнать скриптами и вывести в print, а затем так же скриптами установить. Но как я понимаю как раз их и SetGameVar тоже может? А вообще положение объектов, что имеется ввиду? где герой стоял? В теории можно узнавать его координаты через локации, а телепортировать через SetObjectPosition. Или на героев оно не работает? И для других объектов типа лежащих ресурсов тоже наверное можно узнать подбирались ли они? Вроде видел в мануале GetObjectsInRegion. Конечно тема муторная получается в итоге, но в теории возможно?
Кстати SetGameVar и WarpToMap работают в кампаниях тоже? или только в стандартных миссиях? Получается я зря делал свой dll раз уже был способ переноса и так.
Насчет выставления статов получается delta-default единственное решение? А я думал, что должен был быть более "нормальный" способ. Кажется как будто разработчики не дописали API скриптовое, точнее зачем то его сломали, так как я читал, что раньше ChangeStat нормально устанавливал значения, а не прибавлял в старых версиях. Странно, что после изменения этой функции разрабы не добавили че-то типа SetStat.
Узнать координаты объектов на карте можно, но вот только тогда нужно их всех проименовать) По сути, то, чего я хочу, — утопическая идея о полном переносе информации карты в скрипт (для постоянного хождения между локациями как в Сталкере).
Увы, SetGameVar переносит данные между сценариями, последовательно запущенными, а также между миссиями кампаний (так организован перенос артефактов). Но dll вы писали не зря, я уверен, что у него есть более широкое применение. Возможно ли сохранение таблиц? Это же очень круто: передать сложные n-мерные таблицы при помощи SetGameVar нереально.