mirror of
https://github.com/aimrebirth/tools.git
synced 2026-04-14 17:33:25 +00:00
Update.
This commit is contained in:
parent
400e66d4a1
commit
06b39b9881
3 changed files with 177 additions and 19 deletions
|
|
@ -207,6 +207,7 @@ int main(int argc, char *argv[]) {
|
||||||
// patch note dev: give powerful glider based on FLASH
|
// patch note dev: give powerful glider based on FLASH
|
||||||
db["Глайдеры"]["GL_M4_S_TEST"] = db["Глайдеры"]["GL_M4_S_FIRST2"];
|
db["Глайдеры"]["GL_M4_S_TEST"] = db["Глайдеры"]["GL_M4_S_FIRST2"];
|
||||||
db["Глайдеры"]["GL_M4_S_TEST"]["MAXWEIGHT"] = 1'000'000.f;
|
db["Глайдеры"]["GL_M4_S_TEST"]["MAXWEIGHT"] = 1'000'000.f;
|
||||||
|
db["Глайдеры"]["GL_M4_S_TEST"]["ROTATESPEED"] = 75.f;
|
||||||
db["Конфигурации"]["CFG_STARTUP"]["GLIDER"] = "GL_M4_S_TEST";
|
db["Конфигурации"]["CFG_STARTUP"]["GLIDER"] = "GL_M4_S_TEST";
|
||||||
// patch note dev: give powerful reactor
|
// patch note dev: give powerful reactor
|
||||||
add_test_eqp("REACTOR", "EQP_GLUON_REACTOR_S1", 9'000'000.f);
|
add_test_eqp("REACTOR", "EQP_GLUON_REACTOR_S1", 9'000'000.f);
|
||||||
|
|
@ -226,6 +227,11 @@ int main(int argc, char *argv[]) {
|
||||||
db["Оружие"]["GUN_IMPULSE_MEGALAZER_TEST"]["DAMAGE"] = 40000.f;
|
db["Оружие"]["GUN_IMPULSE_MEGALAZER_TEST"]["DAMAGE"] = 40000.f;
|
||||||
db["Оружие"]["GUN_IMPULSE_MEGALAZER_TEST"]["STANDARD"] = 1;
|
db["Оружие"]["GUN_IMPULSE_MEGALAZER_TEST"]["STANDARD"] = 1;
|
||||||
db["Конфигурации"]["CFG_STARTUP"]["HEAVYGUN1"] = "GUN_IMPULSE_MEGALAZER_TEST";
|
db["Конфигурации"]["CFG_STARTUP"]["HEAVYGUN1"] = "GUN_IMPULSE_MEGALAZER_TEST";
|
||||||
|
//
|
||||||
|
db["Конфигурации"]["CFG_STARTUP"]["EQP_ANALYZER"] = 1;
|
||||||
|
db["Конфигурации"]["CFG_STARTUP"]["EQP_QUANTUM_TRANSLATOR"] = 1;
|
||||||
|
db["Конфигурации"]["CFG_STARTUP"]["EQP_INVISIBILITY_SHIELD"] = 1;
|
||||||
|
db["Конфигурации"]["CFG_STARTUP"]["EQP_UNIVERSAL_SHIELD"] = 1;
|
||||||
// end of db changes in dev mode
|
// end of db changes in dev mode
|
||||||
// patch note dev: allow to buy GL_S3_PS_FINDER1 without pre-quest
|
// patch note dev: allow to buy GL_S3_PS_FINDER1 without pre-quest
|
||||||
mod.add_map_good("location6.mmo", "B_L6_IK_FINDER", "GL_S3_PS_FINDER1", mmo_storage2::map_good("GL_S3_PS_FINDER1"));
|
mod.add_map_good("location6.mmo", "B_L6_IK_FINDER", "GL_S3_PS_FINDER1", mmo_storage2::map_good("GL_S3_PS_FINDER1"));
|
||||||
|
|
@ -262,19 +268,39 @@ int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
//
|
//
|
||||||
mod.clone_mechmind_group("location1.mmo", "MINVACH-6", "MINVACH-666");
|
mod.clone_mechmind_group("location1.mmo", "MINVACH-6", "MINVACH-666");
|
||||||
mod.update_mechmind_group_configurations("location1.mmo", "MINVACH-666",
|
auto cfg = "CFG_TEST";
|
||||||
"CFG_INVADER_1",
|
db["Конфигурации"][cfg] = db["Конфигурации"]["CFG_STARTUP"];
|
||||||
"CFG_INVADER_1",
|
db["Конфигурации"][cfg]["ENGINE"] = "EQP_VACUUM_DRIVE_S4";
|
||||||
"CFG_INVADER_1",
|
auto make = [&](auto name, int road) {
|
||||||
"CFG_INVADER_1",
|
mod.clone_mechmind_group("location1.mmo", "MINVACH-6", name);
|
||||||
"CFG_INVADER_1",
|
mod.update_mechmind_group_configurations("location1.mmo", name, cfg);
|
||||||
"CFG_INVADER_1",
|
mod.set_mechmind_group_type("location1.mmo", name, 1, road);
|
||||||
"CFG_INVADER_1",
|
};
|
||||||
"CFG_INVADER_1",
|
for (int i = 0; i < 20; ++i) {
|
||||||
"CFG_INVADER_1",
|
make(std::format("MINVACH-6{}", i), 1000 / 20 * i + 20);
|
||||||
"CFG_INVADER_1"
|
}
|
||||||
);
|
/*mod.update_mechmind_group_configurations("location1.mmo", "MINVACH-666",
|
||||||
mod.set_mechmind_organization("location1.mmo", "MINVACH-666", "ORG_PLAYER");
|
cfg,
|
||||||
|
cfg,
|
||||||
|
cfg,
|
||||||
|
cfg,
|
||||||
|
cfg,
|
||||||
|
|
||||||
|
cfg,
|
||||||
|
cfg,
|
||||||
|
cfg,
|
||||||
|
cfg,
|
||||||
|
cfg
|
||||||
|
);*/
|
||||||
|
//mod.set_mechmind_group_organization("location1.mmo", "MINVACH-666", "ORG_PLAYER");
|
||||||
|
//mod.set_mechmind_group_type("location1.mmo", "MINVACH-666", 1);
|
||||||
|
/*mod.hide_mechmind_group("location1.mmo", "MINVACH-666");
|
||||||
|
mod.delete_mechmind_group("location1.mmo", "MINVACH-6");
|
||||||
|
for (auto &&[n,_] : mod.get_mmo_storage("location1.mmo").mechs) {
|
||||||
|
if (n != "SHUN-2") {
|
||||||
|
mod.delete_mechmind_group("location1.mmo", n);
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
|
||||||
// does not work, crashes. Maybe different item size
|
// does not work, crashes. Maybe different item size
|
||||||
// or maybe too many goods
|
// or maybe too many goods
|
||||||
|
|
@ -313,10 +339,10 @@ int main(int argc, char *argv[]) {
|
||||||
//_ADDOBJECT(GUN_RAILGUN)
|
//_ADDOBJECT(GUN_RAILGUN)
|
||||||
//_ADDOBJECT(GUN_IMPULSE_MEGALAZER)
|
//_ADDOBJECT(GUN_IMPULSE_MEGALAZER)
|
||||||
|
|
||||||
_ADDOBJECT(EQP_ANALYZER)
|
//_ADDOBJECT(EQP_ANALYZER)
|
||||||
_ADDOBJECT(EQP_QUANTUM_TRANSLATOR)
|
//_ADDOBJECT(EQP_QUANTUM_TRANSLATOR)
|
||||||
_ADDOBJECT(EQP_INVISIBILITY_SHIELD)
|
//_ADDOBJECT(EQP_INVISIBILITY_SHIELD)
|
||||||
_ADDOBJECT(EQP_UNIVERSAL_SHIELD)
|
//_ADDOBJECT(EQP_UNIVERSAL_SHIELD)
|
||||||
|
|
||||||
_ADDRATING(300000000)
|
_ADDRATING(300000000)
|
||||||
_ADDBALANCE(30000000)
|
_ADDBALANCE(30000000)
|
||||||
|
|
@ -346,6 +372,11 @@ int main(int argc, char *argv[]) {
|
||||||
//_INFO(SECTOR9_TEST)
|
//_INFO(SECTOR9_TEST)
|
||||||
//_INFO(SECTOR10_TEST)
|
//_INFO(SECTOR10_TEST)
|
||||||
)");
|
)");
|
||||||
|
//mod.copy_sector_from_aim1(2, 2);
|
||||||
|
//quest["ru_RU"]["INFORMATION"]["SECTOR2_TEST"]["NAME"] = "test";
|
||||||
|
//quest["ru_RU"]["INFORMATION"]["SECTOR2_TEST"]["TEXT"] = "<link: войти 2=LINKJUMPTO location2.mmp>";
|
||||||
|
//mod.copy_sector_from_aim1(1, 1);
|
||||||
|
//mod.copy_sector_from_aim1(2, 2);
|
||||||
/*mod.copy_sector_from_aim1(1, 3);
|
/*mod.copy_sector_from_aim1(1, 3);
|
||||||
mod.copy_sector_from_aim1(1);
|
mod.copy_sector_from_aim1(1);
|
||||||
mod.copy_sector_from_aim1(2);
|
mod.copy_sector_from_aim1(2);
|
||||||
|
|
|
||||||
|
|
@ -475,7 +475,52 @@ struct mod_maker {
|
||||||
// increase number of goods
|
// increase number of goods
|
||||||
++*(uint32_t *)(f.p + it->second.offset);
|
++*(uint32_t *)(f.p + it->second.offset);
|
||||||
}
|
}
|
||||||
|
auto get_mmo_storage(path mmo_fn) {
|
||||||
|
auto fn = find_real_filename(mmo_fn);
|
||||||
|
mmo_storage2 m{fn};
|
||||||
|
m.load();
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
void hide_mechmind_group(path mmo_fn, const std::string &name) {
|
||||||
|
log("hiding mechmind group {} in loc {}", name, mmo_fn.string());
|
||||||
|
|
||||||
|
auto fn = find_real_filename(mmo_fn);
|
||||||
|
files_to_pak.insert(fn);
|
||||||
|
|
||||||
|
mmo_storage2 m{fn};
|
||||||
|
m.load();
|
||||||
|
|
||||||
|
auto it = m.mechs.find(name);
|
||||||
|
if (it == m.mechs.end()) {
|
||||||
|
throw std::runtime_error{"no such mechmind or group: " + name};
|
||||||
|
}
|
||||||
|
primitives::templates2::mmap_file<uint8_t> f{fn, primitives::templates2::mmap_file<uint8_t>::rw{}};
|
||||||
|
auto n = *(uint32_t*)(f.p + it->second.n_mechs_offset);
|
||||||
|
auto &hidden = *(uint8_t*)(f.p + it->second.mechs_offset + n * 0x20);
|
||||||
|
hidden = 1;
|
||||||
|
}
|
||||||
|
void delete_mechmind_group(path mmo_fn, const std::string &name) {
|
||||||
|
log("deleting mechmind group {} in loc {}", name, mmo_fn.string());
|
||||||
|
|
||||||
|
auto fn = find_real_filename(mmo_fn);
|
||||||
|
files_to_pak.insert(fn);
|
||||||
|
|
||||||
|
mmo_storage2 m{fn};
|
||||||
|
m.load();
|
||||||
|
|
||||||
|
auto it = m.mechs.find(name);
|
||||||
|
if (it == m.mechs.end()) {
|
||||||
|
throw std::runtime_error{"no such mechmind or group: " + name};
|
||||||
|
}
|
||||||
|
primitives::templates2::mmap_file<uint8_t> f{fn, primitives::templates2::mmap_file<uint8_t>::rw{}};
|
||||||
|
auto &n = *(uint32_t*)(f.p + m.n_mech_groups_offset);
|
||||||
|
--n;
|
||||||
|
f.close();
|
||||||
|
bin_patcher::erase(fn, it->second.offset, it->second.size);
|
||||||
|
}
|
||||||
void clone_mechmind_group(path mmo_fn, const std::string &name, const std::string &newname) {
|
void clone_mechmind_group(path mmo_fn, const std::string &name, const std::string &newname) {
|
||||||
|
log("cloninig mechmind group {} in loc {}, new name {}", name, mmo_fn.string(), newname);
|
||||||
|
|
||||||
auto fn = find_real_filename(mmo_fn);
|
auto fn = find_real_filename(mmo_fn);
|
||||||
files_to_pak.insert(fn);
|
files_to_pak.insert(fn);
|
||||||
|
|
||||||
|
|
@ -498,6 +543,12 @@ struct mod_maker {
|
||||||
bin_patcher::insert(fn, m.mech_groups_offset, data);
|
bin_patcher::insert(fn, m.mech_groups_offset, data);
|
||||||
}
|
}
|
||||||
bool set_mechmind_organization(path mmo_fn, const std::string &name, const std::string &orgname) {
|
bool set_mechmind_organization(path mmo_fn, const std::string &name, const std::string &orgname) {
|
||||||
|
// deprecated, for api stability
|
||||||
|
return set_mechmind_group_organization(mmo_fn, name, orgname);
|
||||||
|
}
|
||||||
|
bool set_mechmind_group_organization(path mmo_fn, const std::string &name, const std::string &orgname) {
|
||||||
|
log("setting mechmind group {} organization {} in loc {}", name, orgname, mmo_fn.string());
|
||||||
|
|
||||||
auto fn = find_real_filename(mmo_fn);
|
auto fn = find_real_filename(mmo_fn);
|
||||||
files_to_pak.insert(fn);
|
files_to_pak.insert(fn);
|
||||||
|
|
||||||
|
|
@ -515,7 +566,32 @@ struct mod_maker {
|
||||||
memcpy(f.p + it->second.name_offset + 0x20, orgname.data(), orgname.size() + 1);
|
memcpy(f.p + it->second.name_offset + 0x20, orgname.data(), orgname.size() + 1);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
void set_mechmind_group_type(path mmo_fn, const std::string &name, int newtype, int new_road_id = 100) {
|
||||||
|
log("setting mechmind group {} in loc {} to {}", name, mmo_fn.string(), newtype);
|
||||||
|
|
||||||
|
auto fn = find_real_filename(mmo_fn);
|
||||||
|
files_to_pak.insert(fn);
|
||||||
|
|
||||||
|
mmo_storage2 m{fn};
|
||||||
|
m.load();
|
||||||
|
|
||||||
|
auto it = m.mechs.find(name);
|
||||||
|
if (it == m.mechs.end()) {
|
||||||
|
throw std::runtime_error{"no such mechmind or group: " + name};
|
||||||
|
}
|
||||||
|
primitives::templates2::mmap_file<uint8_t> f{fn, primitives::templates2::mmap_file<uint8_t>::rw{}};
|
||||||
|
auto &type = *(uint32_t*)(f.p + it->second.offset + 0x20 + 0x20);
|
||||||
|
type = newtype;
|
||||||
|
auto &road_id = *(uint32_t*)(f.p + it->second.post_comment_offset);
|
||||||
|
road_id = new_road_id;
|
||||||
|
if (newtype == 1) {
|
||||||
|
auto &unk = *(float*)(f.p + it->second.post_comment_offset + 4);
|
||||||
|
unk = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
bool rename_mechmind_group(path mmo_fn, const std::string &name, const std::string &newname) {
|
bool rename_mechmind_group(path mmo_fn, const std::string &name, const std::string &newname) {
|
||||||
|
log("renaming mechmind group {} in loc {} to {}", name, mmo_fn.string(), newname);
|
||||||
|
|
||||||
auto fn = find_real_filename(mmo_fn);
|
auto fn = find_real_filename(mmo_fn);
|
||||||
files_to_pak.insert(fn);
|
files_to_pak.insert(fn);
|
||||||
|
|
||||||
|
|
@ -534,6 +610,14 @@ struct mod_maker {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
void update_mechmind_group_configurations(path mmo_fn, const std::string &name, auto &&cfg, auto &&...cfgs) {
|
void update_mechmind_group_configurations(path mmo_fn, const std::string &name, auto &&cfg, auto &&...cfgs) {
|
||||||
|
std::string format;
|
||||||
|
auto addname = [&](const std::string &cfg) {
|
||||||
|
format += cfg + ",";
|
||||||
|
};
|
||||||
|
addname(cfg);
|
||||||
|
(addname(cfgs),...);
|
||||||
|
log("updating mechmind group {} configurations in loc {} to {}", name, mmo_fn.string(), format);
|
||||||
|
|
||||||
auto fn = find_real_filename(mmo_fn);
|
auto fn = find_real_filename(mmo_fn);
|
||||||
files_to_pak.insert(fn);
|
files_to_pak.insert(fn);
|
||||||
|
|
||||||
|
|
@ -818,8 +902,11 @@ struct mod_maker {
|
||||||
auto mmp = find_real_filename(from + ".mmp");
|
auto mmp = find_real_filename(from + ".mmp");
|
||||||
auto mmo = find_real_filename(from + ".mmo");
|
auto mmo = find_real_filename(from + ".mmo");
|
||||||
auto mmm = find_real_filename(from + ".mmm");
|
auto mmm = find_real_filename(from + ".mmm");
|
||||||
|
if (mmp != get_mod_dir() / (to + ".mmp"))
|
||||||
fs::copy_file(mmp, get_mod_dir() / (to + ".mmp"), fs::copy_options::update_existing);
|
fs::copy_file(mmp, get_mod_dir() / (to + ".mmp"), fs::copy_options::update_existing);
|
||||||
|
if (mmo != get_mod_dir() / (to + ".mmo"))
|
||||||
fs::copy_file(mmo, get_mod_dir() / (to + ".mmo"), fs::copy_options::update_existing);
|
fs::copy_file(mmo, get_mod_dir() / (to + ".mmo"), fs::copy_options::update_existing);
|
||||||
|
if (mmm != get_mod_dir() / (to + ".mmm"))
|
||||||
fs::copy_file(mmm, get_mod_dir() / (to + ".mmm"), fs::copy_options::update_existing);
|
fs::copy_file(mmm, get_mod_dir() / (to + ".mmm"), fs::copy_options::update_existing);
|
||||||
files_to_pak.insert(get_mod_dir() / (to + ".mmp"));
|
files_to_pak.insert(get_mod_dir() / (to + ".mmp"));
|
||||||
files_to_pak.insert(get_mod_dir() / (to + ".mmo"));
|
files_to_pak.insert(get_mod_dir() / (to + ".mmo"));
|
||||||
|
|
|
||||||
|
|
@ -62,6 +62,7 @@ struct mmo_storage2 {
|
||||||
uint32_t name_offset;
|
uint32_t name_offset;
|
||||||
uint32_t n_mechs_offset;
|
uint32_t n_mechs_offset;
|
||||||
uint32_t mechs_offset;
|
uint32_t mechs_offset;
|
||||||
|
uint32_t post_comment_offset;
|
||||||
uint32_t offset;
|
uint32_t offset;
|
||||||
uint32_t size;
|
uint32_t size;
|
||||||
};
|
};
|
||||||
|
|
@ -105,6 +106,7 @@ struct mmo_storage2 {
|
||||||
m.comment = o.comment;
|
m.comment = o.comment;
|
||||||
m.name_offset = (uint8_t*)o.name - f.p;
|
m.name_offset = (uint8_t*)o.name - f.p;
|
||||||
m.n_mechs_offset = (uint8_t*)&o.n_mechs - f.p;
|
m.n_mechs_offset = (uint8_t*)&o.n_mechs - f.p;
|
||||||
|
m.post_comment_offset = (uint8_t*)s.p - f.p;
|
||||||
|
|
||||||
if (strcmp(o.name, "MINVACH-6") == 0) {
|
if (strcmp(o.name, "MINVACH-6") == 0) {
|
||||||
int a = 5;
|
int a = 5;
|
||||||
|
|
@ -114,16 +116,46 @@ struct mmo_storage2 {
|
||||||
int a = 5;
|
int a = 5;
|
||||||
a++;
|
a++;
|
||||||
}
|
}
|
||||||
|
if (strcmp(o.name, "ETRANNA-1") == 0) {
|
||||||
|
int a = 5;
|
||||||
|
a++;
|
||||||
|
}
|
||||||
|
if (strcmp(o.name, "SHUN-2") == 0) {
|
||||||
|
int a = 5;
|
||||||
|
a++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// mech are spawned on random path when leaving the base
|
||||||
|
// probably far from player
|
||||||
|
//
|
||||||
|
// 0 = stationary
|
||||||
|
// 0 = CGuardMechGroup?
|
||||||
|
// 1 = roaming between bases (and trading?)
|
||||||
|
// 1 = CTransMechGroup!
|
||||||
|
// 2 = patrol? or roaming and killing?
|
||||||
|
// 2 = CHunterMechGroup!
|
||||||
|
// 3 = ? free mechs? spawn pos? flag? free roaming? always 0 except single ORG_FREE mob in location5
|
||||||
|
// 3 = CPeopleMechGroup
|
||||||
|
// 4 = ? platforms? spawn pos? probably only single appearence in the game - location2 GL_PLATFORM
|
||||||
|
// 4 = CGuardMechGroup?
|
||||||
switch (o.type) {
|
switch (o.type) {
|
||||||
case 0: // alive
|
case 0: // alive
|
||||||
case 1: {
|
{
|
||||||
uint32_t sector_id = s; // road id? or map sector id
|
uint32_t sector_id = s; // road id? or map sector id
|
||||||
float height = s; // height?
|
float height = s; // height?
|
||||||
|
|
||||||
int a = 5;
|
int a = 5;
|
||||||
a++;
|
a++;
|
||||||
} break;
|
} break;
|
||||||
|
case 1: {
|
||||||
|
uint32_t road_id = s; // road id? or map sector id
|
||||||
|
float unused_guessed = s; // height?
|
||||||
|
|
||||||
|
int a = 5;
|
||||||
|
a++;
|
||||||
|
} break;
|
||||||
|
// patrol? because transes have type '1'
|
||||||
|
// and seems pathes are generated ingame between bases
|
||||||
case 2: {
|
case 2: {
|
||||||
std::vector<uint32_t> t; // current path?
|
std::vector<uint32_t> t; // current path?
|
||||||
uint32_t len = s;
|
uint32_t len = s;
|
||||||
|
|
@ -132,9 +164,17 @@ struct mmo_storage2 {
|
||||||
} break;
|
} break;
|
||||||
case 3: // 3 = free mechanoids only?
|
case 3: // 3 = free mechanoids only?
|
||||||
{
|
{
|
||||||
|
// dead in other mech id?
|
||||||
|
// object id? base id?
|
||||||
|
uint32_t t = s; // other mech id?
|
||||||
|
if (t != 0) {
|
||||||
|
int a = 5;
|
||||||
|
a++;
|
||||||
|
}
|
||||||
|
|
||||||
int a = 5;
|
int a = 5;
|
||||||
a++;
|
a++;
|
||||||
}
|
} break;
|
||||||
case 4: {
|
case 4: {
|
||||||
// dead in other mech id?
|
// dead in other mech id?
|
||||||
// object id? base id?
|
// object id? base id?
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue