mirror of
https://github.com/aimrebirth/tools.git
synced 2026-04-15 01:43:25 +00:00
Split save implementation. Improve save loader.
This commit is contained in:
parent
f81baa57e4
commit
c59d9702a6
5 changed files with 810 additions and 521 deletions
|
|
@ -26,7 +26,16 @@ void weather::load(const buffer &b)
|
||||||
READ(b, smoke_1);
|
READ(b, smoke_1);
|
||||||
READ(b, smoke_3);
|
READ(b, smoke_3);
|
||||||
READ(b, smokeType);
|
READ(b, smokeType);
|
||||||
READ(b, unk2);
|
switch (smokeType)
|
||||||
|
{
|
||||||
|
case SmokeType::biexp:
|
||||||
|
READ(b, unk2);
|
||||||
|
b.skip(4);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
READ(b, unk2);
|
||||||
|
break;
|
||||||
|
}
|
||||||
READ_STRING(b, cloud_layer1);
|
READ_STRING(b, cloud_layer1);
|
||||||
READ_STRING(b, cloud_layer2);
|
READ_STRING(b, cloud_layer2);
|
||||||
READ(b, cloud_layer1_speed);
|
READ(b, cloud_layer1_speed);
|
||||||
|
|
@ -47,7 +56,16 @@ void weather::load(const buffer &b)
|
||||||
READ(b, smoke_4);
|
READ(b, smoke_4);
|
||||||
READ(b, slider_3);
|
READ(b, slider_3);
|
||||||
READ(b, slider_1);
|
READ(b, slider_1);
|
||||||
READ(b, unk8);
|
switch (smokeType)
|
||||||
|
{
|
||||||
|
case SmokeType::biexp:
|
||||||
|
READ(b, unk8);
|
||||||
|
b.skip(-4);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
READ(b, unk8);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void weather_group::load(const buffer &b)
|
void weather_group::load(const buffer &b)
|
||||||
|
|
|
||||||
|
|
@ -122,10 +122,10 @@ static void load_translated(aim_vector3<float> &v, const buffer &b)
|
||||||
/*
|
/*
|
||||||
Our coord system:
|
Our coord system:
|
||||||
|
|
||||||
^ z
|
^ z
|
||||||
|
|
|
|
||||||
---> y
|
---> y
|
||||||
/
|
/
|
||||||
v x
|
v x
|
||||||
|
|
||||||
AIM Coordinates:
|
AIM Coordinates:
|
||||||
|
|
|
||||||
644
src/save_loader/save.cpp
Normal file
644
src/save_loader/save.cpp
Normal file
|
|
@ -0,0 +1,644 @@
|
||||||
|
/*
|
||||||
|
* AIM save_loader
|
||||||
|
* Copyright (C) 2016 lzwdgc
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "save.h"
|
||||||
|
|
||||||
|
#include <primitives/exceptions.h>
|
||||||
|
|
||||||
|
changes save_changes;
|
||||||
|
|
||||||
|
void changes::rewrite_mech_org(const buffer &b, std::string &org)
|
||||||
|
{
|
||||||
|
if (mech_org.empty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
// setpos
|
||||||
|
out.seek(b.index());
|
||||||
|
out.skip(-0x20);
|
||||||
|
out.write(mech_org);
|
||||||
|
|
||||||
|
org = mech_org;
|
||||||
|
}
|
||||||
|
|
||||||
|
void changes::rewrite_money(const buffer &b)
|
||||||
|
{
|
||||||
|
if (money == 0)
|
||||||
|
return;
|
||||||
|
out.seek(b.index());
|
||||||
|
out.skip(-4);
|
||||||
|
out.write(money);
|
||||||
|
}
|
||||||
|
|
||||||
|
void changes::rewrite_upgrade_equ_for_player(const buffer &b, uint32_t value)
|
||||||
|
{
|
||||||
|
if (!upgrade_equ_for_player)
|
||||||
|
return;
|
||||||
|
out.seek(b.index());
|
||||||
|
out.skip(-4);
|
||||||
|
out.write(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void int_variable::load(const buffer &b)
|
||||||
|
{
|
||||||
|
READ_STRING(b, name);
|
||||||
|
READ(b, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void single_string::load(const buffer &b)
|
||||||
|
{
|
||||||
|
READ_STRING(b, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
void string_variable::load(const buffer &b)
|
||||||
|
{
|
||||||
|
READ_STRING(b, name);
|
||||||
|
READ_STRING(b, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void header_segment::load(const buffer &b)
|
||||||
|
{
|
||||||
|
READ(b, unk1);
|
||||||
|
READ_STRING_N(b, save_name, 0x60);
|
||||||
|
READ(b, position);
|
||||||
|
READ_STRING_N(b, mmp_file, 0x110);
|
||||||
|
READ_STRING(b, location_name);
|
||||||
|
READ(b, camera);
|
||||||
|
READ(b, unk2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void string_segment::load(const buffer &b)
|
||||||
|
{
|
||||||
|
READ_PASCAL_STRING(b, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
void screen_segment::load(const buffer &b)
|
||||||
|
{
|
||||||
|
b._read((uint8_t *)screenshot.getData().data(), screenshot.getBytesLength());
|
||||||
|
// rows should be swapped now: bottom is the first row etc.
|
||||||
|
}
|
||||||
|
|
||||||
|
void scripts_segment::script_entry::load(const buffer &b)
|
||||||
|
{
|
||||||
|
READ_STRING(b, name);
|
||||||
|
READ_STRING_N(b, path, 0x80);
|
||||||
|
}
|
||||||
|
|
||||||
|
void scripts_segment::script_entry_ext::load(const buffer &b)
|
||||||
|
{
|
||||||
|
READ_STRING(b, name);
|
||||||
|
READ(b, unk0);
|
||||||
|
READ_STRING_N(b, path, 0x80);
|
||||||
|
}
|
||||||
|
|
||||||
|
void scripts_segment::load(const buffer &b)
|
||||||
|
{
|
||||||
|
b.read_vector(bases);
|
||||||
|
b.read_vector(events);
|
||||||
|
b.read_vector(unk0);
|
||||||
|
b.read_vector(int_variables);
|
||||||
|
b.read_vector(str_variables);
|
||||||
|
}
|
||||||
|
|
||||||
|
void radar_segment::radar::load(const buffer &b)
|
||||||
|
{
|
||||||
|
READ(b, unk0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void radar_segment::mechanoid5::load(const buffer &b)
|
||||||
|
{
|
||||||
|
READ_STRING(b, name);
|
||||||
|
READ(b, unk0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void radar_segment::load(const buffer &b)
|
||||||
|
{
|
||||||
|
b.read_vector(radars);
|
||||||
|
READ(b, unk0);
|
||||||
|
b.read_vector(mechanoid5s);
|
||||||
|
b.read_vector(orgs);
|
||||||
|
}
|
||||||
|
|
||||||
|
void gamedata_segment::load(const buffer &b)
|
||||||
|
{
|
||||||
|
READ(b, unk00);
|
||||||
|
READ_N_OBJECTS_WITH_LOAD(b, locs);
|
||||||
|
READ_N_OBJECTS_WITH_LOAD(b, orgs);
|
||||||
|
READ(b, unk0);
|
||||||
|
READ_N_OBJECTS_WITH_LOAD(b, unk1);
|
||||||
|
READ_STRING(b, base_name);
|
||||||
|
READ(b, unk2);
|
||||||
|
READ_PASCAL_STRING(b, user_name);
|
||||||
|
READ_N_OBJECTS_WITH_LOAD(b, unk3);
|
||||||
|
READ_STRING(b, icon);
|
||||||
|
READ(b, unk4);
|
||||||
|
}
|
||||||
|
|
||||||
|
void questlog_segment::record::load(const buffer &b)
|
||||||
|
{
|
||||||
|
READ_STRING(b, name);
|
||||||
|
READ_STRING(b, name_journal);
|
||||||
|
READ(b, unk0);
|
||||||
|
READ_STRING(b, endtime);
|
||||||
|
}
|
||||||
|
|
||||||
|
void questlog_segment::load(const buffer &b)
|
||||||
|
{
|
||||||
|
READ(b, unk0);
|
||||||
|
b.read_vector(int_variables);
|
||||||
|
b.read_vector(events);
|
||||||
|
b.read_vector(story_quests);
|
||||||
|
}
|
||||||
|
|
||||||
|
void trade_segment::Price::load(const buffer &b)
|
||||||
|
{
|
||||||
|
READ_STRING(b, tov_name);
|
||||||
|
READ(b, unk0);
|
||||||
|
READ(b, mass);
|
||||||
|
READ(b, price);
|
||||||
|
READ(b, notrade);
|
||||||
|
READ(b, type);
|
||||||
|
READ(b, unk1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void trade_segment::BuildingPrice::load(const buffer &b)
|
||||||
|
{
|
||||||
|
READ_STRING(b, name);
|
||||||
|
b.read_vector(prices);
|
||||||
|
READ(b, unk0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void trade_segment::load(const buffer &b)
|
||||||
|
{
|
||||||
|
READ(b, unk0);
|
||||||
|
b.read_vector(buildingPrices);
|
||||||
|
}
|
||||||
|
|
||||||
|
void env_segment::load(const buffer &b)
|
||||||
|
{
|
||||||
|
READ(b, unk0);
|
||||||
|
w.load(b);
|
||||||
|
}
|
||||||
|
|
||||||
|
void orgrel_segment::org_rep::load(const buffer &b)
|
||||||
|
{
|
||||||
|
READ(b, unk0);
|
||||||
|
READ(b, unk1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void orgrel_segment::load(const buffer &b)
|
||||||
|
{
|
||||||
|
b.read_vector(org_reps);
|
||||||
|
uint32_t unk0[2];
|
||||||
|
READ(b, unk0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void others_segment::load(const buffer &b)
|
||||||
|
{
|
||||||
|
READ(b, unk0);
|
||||||
|
READ(b, unk1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void mech_segment::equipment::load(const buffer &b)
|
||||||
|
{
|
||||||
|
READ(b, id);
|
||||||
|
READ_STRING(b, name);
|
||||||
|
READ(b, unk0);
|
||||||
|
READ(b, unk1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void mech_segment::moddable_equipment::load(const buffer &b)
|
||||||
|
{
|
||||||
|
READ_STRING(b, name);
|
||||||
|
READ(b, mask);
|
||||||
|
}
|
||||||
|
|
||||||
|
void mech_segment::moddable_equipment2::load(const buffer &b)
|
||||||
|
{
|
||||||
|
READ(b, id);
|
||||||
|
READ_STRING(b, name);
|
||||||
|
READ(b, unk0);
|
||||||
|
READ(b, mask);
|
||||||
|
}
|
||||||
|
|
||||||
|
void mech_segment::hold_item::load(const buffer &b)
|
||||||
|
{
|
||||||
|
READ(b, type);
|
||||||
|
READ_STRING(b, name);
|
||||||
|
READ(b, count);
|
||||||
|
READ(b, unk0);
|
||||||
|
READ(b, unk1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void mech_segment::ammo::load(const buffer &b)
|
||||||
|
{
|
||||||
|
READ_STRING(b, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
void mech_segment::ammo_count::load(const buffer &b)
|
||||||
|
{
|
||||||
|
READ_STRING(b, name);
|
||||||
|
READ(b, count);
|
||||||
|
}
|
||||||
|
|
||||||
|
void mech_segment::mech::load(const buffer &b)
|
||||||
|
{
|
||||||
|
READ(b, id);
|
||||||
|
READ_STRING(b, name);
|
||||||
|
READ_STRING(b, name2);
|
||||||
|
READ_STRING(b, org);
|
||||||
|
save_changes.rewrite_mech_org(b, org);
|
||||||
|
READ_STRING(b, building);
|
||||||
|
|
||||||
|
READ(b, flags);
|
||||||
|
READ(b, unk11);
|
||||||
|
READ(b, unk12);
|
||||||
|
READ(b, unk13);
|
||||||
|
READ(b, unk14);
|
||||||
|
|
||||||
|
auto f = (uint32_t)flags;
|
||||||
|
if (!(f == 0x01000101 || f == 0x00000001 || f == 0x00000101 || f == 0x01000001))
|
||||||
|
{
|
||||||
|
READ(b, unk16);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
READ(b, unk15);
|
||||||
|
|
||||||
|
if (unk14 == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
READ(b, unk15_1); // size?
|
||||||
|
|
||||||
|
b.read_vector(equipments);
|
||||||
|
|
||||||
|
READ(b, unk40);
|
||||||
|
READ(b, unk4);
|
||||||
|
|
||||||
|
//
|
||||||
|
glider.load(b);
|
||||||
|
if (isPlayer())
|
||||||
|
save_changes.rewrite_upgrade_equ_for_player(b, 0x1666);
|
||||||
|
weapon1.load(b);
|
||||||
|
if (isPlayer())
|
||||||
|
save_changes.rewrite_upgrade_equ_for_player(b, 0x2666);
|
||||||
|
weapon2.load(b);
|
||||||
|
if (isPlayer())
|
||||||
|
save_changes.rewrite_upgrade_equ_for_player(b, 0x2666);
|
||||||
|
reactor1.load(b);
|
||||||
|
reactor2.load(b);
|
||||||
|
engine1.load(b);
|
||||||
|
engine2.load(b);
|
||||||
|
energy_shield.load(b);
|
||||||
|
armor.load(b);
|
||||||
|
|
||||||
|
// ?
|
||||||
|
READ(b, g_unk0);
|
||||||
|
if (g_unk0 == 0)
|
||||||
|
READ(b, g_unk1);
|
||||||
|
READ(b, g_unk2);
|
||||||
|
|
||||||
|
if (g_unk0 == 0)
|
||||||
|
b.read_vector(ammos, g_unk1);
|
||||||
|
|
||||||
|
b.read_vector(ammos1, g_unk0);
|
||||||
|
|
||||||
|
if (g_unk0 != 0 || g_unk1 != 0)
|
||||||
|
{
|
||||||
|
READ(b, g_unk3);
|
||||||
|
if (g_unk0 > 0)
|
||||||
|
{
|
||||||
|
uint32_t n;
|
||||||
|
b.skip(-8);
|
||||||
|
READ(b, n);
|
||||||
|
b.skip(4);
|
||||||
|
b.read_vector(ammos2, n);
|
||||||
|
std::vector<single_int<>> v;
|
||||||
|
b.read_vector(v, n);
|
||||||
|
}
|
||||||
|
if (g_unk1 > 0)
|
||||||
|
{
|
||||||
|
g_unk1--;
|
||||||
|
while (g_unk1--)
|
||||||
|
READ(b, g_unk3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ureactor1.load(b);
|
||||||
|
if (isPlayer())
|
||||||
|
save_changes.rewrite_upgrade_equ_for_player(b, 0x3666);
|
||||||
|
ureactor2.load(b);
|
||||||
|
if (isPlayer())
|
||||||
|
save_changes.rewrite_upgrade_equ_for_player(b, 0x3666);
|
||||||
|
uengine1.load(b);
|
||||||
|
if (isPlayer())
|
||||||
|
save_changes.rewrite_upgrade_equ_for_player(b, 0x4666);
|
||||||
|
uengine2.load(b);
|
||||||
|
if (isPlayer())
|
||||||
|
save_changes.rewrite_upgrade_equ_for_player(b, 0x4666);
|
||||||
|
uenergy_shield.load(b);
|
||||||
|
if (isPlayer())
|
||||||
|
save_changes.rewrite_upgrade_equ_for_player(b, 0x5666);
|
||||||
|
uarmor.load(b);
|
||||||
|
|
||||||
|
g_unk4.load(b);
|
||||||
|
|
||||||
|
READ(b, glider_mask);
|
||||||
|
if (isPlayer())
|
||||||
|
save_changes.rewrite_upgrade_equ_for_player(b, 0x1666);
|
||||||
|
|
||||||
|
b.read_vector(ammos3);
|
||||||
|
|
||||||
|
READ(b, money);
|
||||||
|
if (name == "PLAYER")
|
||||||
|
save_changes.rewrite_money(b);
|
||||||
|
|
||||||
|
b.read_vector(items);
|
||||||
|
|
||||||
|
READ(b, g_unk6);
|
||||||
|
|
||||||
|
// TODO
|
||||||
|
|
||||||
|
// if (g_unk0 == 1)
|
||||||
|
// if ((uint32_t)g_unk2 == 15)
|
||||||
|
// if ((uint32_t)g_unk3 == 0)
|
||||||
|
// if (unk13[0] == 5)
|
||||||
|
if (g_unk6[26][0] != 0 && strcmp((const char *)b.getPtr(), "GROUPS") != 0)
|
||||||
|
{
|
||||||
|
|
||||||
|
READ(b, g_unk7);
|
||||||
|
/*if (g_unk7 != 0)
|
||||||
|
{
|
||||||
|
b.skip(-4);
|
||||||
|
return;
|
||||||
|
}*/
|
||||||
|
READ(b, g_unk8);
|
||||||
|
READ(b, g_unk9);
|
||||||
|
READ(b, g_unk10);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool mech_segment::mech::isPlayer() const
|
||||||
|
{
|
||||||
|
return name == "PLAYER";
|
||||||
|
}
|
||||||
|
|
||||||
|
void mech_segment::load(const buffer &b)
|
||||||
|
{
|
||||||
|
b.read_vector(mechs);
|
||||||
|
}
|
||||||
|
|
||||||
|
void groups_segment::mech::load(const buffer &b)
|
||||||
|
{
|
||||||
|
READ_STRING(b, name);
|
||||||
|
READ(b, unk0);
|
||||||
|
READ(b, unk1);
|
||||||
|
READ(b, unk2);
|
||||||
|
READ(b, unk3);
|
||||||
|
}
|
||||||
|
|
||||||
|
void groups_segment::group::load(const buffer &b)
|
||||||
|
{
|
||||||
|
READ(b, pos);
|
||||||
|
READ_STRING(b, org);
|
||||||
|
READ_STRING(b, base);
|
||||||
|
uint32_t unk0;
|
||||||
|
uint16_t unk1;
|
||||||
|
float unk2[3];
|
||||||
|
READ(b, unk0);
|
||||||
|
READ(b, unk1);
|
||||||
|
READ(b, unk2);
|
||||||
|
b.read_vector(mechs);
|
||||||
|
}
|
||||||
|
|
||||||
|
void groups_segment::load(const buffer &b)
|
||||||
|
{
|
||||||
|
b.read_vector(groups);
|
||||||
|
}
|
||||||
|
|
||||||
|
void orgdata_segment::org_config::load(const buffer &b)
|
||||||
|
{
|
||||||
|
b.read_vector(names);
|
||||||
|
}
|
||||||
|
|
||||||
|
void orgdata_segment::orgdata::load(const buffer &b)
|
||||||
|
{
|
||||||
|
READ(b, unk0);
|
||||||
|
READ_STRING(b, org);
|
||||||
|
READ(b, unk1);
|
||||||
|
READ(b, unk2);
|
||||||
|
READ(b, rep);
|
||||||
|
b.read_vector(configs, 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
void orgdata_segment::load(const buffer &b)
|
||||||
|
{
|
||||||
|
b.read_vector(orgdatas);
|
||||||
|
}
|
||||||
|
|
||||||
|
void builds_segment::build::load(const buffer &b)
|
||||||
|
{
|
||||||
|
READ_STRING(b, bld);
|
||||||
|
READ_STRING(b, org);
|
||||||
|
READ(b, unk1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void builds_segment::load(const buffer &b)
|
||||||
|
{
|
||||||
|
b.read_vector(builds);
|
||||||
|
}
|
||||||
|
|
||||||
|
void orgs_segment::org::load(const buffer &b)
|
||||||
|
{
|
||||||
|
struct base
|
||||||
|
{
|
||||||
|
struct mech
|
||||||
|
{
|
||||||
|
std::string name;
|
||||||
|
|
||||||
|
void load(const buffer &b)
|
||||||
|
{
|
||||||
|
READ_STRING(b, name);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
std::string name;
|
||||||
|
float unk2;
|
||||||
|
bool unk3;
|
||||||
|
uint32_t unk4[2];
|
||||||
|
std::vector<mech> mechs;
|
||||||
|
std::string mname; // mech
|
||||||
|
|
||||||
|
void load(const buffer &b)
|
||||||
|
{
|
||||||
|
READ_STRING(b, name);
|
||||||
|
READ(b, unk2);
|
||||||
|
READ(b, unk3);
|
||||||
|
READ(b, unk4);
|
||||||
|
b.read_vector(mechs);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
uint32_t unk0[8];
|
||||||
|
std::vector<base> bases;
|
||||||
|
std::string unk1;
|
||||||
|
|
||||||
|
READ(b, unk0);
|
||||||
|
b.read_vector(bases);
|
||||||
|
READ_STRING(b, unk1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void orgs_segment::load(const buffer &b)
|
||||||
|
{
|
||||||
|
b.read_vector(orgs);
|
||||||
|
}
|
||||||
|
|
||||||
|
void tradeeqp_segment::Good::load(const buffer &b)
|
||||||
|
{
|
||||||
|
READ_STRING(b, tov_name);
|
||||||
|
READ(b, unk0);
|
||||||
|
READ(b, mask);
|
||||||
|
READ(b, price);
|
||||||
|
READ(b, count);
|
||||||
|
READ(b, probability);
|
||||||
|
}
|
||||||
|
|
||||||
|
void tradeeqp_segment::bld::load(const buffer &b)
|
||||||
|
{
|
||||||
|
READ_STRING(b, name);
|
||||||
|
b.read_vector(prices);
|
||||||
|
}
|
||||||
|
|
||||||
|
void tradeeqp_segment::load(const buffer &b)
|
||||||
|
{
|
||||||
|
READ(b, unk0);
|
||||||
|
b.read_vector(prices);
|
||||||
|
b.read_vector(blds);
|
||||||
|
}
|
||||||
|
|
||||||
|
void objects_segment::base::load(const buffer &b)
|
||||||
|
{
|
||||||
|
READ_STRING(b, name);
|
||||||
|
READ(b, unk0);
|
||||||
|
READ(b, unk1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void objects_segment::load(const buffer &b)
|
||||||
|
{
|
||||||
|
b.read_vector(bases);
|
||||||
|
}
|
||||||
|
|
||||||
|
void mms_state_segment::load(const buffer &b)
|
||||||
|
{
|
||||||
|
READ_STRING(b, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
void mms_c_config_segment::load(const buffer &b)
|
||||||
|
{
|
||||||
|
// todo: insert config read from mech
|
||||||
|
b.read_vector(objects);
|
||||||
|
}
|
||||||
|
|
||||||
|
void mms_world_data_segment::load(const buffer &b)
|
||||||
|
{
|
||||||
|
READ(b, unk0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void mainmech_segment::load(const buffer &b)
|
||||||
|
{
|
||||||
|
READ(b, unk0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void segment_desc::load(const buffer &b)
|
||||||
|
{
|
||||||
|
READ_STRING(b, name);
|
||||||
|
uint32_t magic;
|
||||||
|
READ(b, magic);
|
||||||
|
if (magic != (uint32_t)-2)
|
||||||
|
throw SW_RUNTIME_ERROR("bad magic for segment: " + name);
|
||||||
|
uint32_t len;
|
||||||
|
READ(b, len); // length of segment + 4 (sizeof(int) - internal segment length)
|
||||||
|
uint32_t offset;
|
||||||
|
READ(b, offset);
|
||||||
|
uint32_t unk1;
|
||||||
|
READ(b, unk1);
|
||||||
|
uint32_t len2;
|
||||||
|
READ(b, len2);
|
||||||
|
if (len != len2 + sizeof(len2))
|
||||||
|
throw SW_RUNTIME_ERROR("bad length for segment: " + name);
|
||||||
|
|
||||||
|
uint32_t start = b.index();
|
||||||
|
uint32_t end = start + len2;
|
||||||
|
|
||||||
|
#define SWITCH(s, t) \
|
||||||
|
if (name == s) \
|
||||||
|
seg = new t
|
||||||
|
#define CASE(s, t) else SWITCH(s, t)
|
||||||
|
#define DEFAULT else
|
||||||
|
|
||||||
|
SWITCH("HEADER", header_segment);
|
||||||
|
CASE("CAPTION", string_segment);
|
||||||
|
CASE("PLAYER", string_segment);
|
||||||
|
CASE("SCREEN", screen_segment);
|
||||||
|
CASE("SCRIPTS", scripts_segment);
|
||||||
|
// CASE("RADAR", radar_segment);
|
||||||
|
CASE("GAMEDATA", gamedata_segment);
|
||||||
|
CASE("QUESTLOG", questlog_segment);
|
||||||
|
CASE("TRADE", trade_segment);
|
||||||
|
CASE("ENV", env_segment);
|
||||||
|
CASE("ORGREL", orgrel_segment);
|
||||||
|
CASE("OTHERS", others_segment);
|
||||||
|
CASE("MECH", mech_segment);
|
||||||
|
// CASE("GROUPS", groups_segment);
|
||||||
|
CASE("ORGDATA", orgdata_segment);
|
||||||
|
CASE("BUILDS", builds_segment);
|
||||||
|
//CASE("ORGS", orgs_segment);
|
||||||
|
CASE("TRADEEQP", tradeeqp_segment);
|
||||||
|
// CASE("OBJECTS", objects_segment);
|
||||||
|
CASE("MMS_STATE", mms_state_segment);
|
||||||
|
// CASE("MMS_C_CONFIG", mms_c_config_segment); // (my) clan config
|
||||||
|
CASE("MMS_WORLD_DATA", mms_world_data_segment);
|
||||||
|
CASE("MAINMECH", mainmech_segment);
|
||||||
|
DEFAULT
|
||||||
|
{
|
||||||
|
std::cout << "skipped " << name << " size = " << len2 << "\n";
|
||||||
|
b.skip(len2);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
seg->load(b);
|
||||||
|
if (b.index() != end)
|
||||||
|
throw SW_RUNTIME_ERROR("bad segment read: " + name);
|
||||||
|
|
||||||
|
#undef SWITCH
|
||||||
|
#undef CASE
|
||||||
|
#undef DEFAULT
|
||||||
|
}
|
||||||
|
|
||||||
|
void save::load(const buffer &b)
|
||||||
|
{
|
||||||
|
READ(b, magic);
|
||||||
|
READ(b, version);
|
||||||
|
|
||||||
|
while (!b.eof())
|
||||||
|
{
|
||||||
|
segment_desc sd;
|
||||||
|
sd.load(b);
|
||||||
|
if (sd.seg)
|
||||||
|
segments.push_back(sd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -35,38 +35,13 @@ struct changes
|
||||||
float money = 0;
|
float money = 0;
|
||||||
bool upgrade_equ_for_player = false;
|
bool upgrade_equ_for_player = false;
|
||||||
|
|
||||||
void rewrite_mech_org(const buffer &b, std::string &org)
|
void rewrite_mech_org(const buffer &b, std::string &org);
|
||||||
{
|
void rewrite_money(const buffer &b);
|
||||||
if (mech_org.empty())
|
void rewrite_upgrade_equ_for_player(const buffer &b, uint32_t value);
|
||||||
return;
|
|
||||||
|
|
||||||
// setpos
|
};
|
||||||
out.seek(b.index());
|
|
||||||
out.skip(-0x20);
|
|
||||||
out.write(mech_org);
|
|
||||||
|
|
||||||
org = mech_org;
|
extern changes save_changes;
|
||||||
}
|
|
||||||
|
|
||||||
void rewrite_money(const buffer &b)
|
|
||||||
{
|
|
||||||
if (money == 0)
|
|
||||||
return;
|
|
||||||
out.seek(b.index());
|
|
||||||
out.skip(-4);
|
|
||||||
out.write(money);
|
|
||||||
}
|
|
||||||
|
|
||||||
void rewrite_upgrade_equ_for_player(const buffer &b, uint32_t value)
|
|
||||||
{
|
|
||||||
if (!upgrade_equ_for_player)
|
|
||||||
return;
|
|
||||||
out.seek(b.index());
|
|
||||||
out.skip(-4);
|
|
||||||
out.write(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
} save_changes;
|
|
||||||
|
|
||||||
// common structs
|
// common structs
|
||||||
|
|
||||||
|
|
@ -75,11 +50,7 @@ struct int_variable
|
||||||
std::string name;
|
std::string name;
|
||||||
uint32_t value;
|
uint32_t value;
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
READ_STRING(b, name);
|
|
||||||
READ(b, value);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class T = uint32_t>
|
template <class T = uint32_t>
|
||||||
|
|
@ -97,10 +68,7 @@ struct single_string
|
||||||
{
|
{
|
||||||
std::string name;
|
std::string name;
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
READ_STRING(b, name);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct string_variable
|
struct string_variable
|
||||||
|
|
@ -108,11 +76,7 @@ struct string_variable
|
||||||
std::string name;
|
std::string name;
|
||||||
std::string value;
|
std::string value;
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
READ_STRING(b, name);
|
|
||||||
READ_STRING(b, value);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// segments
|
// segments
|
||||||
|
|
@ -132,37 +96,21 @@ struct header_segment : public segment
|
||||||
Common camera;
|
Common camera;
|
||||||
uint32_t unk2[7];
|
uint32_t unk2[7];
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
READ(b, unk1);
|
|
||||||
READ_STRING_N(b, save_name, 0x60);
|
|
||||||
READ(b, position);
|
|
||||||
READ_STRING_N(b, mmp_file, 0x110);
|
|
||||||
READ_STRING(b, location_name);
|
|
||||||
READ(b, camera);
|
|
||||||
READ(b, unk2);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct string_segment : public segment
|
struct string_segment : public segment
|
||||||
{
|
{
|
||||||
std::string s;
|
std::string s;
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
READ_PASCAL_STRING(b, s);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct screen_segment : public segment
|
struct screen_segment : public segment
|
||||||
{
|
{
|
||||||
mat<color> screenshot{ 128, 128 };
|
mat<color> screenshot{ 128, 128 };
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
b._read((uint8_t*)screenshot.getData().data(), screenshot.getBytesLength());
|
|
||||||
// rows should be swapped now: bottom is the first row etc.
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct scripts_segment : public segment
|
struct scripts_segment : public segment
|
||||||
|
|
@ -172,23 +120,14 @@ struct scripts_segment : public segment
|
||||||
std::string name;
|
std::string name;
|
||||||
std::string path;
|
std::string path;
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
READ_STRING(b, name);
|
|
||||||
READ_STRING_N(b, path, 0x80);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct script_entry_ext : public script_entry
|
struct script_entry_ext : public script_entry
|
||||||
{
|
{
|
||||||
uint32_t unk0[10];
|
uint32_t unk0[10];
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
READ_STRING(b, name);
|
|
||||||
READ(b, unk0);
|
|
||||||
READ_STRING_N(b, path, 0x80);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<script_entry> bases;
|
std::vector<script_entry> bases;
|
||||||
|
|
@ -197,14 +136,7 @@ struct scripts_segment : public segment
|
||||||
std::vector<int_variable> int_variables;
|
std::vector<int_variable> int_variables;
|
||||||
std::vector<string_variable> str_variables;
|
std::vector<string_variable> str_variables;
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
b.read_vector(bases);
|
|
||||||
b.read_vector(events);
|
|
||||||
b.read_vector(unk0);
|
|
||||||
b.read_vector(int_variables);
|
|
||||||
b.read_vector(str_variables);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// todo
|
// todo
|
||||||
|
|
@ -214,10 +146,7 @@ struct radar_segment : public segment
|
||||||
{
|
{
|
||||||
char unk0[0x1C4];
|
char unk0[0x1C4];
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
READ(b, unk0);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct mechanoid5
|
struct mechanoid5
|
||||||
|
|
@ -225,6 +154,38 @@ struct radar_segment : public segment
|
||||||
std::string name;
|
std::string name;
|
||||||
float unk0[6];
|
float unk0[6];
|
||||||
|
|
||||||
|
void load(const buffer &b);
|
||||||
|
};
|
||||||
|
|
||||||
|
std::vector<radar> radars;
|
||||||
|
uint16_t unk0;
|
||||||
|
std::vector<mechanoid5> mechanoid5s;
|
||||||
|
std::vector<single_string> orgs;
|
||||||
|
|
||||||
|
void load(const buffer &b);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct gamedata_segment : public segment
|
||||||
|
{
|
||||||
|
struct loc
|
||||||
|
{
|
||||||
|
float unk0;
|
||||||
|
uint32_t unk1[2];
|
||||||
|
std::string name;
|
||||||
|
|
||||||
|
void load(const buffer &b)
|
||||||
|
{
|
||||||
|
READ(b, unk0);
|
||||||
|
READ(b, unk1);
|
||||||
|
READ_STRING(b, name);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct org
|
||||||
|
{
|
||||||
|
std::string name;
|
||||||
|
uint32_t unk0; // flags?
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b)
|
||||||
{
|
{
|
||||||
READ_STRING(b, name);
|
READ_STRING(b, name);
|
||||||
|
|
@ -232,26 +193,49 @@ struct radar_segment : public segment
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<radar> radars;
|
struct unk0s
|
||||||
uint16_t unk0;
|
|
||||||
std::vector<mechanoid5> mechanoid5s;
|
|
||||||
std::vector<single_string> orgs;
|
|
||||||
|
|
||||||
void load(const buffer &b)
|
|
||||||
{
|
{
|
||||||
b.read_vector(radars);
|
float unk0[2];
|
||||||
READ(b, unk0);
|
uint32_t unk1;
|
||||||
b.read_vector(mechanoid5s);
|
|
||||||
b.read_vector(orgs);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// todo
|
void load(const buffer &b)
|
||||||
struct gamedata_segment : public segment
|
{
|
||||||
{
|
READ(b, unk0);
|
||||||
void load(const buffer &b)
|
READ(b, unk1);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct unk1s
|
||||||
{
|
{
|
||||||
}
|
std::string name; // loc part?
|
||||||
|
char unk0[0xE0];
|
||||||
|
uint32_t unk1;
|
||||||
|
uint32_t unk2;
|
||||||
|
std::string location; // loc
|
||||||
|
|
||||||
|
void load(const buffer &b)
|
||||||
|
{
|
||||||
|
READ_STRING(b, name);
|
||||||
|
READ(b, unk0);
|
||||||
|
READ(b, unk1);
|
||||||
|
READ(b, unk2);
|
||||||
|
READ_STRING(b, location);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
char unk00[0x5C];
|
||||||
|
std::vector<loc> locs;
|
||||||
|
std::vector<org> orgs;
|
||||||
|
uint32_t unk0;
|
||||||
|
std::vector<unk0s> unk1;
|
||||||
|
std::string base_name;
|
||||||
|
uint32_t unk2;
|
||||||
|
std::string user_name; // mech name?
|
||||||
|
std::vector<unk1s> unk3;
|
||||||
|
std::string icon; // clan icon?
|
||||||
|
uint32_t unk4;
|
||||||
|
|
||||||
|
void load(const buffer &b);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct questlog_segment : public segment
|
struct questlog_segment : public segment
|
||||||
|
|
@ -263,13 +247,7 @@ struct questlog_segment : public segment
|
||||||
uint32_t unk0[2];
|
uint32_t unk0[2];
|
||||||
std::string endtime;
|
std::string endtime;
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
READ_STRING(b, name);
|
|
||||||
READ_STRING(b, name_journal);
|
|
||||||
READ(b, unk0);
|
|
||||||
READ_STRING(b, endtime);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
uint32_t unk0;
|
uint32_t unk0;
|
||||||
|
|
@ -278,13 +256,7 @@ struct questlog_segment : public segment
|
||||||
std::vector<record> events;
|
std::vector<record> events;
|
||||||
std::vector<string_variable> story_quests;
|
std::vector<string_variable> story_quests;
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
READ(b, unk0);
|
|
||||||
b.read_vector(int_variables);
|
|
||||||
b.read_vector(events);
|
|
||||||
b.read_vector(story_quests);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct trade_segment : public segment
|
struct trade_segment : public segment
|
||||||
|
|
@ -292,13 +264,14 @@ struct trade_segment : public segment
|
||||||
struct Price
|
struct Price
|
||||||
{
|
{
|
||||||
std::string tov_name;
|
std::string tov_name;
|
||||||
float unk2[6];
|
uint32_t unk0;
|
||||||
|
float mass;
|
||||||
|
float price;
|
||||||
|
uint32_t notrade;
|
||||||
|
uint32_t type;
|
||||||
|
float unk1;
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
READ_STRING(b, tov_name);
|
|
||||||
READ(b, unk2);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct BuildingPrice
|
struct BuildingPrice
|
||||||
|
|
@ -307,51 +280,36 @@ struct trade_segment : public segment
|
||||||
std::vector<Price> prices;
|
std::vector<Price> prices;
|
||||||
uint32_t unk0;
|
uint32_t unk0;
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
READ_STRING(b, name);
|
|
||||||
b.read_vector(prices);
|
|
||||||
READ(b, unk0);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
uint32_t unk0 = 0;
|
uint32_t unk0 = 0;
|
||||||
std::vector<BuildingPrice> buildingPrices;
|
std::vector<BuildingPrice> buildingPrices;
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
READ(b, unk0);
|
|
||||||
b.read_vector(buildingPrices);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// todo
|
|
||||||
struct env_segment : public segment
|
struct env_segment : public segment
|
||||||
{
|
{
|
||||||
void load(const buffer &b)
|
char unk0[0x151];
|
||||||
{
|
weather w;
|
||||||
}
|
|
||||||
|
void load(const buffer &b);
|
||||||
};
|
};
|
||||||
|
|
||||||
// todo
|
|
||||||
struct orgrel_segment : public segment
|
struct orgrel_segment : public segment
|
||||||
{
|
{
|
||||||
struct org_rep
|
struct org_rep
|
||||||
{
|
{
|
||||||
char unk1[0xE0];
|
char unk0[0x8];
|
||||||
|
bool unk1;
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
READ(b, unk1);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<org_rep> org_reps;
|
std::vector<org_rep> org_reps;
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
b.read_vector(org_reps);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct others_segment : public segment
|
struct others_segment : public segment
|
||||||
|
|
@ -359,11 +317,7 @@ struct others_segment : public segment
|
||||||
uint32_t unk0;
|
uint32_t unk0;
|
||||||
uint32_t unk1;
|
uint32_t unk1;
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
READ(b, unk0);
|
|
||||||
READ(b, unk1);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct mech_segment : public segment
|
struct mech_segment : public segment
|
||||||
|
|
@ -375,13 +329,7 @@ struct mech_segment : public segment
|
||||||
uint32_t unk0;
|
uint32_t unk0;
|
||||||
uint32_t unk1;
|
uint32_t unk1;
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
READ(b, id);
|
|
||||||
READ_STRING(b, name);
|
|
||||||
READ(b, unk0);
|
|
||||||
READ(b, unk1);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct moddable_equipment
|
struct moddable_equipment
|
||||||
|
|
@ -389,11 +337,7 @@ struct mech_segment : public segment
|
||||||
std::string name;
|
std::string name;
|
||||||
ModificatorMask mask;
|
ModificatorMask mask;
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
READ_STRING(b, name);
|
|
||||||
READ(b, mask);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct moddable_equipment2
|
struct moddable_equipment2
|
||||||
|
|
@ -403,13 +347,7 @@ struct mech_segment : public segment
|
||||||
uint32_t unk0; // health?
|
uint32_t unk0; // health?
|
||||||
ModificatorMask mask;
|
ModificatorMask mask;
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
READ(b, id);
|
|
||||||
READ_STRING(b, name);
|
|
||||||
READ(b, unk0);
|
|
||||||
READ(b, mask);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct hold_item
|
struct hold_item
|
||||||
|
|
@ -426,24 +364,14 @@ struct mech_segment : public segment
|
||||||
uint32_t unk0;
|
uint32_t unk0;
|
||||||
uint32_t unk1;
|
uint32_t unk1;
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
READ(b, type);
|
|
||||||
READ_STRING(b, name);
|
|
||||||
READ(b, count);
|
|
||||||
READ(b, unk0);
|
|
||||||
READ(b, unk1);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ammo
|
struct ammo
|
||||||
{
|
{
|
||||||
std::string name;
|
std::string name;
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
READ_STRING(b, name);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ammo_count
|
struct ammo_count
|
||||||
|
|
@ -451,11 +379,7 @@ struct mech_segment : public segment
|
||||||
std::string name;
|
std::string name;
|
||||||
uint32_t count;
|
uint32_t count;
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
READ_STRING(b, name);
|
|
||||||
READ(b, count);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class MechFlags : uint32_t
|
enum class MechFlags : uint32_t
|
||||||
|
|
@ -534,159 +458,14 @@ struct mech_segment : public segment
|
||||||
uint32_t g_unk9 = 0;
|
uint32_t g_unk9 = 0;
|
||||||
uint8_t g_unk10 = 0;
|
uint8_t g_unk10 = 0;
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
READ(b, id);
|
|
||||||
READ_STRING(b, name);
|
|
||||||
READ_STRING(b, name2);
|
|
||||||
READ_STRING(b, org);
|
|
||||||
save_changes.rewrite_mech_org(b, org);
|
|
||||||
READ_STRING(b, building);
|
|
||||||
|
|
||||||
READ(b, flags);
|
bool isPlayer() const;
|
||||||
READ(b, unk11);
|
|
||||||
READ(b, unk12);
|
|
||||||
READ(b, unk13);
|
|
||||||
READ(b, unk14);
|
|
||||||
|
|
||||||
auto f = (uint32_t)flags;
|
|
||||||
if (!(f == 0x01000101 ||
|
|
||||||
f == 0x00000001 ||
|
|
||||||
f == 0x00000101 ||
|
|
||||||
f == 0x01000001))
|
|
||||||
{
|
|
||||||
READ(b, unk16);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
READ(b, unk15);
|
|
||||||
|
|
||||||
if (unk14 == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
READ(b, unk15_1); // size?
|
|
||||||
|
|
||||||
b.read_vector(equipments);
|
|
||||||
|
|
||||||
READ(b, unk40);
|
|
||||||
READ(b, unk4);
|
|
||||||
|
|
||||||
//
|
|
||||||
glider.load(b);
|
|
||||||
if (isPlayer())
|
|
||||||
save_changes.rewrite_upgrade_equ_for_player(b, 0x1666);
|
|
||||||
weapon1.load(b);
|
|
||||||
if (isPlayer())
|
|
||||||
save_changes.rewrite_upgrade_equ_for_player(b, 0x2666);
|
|
||||||
weapon2.load(b);
|
|
||||||
if (isPlayer())
|
|
||||||
save_changes.rewrite_upgrade_equ_for_player(b, 0x2666);
|
|
||||||
reactor1.load(b);
|
|
||||||
reactor2.load(b);
|
|
||||||
engine1.load(b);
|
|
||||||
engine2.load(b);
|
|
||||||
energy_shield.load(b);
|
|
||||||
armor.load(b);
|
|
||||||
|
|
||||||
// ?
|
|
||||||
READ(b, g_unk0);
|
|
||||||
if (g_unk0 == 0)
|
|
||||||
READ(b, g_unk1);
|
|
||||||
READ(b, g_unk2);
|
|
||||||
|
|
||||||
if (g_unk0 == 0)
|
|
||||||
b.read_vector(ammos, g_unk1);
|
|
||||||
|
|
||||||
b.read_vector(ammos1, g_unk0);
|
|
||||||
|
|
||||||
if (g_unk0 != 0 || g_unk1 != 0)
|
|
||||||
{
|
|
||||||
READ(b, g_unk3);
|
|
||||||
if (g_unk0 > 0)
|
|
||||||
{
|
|
||||||
uint32_t n;
|
|
||||||
b.skip(-8);
|
|
||||||
READ(b, n);
|
|
||||||
b.skip(4);
|
|
||||||
b.read_vector(ammos2, n);
|
|
||||||
std::vector<single_int<>> v;
|
|
||||||
b.read_vector(v, n);
|
|
||||||
}
|
|
||||||
if (g_unk1 > 0)
|
|
||||||
{
|
|
||||||
g_unk1--;
|
|
||||||
while (g_unk1--)
|
|
||||||
READ(b, g_unk3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ureactor1.load(b);
|
|
||||||
if (isPlayer())
|
|
||||||
save_changes.rewrite_upgrade_equ_for_player(b, 0x3666);
|
|
||||||
ureactor2.load(b);
|
|
||||||
if (isPlayer())
|
|
||||||
save_changes.rewrite_upgrade_equ_for_player(b, 0x3666);
|
|
||||||
uengine1.load(b);
|
|
||||||
if (isPlayer())
|
|
||||||
save_changes.rewrite_upgrade_equ_for_player(b, 0x4666);
|
|
||||||
uengine2.load(b);
|
|
||||||
if (isPlayer())
|
|
||||||
save_changes.rewrite_upgrade_equ_for_player(b, 0x4666);
|
|
||||||
uenergy_shield.load(b);
|
|
||||||
if (isPlayer())
|
|
||||||
save_changes.rewrite_upgrade_equ_for_player(b, 0x5666);
|
|
||||||
uarmor.load(b);
|
|
||||||
|
|
||||||
g_unk4.load(b);
|
|
||||||
|
|
||||||
READ(b, glider_mask);
|
|
||||||
if (isPlayer())
|
|
||||||
save_changes.rewrite_upgrade_equ_for_player(b, 0x1666);
|
|
||||||
|
|
||||||
b.read_vector(ammos3);
|
|
||||||
|
|
||||||
READ(b, money);
|
|
||||||
if (name == "PLAYER")
|
|
||||||
save_changes.rewrite_money(b);
|
|
||||||
|
|
||||||
b.read_vector(items);
|
|
||||||
|
|
||||||
READ(b, g_unk6);
|
|
||||||
|
|
||||||
// TODO
|
|
||||||
|
|
||||||
//if (g_unk0 == 1)
|
|
||||||
//if ((uint32_t)g_unk2 == 15)
|
|
||||||
//if ((uint32_t)g_unk3 == 0)
|
|
||||||
//if (unk13[0] == 5)
|
|
||||||
if (g_unk6[26][0] != 0 &&
|
|
||||||
strcmp((const char *)b.getPtr(), "GROUPS") != 0)
|
|
||||||
{
|
|
||||||
|
|
||||||
READ(b, g_unk7);
|
|
||||||
/*if (g_unk7 != 0)
|
|
||||||
{
|
|
||||||
b.skip(-4);
|
|
||||||
return;
|
|
||||||
}*/
|
|
||||||
READ(b, g_unk8);
|
|
||||||
READ(b, g_unk9);
|
|
||||||
READ(b, g_unk10);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isPlayer() const
|
|
||||||
{
|
|
||||||
return name == "PLAYER";
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<mech> mechs;
|
std::vector<mech> mechs;
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
b.read_vector(mechs);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// todo
|
// todo
|
||||||
|
|
@ -700,14 +479,7 @@ struct groups_segment : public segment
|
||||||
uint32_t unk2[2];
|
uint32_t unk2[2];
|
||||||
float unk3;
|
float unk3;
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
READ_STRING(b, name);
|
|
||||||
READ(b, unk0);
|
|
||||||
READ(b, unk1);
|
|
||||||
READ(b, unk2);
|
|
||||||
READ(b, unk3);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct group
|
struct group
|
||||||
|
|
@ -715,28 +487,15 @@ struct groups_segment : public segment
|
||||||
vector3f pos;
|
vector3f pos;
|
||||||
std::string org;
|
std::string org;
|
||||||
std::string base;
|
std::string base;
|
||||||
float unk0[4];
|
|
||||||
uint16_t unk1;
|
|
||||||
|
|
||||||
std::vector<mech> mechs;
|
std::vector<mech> mechs;
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
READ(b, pos);
|
|
||||||
READ_STRING(b, org);
|
|
||||||
READ_STRING(b, base);
|
|
||||||
READ(b, unk0);
|
|
||||||
READ(b, unk1);
|
|
||||||
b.read_vector(mechs);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<group> groups;
|
std::vector<group> groups;
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
b.read_vector(groups);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct orgdata_segment : public segment
|
struct orgdata_segment : public segment
|
||||||
|
|
@ -745,10 +504,7 @@ struct orgdata_segment : public segment
|
||||||
{
|
{
|
||||||
std::vector<single_string> names;
|
std::vector<single_string> names;
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
b.read_vector(names);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct orgdata
|
struct orgdata
|
||||||
|
|
@ -760,23 +516,12 @@ struct orgdata_segment : public segment
|
||||||
float rep[50];
|
float rep[50];
|
||||||
std::vector<org_config> configs;
|
std::vector<org_config> configs;
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
READ(b, unk0);
|
|
||||||
READ_STRING(b, org);
|
|
||||||
READ(b, unk1);
|
|
||||||
READ(b, unk2);
|
|
||||||
READ(b, rep);
|
|
||||||
b.read_vector(configs, 3);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<orgdata> orgdatas;
|
std::vector<orgdata> orgdatas;
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
b.read_vector(orgdatas);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct builds_segment : public segment
|
struct builds_segment : public segment
|
||||||
|
|
@ -787,20 +532,12 @@ struct builds_segment : public segment
|
||||||
std::string org;
|
std::string org;
|
||||||
float unk1;
|
float unk1;
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
READ_STRING(b, bld);
|
|
||||||
READ_STRING(b, org);
|
|
||||||
READ(b, unk1);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<build> builds;
|
std::vector<build> builds;
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
b.read_vector(builds);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// todo
|
// todo
|
||||||
|
|
@ -808,17 +545,12 @@ struct orgs_segment : public segment
|
||||||
{
|
{
|
||||||
struct org
|
struct org
|
||||||
{
|
{
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<org> orgs;
|
std::vector<org> orgs;
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
b.read_vector(orgs);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct tradeeqp_segment : public segment
|
struct tradeeqp_segment : public segment
|
||||||
|
|
@ -832,15 +564,7 @@ struct tradeeqp_segment : public segment
|
||||||
int32_t count;
|
int32_t count;
|
||||||
float probability;
|
float probability;
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
READ_STRING(b, tov_name);
|
|
||||||
READ(b, unk0);
|
|
||||||
READ(b, mask);
|
|
||||||
READ(b, price);
|
|
||||||
READ(b, count);
|
|
||||||
READ(b, probability);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct bld
|
struct bld
|
||||||
|
|
@ -848,23 +572,14 @@ struct tradeeqp_segment : public segment
|
||||||
std::string name;
|
std::string name;
|
||||||
std::vector<Good> prices;
|
std::vector<Good> prices;
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
READ_STRING(b, name);
|
|
||||||
b.read_vector(prices);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
uint32_t unk0 = 0;
|
uint32_t unk0 = 0;
|
||||||
std::vector<Good> prices;
|
std::vector<Good> prices;
|
||||||
std::vector<bld> blds;
|
std::vector<bld> blds;
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
READ(b, unk0);
|
|
||||||
b.read_vector(prices);
|
|
||||||
b.read_vector(blds);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// todo
|
// todo
|
||||||
|
|
@ -876,30 +591,20 @@ struct objects_segment : public segment
|
||||||
uint32_t unk0[26];
|
uint32_t unk0[26];
|
||||||
uint16_t unk1;
|
uint16_t unk1;
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
READ_STRING(b, name);
|
|
||||||
READ(b, unk0);
|
|
||||||
READ(b, unk1);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<base> bases;
|
std::vector<base> bases;
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
b.read_vector(bases);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// what is mms?
|
||||||
struct mms_state_segment : public segment
|
struct mms_state_segment : public segment
|
||||||
{
|
{
|
||||||
std::string name;
|
std::string name;
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
READ_STRING(b, name);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// todo
|
// todo
|
||||||
|
|
@ -907,38 +612,26 @@ struct mms_c_config_segment : public segment
|
||||||
{
|
{
|
||||||
struct object
|
struct object
|
||||||
{
|
{
|
||||||
void load(const buffer &b)
|
void load(const buffer &b) {}
|
||||||
{
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<object> objects;
|
std::vector<object> objects;
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
// todo: insert config read from mech
|
|
||||||
b.read_vector(objects);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct mms_world_data_segment : public segment
|
struct mms_world_data_segment : public segment
|
||||||
{
|
{
|
||||||
float unk0;
|
float unk0;
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
READ(b, unk0);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct mainmech_segment : public segment
|
struct mainmech_segment : public segment
|
||||||
{
|
{
|
||||||
uint32_t unk0[9];
|
uint32_t unk0[9];
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
READ(b, unk0);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct segment_desc
|
struct segment_desc
|
||||||
|
|
@ -946,82 +639,14 @@ struct segment_desc
|
||||||
std::string name;
|
std::string name;
|
||||||
segment *seg = nullptr;
|
segment *seg = nullptr;
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
READ_STRING(b, name);
|
|
||||||
uint32_t unk0;
|
|
||||||
READ(b, unk0);
|
|
||||||
uint32_t len;
|
|
||||||
READ(b, len);
|
|
||||||
uint32_t offset;
|
|
||||||
READ(b, offset);
|
|
||||||
uint32_t unk1;
|
|
||||||
READ(b, unk1);
|
|
||||||
uint32_t len2;
|
|
||||||
READ(b, len2);
|
|
||||||
|
|
||||||
uint32_t start = b.index();
|
|
||||||
uint32_t end = start + len2;
|
|
||||||
|
|
||||||
#define SWITCH(s, t) if (name == s) seg = new t
|
|
||||||
#define CASE(s, t) else SWITCH(s, t)
|
|
||||||
#define DEFAULT else
|
|
||||||
|
|
||||||
SWITCH("HEADER", header_segment);
|
|
||||||
CASE("CAPTION", string_segment);
|
|
||||||
CASE("PLAYER", string_segment);
|
|
||||||
CASE("SCREEN", screen_segment);
|
|
||||||
CASE("SCRIPTS", scripts_segment);
|
|
||||||
//CASE("RADAR", radar_segment);
|
|
||||||
//CASE("GAMEDATA", gamedata_segment);
|
|
||||||
CASE("QUESTLOG", questlog_segment);
|
|
||||||
CASE("TRADE", trade_segment);
|
|
||||||
//CASE("ENV", env_segment);
|
|
||||||
//CASE("ORGREL", orgrel_segment);
|
|
||||||
CASE("OTHERS", others_segment);
|
|
||||||
CASE("MECH", mech_segment);
|
|
||||||
//CASE("GROUPS", groups_segment);
|
|
||||||
CASE("ORGDATA", orgdata_segment);
|
|
||||||
CASE("BUILDS", builds_segment);
|
|
||||||
//CASE("ORGS", orgs_segment);
|
|
||||||
CASE("TRADEEQP", tradeeqp_segment);
|
|
||||||
//CASE("OBJECTS", objects_segment);
|
|
||||||
CASE("MMS_STATE", mms_state_segment);
|
|
||||||
//CASE("MMS_C_CONFIG", mms_c_config_segment); // (my) clan config
|
|
||||||
CASE("MMS_WORLD_DATA", mms_world_data_segment);
|
|
||||||
CASE("MAINMECH", mainmech_segment);
|
|
||||||
DEFAULT
|
|
||||||
{
|
|
||||||
std::cout << "skipped " << name << " size = " << len2 << "\n";
|
|
||||||
b.skip(len2);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
seg->load(b);
|
|
||||||
|
|
||||||
#undef SWITCH
|
|
||||||
#undef CASE
|
|
||||||
#undef DEFAULT
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct save
|
struct save
|
||||||
{
|
{
|
||||||
uint32_t magick;
|
uint32_t magic;
|
||||||
uint32_t version;
|
uint32_t version;
|
||||||
std::vector<segment_desc> segments;
|
std::vector<segment_desc> segments;
|
||||||
|
|
||||||
void load(const buffer &b)
|
void load(const buffer &b);
|
||||||
{
|
|
||||||
READ(b, magick);
|
|
||||||
READ(b, version);
|
|
||||||
|
|
||||||
while (!b.eof())
|
|
||||||
{
|
|
||||||
segment_desc sd;
|
|
||||||
sd.load(b);
|
|
||||||
if (sd.seg)
|
|
||||||
segments.push_back(sd);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,8 @@
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
// for aim2 1.4.30
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
cl::opt<path> p(cl::Positional, cl::desc("<file.sav or saves dir>"), cl::Required);
|
cl::opt<path> p(cl::Positional, cl::desc("<file.sav or saves dir>"), cl::Required);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue