на главную
об игре
Space Haven 21.05.2020

Space Haven: Совет (Взлом через редактирование сэйва) [Alpha 11 (0.11.2 gog build 6)]

Файл .txt в котором я собрал все id в отношении которых смог выяснить для чего они. Файл нужен для сверки, смотрите в список, ищите например "хранилище" - m="632". Вбиваете m="632" в поиске по файлу сейва, и меняете параметры. Или смотрите в файле сэйва elementaryId="157", сравниваете с тем что в текстовом списке, и понимаете что 157 - это обычные металлы.
В списке не все станки, но многое из того что вам понадобиться. Ресурсы - почти все даже такие как трупы, щебень, и т.д. Найти и вычислить то чего нет в списке надеюсь поможет инструкция ниже.

И так! Для взлома нам понадобится сэйв игры который в моём случае, для моей версии лежит по адресу: C:\Games\Space Haven v0.11.2.6\savegames\Trip 14\save .

С каждым новым сохранением игра создаёт папку с названием этого самого сохранения которое вы пишете в игре, папки лежат в \savegames\ и дальше по названию, там также добавочно могут лежать папки с автосэйвами привязанные к данному сэйву их тоже можно редактировать, но учитывать что, игра их рано или поздно перезапишет, как скоро можно узнать открыв загрузку в игре.

На скрине выше. Первым вот-вот перезапишется Автосохранение 1, т.к. оно самое старое по времени записи. Стоит учитывать это если других сэйвов нет, а у вас форс мажор надо исправить что-то здесь и сейчас, что бы игра не закончилась провалом, после месячных развитий.

И так файл : game. Он без расширения и присутствует в папке по основному сэйву, но так же в папках автосэйвов привязанных к "основному". Его можно открыть WordPad, блокнотом не рекомендую, потеряется структура, будет каша, и отыскать что либо будет не просто, либо просто запутаться. Я использовал Visual Studio Code, в ней удобней.
Открываем и жмём ctrl+F тобишь поиск, и вводим туда интересующие нас "идентификатор", под которым игра понимает как предметы в инвентаре, так и сами станки, стулья и т.д.
Поясню. Вот на скрине ниже, слева - открытый файл game (сохранение Trip 14), справа - текстовый документ куда я вносил все "идентификаторы" которые смог надыбать.

Слева есть пара меток оранжевым m="632", справа в моём .txt видим, что это хранилище. То есть, что бы вам самим его, или что-то другое найти, в txt, что я накалякал, ищите что вам нужно, выделяете в строке куски вида [м=чётотам], т.е. [m="632"] , без скобок, просто выделил чтоб показать, или можно сам номер(632 или другой), но тогда будьте внимательны чтоб число не было составной частью другого кода. Обратите внимание, что если вы ищите какой-то станок, капсульный ангар, кровать, кухню, тогда, да - идёт [m=] + [идентификатор]. Но если вы ищите сам ресурс, вложенный в данный объёкт, то вот справа можно посмотреть как эта секция с кодом будет выглядеть, выделил синим, здесь я для себя вписал все часто требуемые ресурсы, чтобы потом просто копи-пастом целый кусок вписать с уже прописанными ресурсами и их кол-вом. Обратите внимание, секция слева и секция справа написана одинаково, начинается <inv> и заканчивается </inv>. И у вас должно быть так же, не пропустите ни чего, если код потеряет хоть одну скобку игра вылетит. Между <inv> и </inv> может быть сколько угодно таких строчек с ресурсами, к примеру слева меньше чем справа, если добавлю строчки "справа" в "левый" файл, в инвентаре у меня добавятся ресурсы.
Давайте немного разберём чё тут накалякано. Вот вы нашли секцию m="632", ниже

после <inv>
<s elementaryId="162" inStorage="284" onTheWayIn="0" onTheWayOut="0"/>

elementaryId="162" - смотрим файл txt - это инфраблоки

дальше

inStorage="284" - это количество

И это по сути всё, что вам нужно знать.

Так же обратите внимание, строки слева все начинаются с <s, <s elementaryId="xxx", но бывают строки <f element="xxx". Желательно просто повторить как оно там написано. Но попробую пояснить. На примере строительного станка. Идентификатор m="1447"

Обратите внимание, окно слева, выше маленькое плавающее окошко поиска, было m="632", я поменял на m="1447", и так я быстро нашёл станок, но рядом написано 1 of 3. Игра не различает ваших и чужих хранилищ, станков, кроватей и т.д. Как найти свой. Я знаю, что у меня на корабле только один станок, два не мои. Открыв свой станок, вкладку обзор, я узнаю что у меня в нём 1000 инфраблоков и 8839 строительных инструментов.

Теперь мне надо сравнить параметры других найденных строительных станков со своим.
Несколько раз поклацав по поиску, обнаруживаю станок (секцию с идентификатором m="1447")
в секции которого есть такие строчки:
<feat ft="8839" cp="0">

<s elementaryId="162" inStorage="1" onTheWayIn="0" onTheWayOut="0"/>

<f element="162" value="999.0"/>

[inStorage="1"] прибавить [value="999.0"/>] = как раз та самая 1000 инфраблоков, и 8839 инструментов.
А чё, почему так. В игре нельзя пользовать иструменты из строительного станка(речь только о инструментах в самом станке) как из хранилища, и перенести их тоже нельзя, но они используются "строителями" при установке нового станка, мебели и т.д. Поэтому для них придумали отдельную строчку. А вот 1+999, щас поясню. inStorage - это что-то типа элемент есть или нет, если есть это тот элемент который щас крутится в работе на станке, и как раз строчки onTheWayIn="0" onTheWayOut="0" нам говорят о том, что что-то входит на конвеер и выходит с конвеера, и этот инвентарь идёт как раз с <s, <s elementaryId, при демонтаже станка у вас на полу останутся ящики количеством указанным в inStorage="x". А <f element идёт типа как инвентарь с запасом, его при разрушении вернуть нельзя. В общем где <s не забываем пишем elementaryId="xxx", где <f там пишем element="xxx". Некоторые из этих строчек не влияют на массу корабля, благо на строительном станке можно все три забить 999 и на весе это не отразится, но в некоторых ID надо думать, например если я добавлю 999 инструментов в хранилище, корабль прибавит в весе на 999, а если теже ресурсы увеличить в строительном станке, то на весе корабля это не отразится. Так же стоит помнить что если сделать так:

<s elementaryId="162" inStorage="999" onTheWayIn="0" onTheWayOut="0"/>

<f element="162" value="1.0"/>
то при демонтаже станка может выйти это:

Давайте попробуем добавить строчки, посмотрим как это выглядит, и посмотрим как на это среагирует игра. На пример добавим в станок то чего там быть не должно : фрукты орехи...
Сначала скрин начала. Имеем.

Берём строчку <f element="162" value="999.0"/> и копи-пастим, и меняем номера ID на нужные нам, не забывая править кол-во, вот так:

Добавление блоков корпуса на буровики занимающиеся расширением корпуса. Но только добавлять мы будем не в сами буровики, а в капсульные ангары - m="782". Когда Вы только начали игру на карте скорей всего не будет других кораблей, и их при поиске ID найдётся 2, но если больше, значит по близости брошенный или дереликтовый(разбитый) корабль, и это сооветственно его ангары.

В моём случае нашлось 2, в одном 9992, во втором 9992,2. Редактировать будем его. Обратите внимание на округление игрой, вы будете искать 9992,2, когда действительное значение будет 9992,193. Имейте это тоже ввиду когда будете искать любые другие значения. Не обращайте внимание на то, что у меня все значения из 9999999, если у вас в интересующем инвентаре 0, не беда, найдите ID(m="xxx") в поиске, а затем добудьте, измените или если катастрофа, члены команды умирают, пробоина, и вам надо с момента "сейчас", то просто меняйте значения во всех попавшихся инвентарях, загружайте игру и смотрите, где чё поменялось, потом вычислите, поменяете и загрузитесь в тот момент который вам надо.
И так. В секции c m="782", присутствует строчка <f element="1759" value="9992.193"/>,

element="1759" - это по "нашему" txt справочнику блоки корпуса

value="9992.193" - меняю на 1234 просто чтобы показать что это работает:

<f element="1759" value="1234"/>

Сохраняю файл. Игру при этом не обязательно закрывать. Загружаю. И :

По аналогии: генераторы m="344", element="174" - энергостержни. Так же обратите внимание на окруление. Показывает 957,6. В секции: 956.58984 + inStorage="1". +Округление, которое происходит по принципу +/- 0,5, тут 0,58=0,6, при 0,48 было бы 0, т.е. 956.48984=956.

Кухня m="623"
elementaryId="15" - корнеплоды
elementaryId="706" - фрукты
elementaryId="707" - искусственное мясо
elementaryId="2657" - орехи и семена
и так же
<s elementaryId= показывает нам целые числа, это инвентарь ещё не на конвеере, при демонтаже это всё останется ящиками на полу
<f element= показывает нам тот инвентарь где как бы конвеер, в процессе готовки, члены команды оставляют за собой те самые 0,десятые которые мы видим на скрине игры, но не видим в секции <s elementaryId

Ниже так же можно обратить внимание на строчки:
<f foodId="2657" usageValue="7"/>
<f foodId="15" usageValue="19"/>
<f foodId="706" usageValue="5"/>
<f foodId="707" usageValue="6"/>
Это процентное соотношение всех компонентов в приготовленной пище, самый правый столбец "Продуктовый ящик", в моём случае 37%

m="921" - рассадник с освещением(5 грядок)
element="16" - вода
element="2475" - удобрение

Члены команды. В плане поиска ещё проще. Просто пишем в поиске по документу имя члена экипажа, в моём случае возьмём Aurelia

Строка в которой нашлось её имя - это первая строка секции. Секция начинается с
<c
и заканчивается
</c>
вся секция по данному персонажу

Тут в принципе и не чего разбирать, всё и так понятно.
<Health v="90" ltv="90"/> - здоровье; ltv="xx" - это я так понял маленькие треугольные стрелочки(далее на скрине), типа норма, без баф эффектов и прочего
<Food v="100" ltv="40"> - Запасы организма (далее на скрине)
<stored - запасы организма покомпонентно
protein="15.0" - протеин
carbs="10.0" - углеводы
fat="16.666666" - жиры
vitamins="40.0" - витамины
toxins="0.0" - токсины
rank="0.0" - ранг, не видел ещё, может позже увижу где он там
canBeProcessed="false" raw="false" useByDefaultValue="0" sortOrder="0" - не разобрался
neverEat="true"/> - не понял. поставил true, но она всё равно ест, ненасытная баба
<belly - всё тоже самое, только это то что она поела и сейчас в желудке, тобишь переваривается
protein="9.244954" carbs="25.680431" fat="7.8063726" vitamins="3.3050885" toxins="0.0" rank="0.0" canBeProcessed="false" raw="false" useByDefaultValue="0" sortOrder="0" neverEat="true"/>

треугольные стрелочки на полосках общее настроение, здоровье, питание, энергия и т.д.
треугольные стрелочки на полосках общее настроение, здоровье, питание, энергия и т.д.

секция <rest> - пункт энергия
<Rest v="96" ltv="85"> - всего шкала 96, убывает в течении дня, сейчас 85(маленькая треугольная стрелочка)
<awl type="Rest" change="6"/> - баф "+6 бодрствование"
<wol type="Rest" change="0"/> - антибаф "0 работа"
</Rest>

секция <Comfort - комфорт
v="86" - шкала ltv="86" - сейчас
ut="15"/> - не понял
баф "+6 чувство комфорта" - это она где-то посидела, на диване или под лампой. Не указан, но видимо отслеживается другими путями

<Social v="95" ltv="82"/> - пункт общение 80 + 15баф = 95 шкалы. Здесь и сейчас 82

<Safety v="80" ltv="80"/> - безопасность

<Oxygen v="0" oxs="0"/> - кислород 0. Видимо задействуется когда она наденет скафандр
<Mood v="121" ltv="117"/> - полоска общее настроение. здесь и сейчас 117
<Temperature v="100"/> - возможно предел температуры, причём не ясно фарингейты или цельсии
<Co2Gas v="0"/> - углекислый газ. 0 - значит не мучает
<SmokeGas v="0"/> - дым, я так понимаю
<HazardousGas v="0"/> - а это - опасные газы
в игре дым и опасные газы на одной вкладке представлены (далее на скрине)

<conditions> пункт состояние графа состояние(там же) особо не разобрался оно всё работает совокупно, какие-то ссылаются на другие параметры и т.д. пропустим
<c id="1570" level="6" rs="1">
<rec ht="1" wt="0"/>
<mood>
<m ac="1"/>
<m ac="1"/>
</mood>
<rate>
<m ac="1"/>
<m ac="2"/>
</rate>
</c>
<c id="0" level="0">
<mood>
<m ac="0"/>
</mood>
</c>
<c id="0" level="0">
<mood>
<m ac="0"/>
</mood>
</c>
<c id="1626" level="1" rs="1">
<rec ht="0" wt="0"/>
<mood>
<m ac="15"/> - общение
<m ac="5"/> - общее настроение
</mood>
</c>
</conditions>

<sociality> - отношения с другими членами команды. Пункт состояние графа отношения. Два последних к сожалению мертвецы, я протупил, не знал, что беженцам надо зону выделять, чтоб они имели доступ к буфету и т.д.
<relationShips>
<l targetId="8" romance="8" - роман friendship="89" - друг attraction="-34" - притягательность человека compatibility="65" совместимость canRomance="false"/> - возможность завести роман, вообще не в курсе, что будет если переключить на true, не знаю, что здесь в игре предусмотрено
<l targetId="6" romance="17" friendship="-100" attraction="95" compatibility="-42" canRomance="false"/>
<l targetId="10" romance="7" friendship="75" attraction="88" compatibility="68" canRomance="false"/>
<l targetId="9" romance="3" friendship="60" attraction="-98" compatibility="24" canRomance="false"/>
<l targetId="5" romance="49" friendship="-100" attraction="85" compatibility="-70" canRomance="false"/>
<l targetId="3485" romance="0" friendship="4" attraction="90" compatibility="72" canRomance="false"/>
<l targetId="3487" romance="0" friendship="2" attraction="-85" compatibility="33" canRomance="false"/></relationShips>
<nt n="8" cv="4"/> - эти параметры не знаю
<ng n="10" cv="4"/>
<nm n="9" cv="4"/>
<np n="0" cv="4"/>
<nd n="10" cv="4"/>
</sociality>

<jobsetting> - распределение приоритета задач в соответствии с навыками членов экипажа
<j profession="Navigate" priority="Highest"/> - навигация
<j profession="Gunner" priority="Highest"/> - стрельба
<j profession="Shield" priority="Highest"/> - щиты
<j profession="Operations" priority="Highest"/> - рабочие операции
<j profession="Medical" priority="Highest"/> - медицина
<j profession="Farm" priority="Highest"/> - растениеводство
<j profession="Construct" priority="Highest"/> - строительство
<j profession="Maintenance" priority="Highest"/> - техобслуживание, ремонт я так понял
<j profession="Mine" priority="Highest"/> - горная добыча
<j profession="Industry" priority="Highest"/> - промышленные операции
<j profession="Research" priority="Highest"/> - научные исследования
<j profession="Logistics" priority="Highest"/> - логистика
<j profession="AnyOne" priority="Normal"/> - всего пунктов 12, этот 13-й, не знаю где используется, может в 12 альфе добавят какие-то новые функции
</jobsetting>

<skills> - а это как раз те самые навыки, в соответствии с которыми, мы ставили приоритеты на работу. Здесь их и вовсе 14 и те не по номеру нет 11-го, но есть 16. Максимальный уровень навыка - 3
<s sk="1" level="3"/>
<s sk="2" level="3"/>
<s sk="3" level="3"/>
<s sk="4" level="3"/>
<s sk="5" level="3"/>
<s sk="6" level="3"/>
<s sk="7" level="3"/>
<s sk="8" level="3"/>
<s sk="9" level="3"/>
<s sk="10" level="3"/>
<s sk="13" level="3"/>
<s sk="14" level="3"/>
<s sk="16" level="3"/>
<s sk="12" level="3"/>
</skills>

Ну и последняя строчка на которую может кому-то захочется взглянуть
<colors - одежда, цвет кожи, перчатки и т.д.
glovesOff="false" - выключены ли перчатки
longSleeve="false" - длинные рукава
pantsSet="2364" - id брюк
shirtSet="2360" - id майки
skinSet="742" - id кожи
sp="1" ss="0" sr="1" sh="7" ssh="0" sg="0" sl="0"/> - не знаю
Всё, что пропустил - не знаю, не разобрался.

Теперь по планетам и астероидным полям.
Что бы найти астероид или планету с её ресурсами, ищем id="xxx"
В моём примере Поле астероидов 324, слева как обычно подсвечено оранжевым id="324"

Здесь ресурсов 9/9

видим строчку <s type="Resource" elementId="171" howMuch="9" org="999"/>
как обычно elementId="171" - химическое сырьё
howMuch="9" - количество
org="999" - не разобрался
Пишем нужное нам количество. Обращаю внимание на то, что если вы в этом секторе, вам надо вылететь от туда, сохраниться, изменить параметры в файле, загрузить сэйв в котором сделали изменения, и прилететь к астероиду/планете назад, и тогда изменения будут приняты игрой. Она их где-то ещё просчитывает, потому как поставив howMuch="999", у меня вышло только 144, карты на которые вы прелетаете, процедурно генерируемые, и возможно так, что сгенерировался кусок земли - один, а вы туда пишете 999...как вот здесь например:

Так же проверьте строчку <info isVisible="true" deleted="false" visited="true" saved="true"/>
Для пущей верности сделайте <info isVisible="true" deleted="false" visited="false" saved="false"/>
Чтоб уже наверняка, сработало. Её тоже надо менять до прилёта. На что нам нимекает visited="true".

Касательно Derelict Ship - брошенных разрушенных кораблей, которые нельзя присвоить и можно толко - на слом. Как перевести в другой статус чтобы присвоить. Конретно этот хак, только для процедурногенерируемых кораблей. Для кораблей, где вы вломились к пиратам и даже перебили их - это не сработает, там другой способ.
Допустим Планета 327 - id="327". На ней (на карте) есть корабль дереликтовый - то есть годится только на слом. Скрин в студию:

И если туда прилететь, то увидим, такую, картину:

Ищем id="327" и находим в этом сегменте строчку
<s type="Derelict">
<ships>
<l seed="-4780245896449079018" createdShipId="0" created="false" station="false" crew="0" monsters="0" bigMonsters="0" eggs="0" hives="0" cryoCrew="1" derelict="true" addLoot="true" inHyper="false" sx="0" sy="0" slid="1468"/>
</ships>
</s>

Меняем на

<s type="Claimable">
<ships>
<l seed="-4780245896449079018" createdShipId="0" created="false" station="false" crew="0" monsters="0" bigMonsters="0" eggs="0" hives="0" cryoCrew="1" derelict="false" addLoot="true" inHyper="false" sx="0" sy="0" slid="1468"/>
</ships>
</s>

Загружаемся и прилетаем:

Изменения уже на "парковке" - корабль сразу наш и теперь мы размещаем не один, а два корабля

Обратите внимание, корабль такое же как был, только не разбитый, с незначительными перестановками терморегуляторов, ламп, коробок....И другое название. Это связано с процедурной генерацией. Это тот же корабль, но другой вариант - для присвоения.
Напомню, если не работает, проверьте строчку <info isVisible="true" deleted="false" visited="false" saved="false"/> Должна быть такой. Чтоб Вы как бы попали на эту карту в первый раз. Но может и не понадобиться. Всю игру я не ковырял, хрен знает как у неё "мозги" построены.

Кстати, с помощью этой же строчки можно открыть карту планет. Сделать её видимой.

Суть в чём. Надо под каждой или только желаемой планетой, т.е id="xxx"
в строчке <info isVisible="false" deleted="false" visited="false" saved="false"/>
поменять <info isVisible="true" deleted="false" visited="false" saved="false"/>.
Что бы не бегать по всему файлу и не менять всё в ручную, можно использовать поиск и замену регулярных выражений. В notepad++ тоже присутствует, а вот с wordpad придётся в ручную.
Я использую VS в нём и покажу, для notepad++ не знаю может синтаксис отличаться.
Опять жмём ctrl+F в маленьком плавающем окошке жмём стрелочку слева, после она повернётся вниз, и будет два поля для ввода, первое для поиска, второе для замены, в первое вводим кусок кода, но захватываем не много больше, символы (.*)(без скобок) - означают выбрать всё после, но если мы так сделаем машина выделит всю строчку, поэтому в поле поиск пишем так isVisible=".*" deleted, с пробелом между кавычками делетед, можно и ещё короче, тоже сработает isVisible=".*" d.
Справа не забываем нажать кнопку с такими же символами которые мы использовали (.*) или Alt+R.
Ниже в поле на что менять пишем isVisible="true" deleted или isVisible="true" d, в зависимости от того что выбрали в поле поиск, и напротив этиого поля жмём вторую кнопку с рисунком из букв ab>ac Replace all или Ctrl+Alt+Enter.

ДО
ДО
ПОСЛЕ
ПОСЛЕ

Всё так же, сохраняем изменения в файле, загружаемся.

Продолжение следует.........

Комментарии: 7
Ваш комментарий

Это все понятно и не сложно, а вот как ПОДНЯТЬ ОЧКИ ФЛОТА?? System Points? Не могу сам найти... Игра не объясняет на старте. А потом выясняется, что всё ограничено, начинай сначала... Дикость какая то. Хотя бы сделали, чтобы строить можно было, а задействовать только после уничтожения старого корабля. От таких подводных мин играть не очень хочется.

P/S. Нашел как поднять очки корабля и флота. Надо создать любой новый корабль. Назвать его. В файле game найти его поиском по названию и изменить геометрические размеры! К примеру, ship sx="56" sy="84", где цифры есть клетки. И игра сама "присваивает" очки. Как далее в игре будет не знаю но корабль строить можно!

3

файл game из сохранения можно ещё открыть в эдитонлайн.это если срочно надо ресурсы на складах поднять.первая партия беженцев тож померла с голодухи)

2

Вот-бы ещё сами карты галактики редактировать, а лучше создавать.
В частности, что бы настраивать и количество звёзд и расположение и количество связей между ними, и количество планет в системах.

2

Здравствуйте, уважаемый Пакман) Благодарю вас за детальный разбор игровых механик) Подскажите, когда будет продолжение разбора Космического Рая?)

2

Подскажите где вес корабля изменить?

0

https://steamcommunity.com/sharedfiles/filedetails/?id=2120100221 оставлю статью с стима в комментариях полазь там найдешь используя переводчик человека который пишет об измене массы гипердвигателя в корне игры распаковывая архивом jar файл самой игры, не благодари. Сам файл находится в папке library и называется haven рекомендую использовать Visual Studio Code который указан в этой статье, поиском будешь ориентироваться и меняй все значения гиппердвигателя, я поставил массу двигателя 5600 и теперь имею от 6 гиппердвигателей общую массу 33560

0