From 8954b11c95fff5fd70299b08fc277d97ca3add07 Mon Sep 17 00:00:00 2001 From: lzwdgc Date: Tue, 2 Apr 2024 14:38:24 +0300 Subject: [PATCH] [mod] Copy db data from aim2. --- examples/mods/aim1_community_fix/my_mod.cpp | 20 +++++-------- src/aim1_mod_maker/aim1_mod_maker.h | 31 ++++++++++++++++++++- 2 files changed, 37 insertions(+), 14 deletions(-) diff --git a/examples/mods/aim1_community_fix/my_mod.cpp b/examples/mods/aim1_community_fix/my_mod.cpp index 9c39d76..a625e6d 100644 --- a/examples/mods/aim1_community_fix/my_mod.cpp +++ b/examples/mods/aim1_community_fix/my_mod.cpp @@ -140,19 +140,13 @@ int main(int argc, char *argv[]) { auto db = mod.db(); // patch note: set glider GL_S3_PS_FINDER2 model to MOD_GL_S3_PS_FINDER2 (lz) db[u8"Глайдеры"]["GL_S3_PS_FINDER2"]["MODEL"] = "MOD_GL_S3_PS_FINDER2"; - // patch note: change MOD_GL_S3_PS_FINDER2 model radius to MOD_GL_S3_PS_FINDER1 radius (lz) - // TODO: copy from aim2 db - db[u8"Модели"]["MOD_GL_S3_PS_FINDER2"]["RADIUS"] = 4.768386f; // from aim2; - // - db[u8"Текстуры"]["TEX_GL_S3_PS_FINDER_2"]["TYPE"] = 0; - db[u8"Текстуры"]["TEX_GL_S3_PS_FINDER_2"]["COLOR"] = 406137896; - db[u8"Текстуры"]["TEX_GL_S3_PS_FINDER_2"]["FILENAME"] = "Data\\TM\\TEX_GL_S3_PS_FINDER_2.TM"; - db[u8"Текстуры"]["TEX_GL_S3_PS_FINDER_2_SPEC"]["TYPE"] = 0; - db[u8"Текстуры"]["TEX_GL_S3_PS_FINDER_2_SPEC"]["COLOR"] = 2631463; - db[u8"Текстуры"]["TEX_GL_S3_PS_FINDER_2_SPEC"]["FILENAME"] = "Data\\TM\\TEX_GL_S3_PS_FINDER_2_SPEC.TM"; - db[u8"Текстуры"]["TEX_GL_S3_PS_FINDER_2_SPEC_1"]["TYPE"] = 0; - db[u8"Текстуры"]["TEX_GL_S3_PS_FINDER_2_SPEC_1"]["COLOR"] = 1842204; - db[u8"Текстуры"]["TEX_GL_S3_PS_FINDER_2_SPEC_1"]["FILENAME"] = "Data\\TM\\TEX_GL_S3_PS_FINDER_2_SPEC_1.TM"; + // patch note - maybe copy from finder1?: change MOD_GL_S3_PS_FINDER2 model radius to MOD_GL_S3_PS_FINDER1 radius (lz) + // patch note: copy MOD_GL_S3_PS_FINDER2 model radius from aim2 (lz) + db.copy_from_aim2(u8"Модели", "MOD_GL_S3_PS_FINDER2", "RADIUS"); + // patch note: copy MOD_GL_S3_PS_FINDER2 textures from aim2 (lz) + db.copy_from_aim2(u8"Текстуры", "TEX_GL_S3_PS_FINDER_2"); + db.copy_from_aim2(u8"Текстуры", "TEX_GL_S3_PS_FINDER_2_SPEC"); + db.copy_from_aim2(u8"Текстуры", "TEX_GL_S3_PS_FINDER_2_SPEC_1"); // patch note: double gun for config CFG_NARGOON (double electro discharge) (lz) auto &tblcfg = db[u8"Конфигурации"]; tblcfg["CFG_NARGOON"]["HEAVYGUN1"] = "GUN_ELECTRO_DISCHARGER"; diff --git a/src/aim1_mod_maker/aim1_mod_maker.h b/src/aim1_mod_maker/aim1_mod_maker.h index b65de46..d0a29df 100644 --- a/src/aim1_mod_maker/aim1_mod_maker.h +++ b/src/aim1_mod_maker/aim1_mod_maker.h @@ -74,6 +74,7 @@ struct aim_exe_v1_06_constants { struct mod_maker { struct db_wrapper { db2::files::db2_internal m; + db2::files::db2_internal m2; path fn; int codepage{1251}; bool written{}; @@ -93,6 +94,27 @@ struct mod_maker { auto &operator[](this auto &&d, const std::u8string &s) { return d.m[(const char *)s.c_str()]; } + void copy_from_aim2(auto &&table_name, auto &&value_name, auto &&field_name) { + auto check_val = [](auto &&m, const std::string &key, auto &&err) { + if (auto it = m.find(key); it == m.end()) { + throw std::runtime_error{err}; + } + }; + check_val(m2.m, (const char *)table_name, "aim2: no such table"); + check_val(m2[table_name], value_name, "aim2: no such value"); + check_val(m2[table_name][value_name], field_name, "aim2: no such field"); + m[table_name][value_name][field_name] = m2[table_name][value_name][field_name]; + } + void copy_from_aim2(auto &&table_name, auto &&value_name) { + auto check_val = [](auto &&m, const std::string &key, auto &&err) { + if (auto it = m.find(key); it == m.end()) { + throw std::runtime_error{err}; + } + }; + check_val(m2.m, (const char *)table_name, "aim2: no such table"); + check_val(m2[table_name], value_name, "aim2: no such value"); + m[table_name][value_name] = m2[table_name][value_name]; + } }; enum class file_type { unknown, @@ -339,7 +361,11 @@ struct mod_maker { } auto db() { - return open_db("db", 1251); // always 1251 probably + auto w = open_db("db", 1251); // always 1251 probably + if (aim2_available()) { + w.m2 = db2{aim2_game_dir / "data" / "db", 1251}.open().to_map(); + } + return w; } auto quest(const std::string &language = {}) { // TODO: check if it's possible to use utf8/16 in aim game @@ -373,6 +399,9 @@ struct mod_maker { } private: + bool aim2_available() const { + return !aim2_game_dir.empty(); + } path make_bak_file(const path &fn) { auto backup = path{fn} += ".bak"; if (!fs::exists(backup)) {