diff --git a/examples/mods/aim1_community_fix/my_mod.cpp b/examples/mods/aim1_community_fix/my_mod.cpp
index 6e233e1..688c2dc 100644
--- a/examples/mods/aim1_community_fix/my_mod.cpp
+++ b/examples/mods/aim1_community_fix/my_mod.cpp
@@ -288,48 +288,30 @@ int main(int argc, char *argv[]) {
//mod.replace("under.scr", "_ADDSENSOR(T_L4_BASE_2)", "_ADDSENSOR(T_L4_BASE_2)\n_MARK(T_L4_BASE_2)");
//
- mod.clone_mech_group("location1.mmo", "MINVACH-6", "MINVACH-666");
+ /*mod.clone_mech_group("location1.mmo", "MINVACH-6", "MINVACH-666_1");
+ mod.clone_mech_group("location1.mmo", "MINVACH-6", "MINVACH-666_2");
+ mod.update_mech_group_configurations("location1.mmo", "MINVACH-666_1", "CFG_INVADER_1");
+ mod.update_mech_group_configurations("location1.mmo", "MINVACH-666_2", "CFG_INVADER_1", "CFG_TEST");
auto cfg = "CFG_TEST";
db["Конфигурации"][cfg] = db["Конфигурации"]["CFG_STARTUP"];
db["Конфигурации"][cfg]["ENGINE"] = "EQP_VACUUM_DRIVE_S4";
+ db["Конфигурации"][cfg]["RATING"] = "10";
auto make = [&](auto name, int road) {
mod.clone_mech_group("location1.mmo", "MINVACH-6", name);
mod.update_mech_group_configurations("location1.mmo", name, cfg);
mod.set_mech_group_type("location1.mmo", name, 1, road);
- };
+ };*/
for (int i = 0; i < 20; ++i) {
//make(std::format("MINVACH-6{}", i), 1000 / 20 * i + 20);
}
- auto &pol = mod.politics();
+ /*auto &pol = mod.politics();
pol["ORG_INVADERS"].aggressiveness = 1000;
pol["ORG_INVADERS"].authority = 1000;
pol["ORG_INVADERS"]["ORG_TRANSES"] = -1000;
pol["ORG_INVADERS"]["ORG_HUNTERS"] = -1000;
pol["ORG_INVADERS"]["ORG_FREE"] = -1000;
- pol["ORG_INVADERS"]["ORG_INVADERS"] = 1000;
+ pol["ORG_INVADERS"]["ORG_INVADERS"] = 1000;*/
//pol["ORG_INVADERS"]["ORG_PLAYER"] = 1000; // does not work
- /*mod.update_mechmind_group_configurations("location1.mmo", "MINVACH-666",
- 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
// or maybe too many goods
@@ -384,7 +366,7 @@ int main(int argc, char *argv[]) {
//_SETEVENT(SECTOR9.VISIT)
//_SETEVENT(SECTOR9.ACCESS)
- _INFO(SECTOR2_TEST)
+ //_INFO(SECTOR2_TEST)
//_INFO(SECTOR3_TEST)
//_INFO(SECTOR9_TEST)
//_INFO(SECTOR10_TEST)
@@ -401,9 +383,9 @@ int main(int argc, char *argv[]) {
)";
- //mod.copy_sector_from_aim1(1, 9);
- //mod.copy_sector_from_aim1(1, 10);
- //mod.copy_sector_from_aim1(1, 11);
+ //mod.copy_sector_from_aim1(1);
+ //mod.copy_sector_from_aim1(2);
+ //mod.copy_sector_from_aim1(3);
//quest["ru_RU"]["INFORMATION"]["SECTOR2_TEST"]["NAME"] = "test";
//quest["ru_RU"]["INFORMATION"]["SECTOR2_TEST"]["TEXT"] = "";
//mod.copy_sector_from_aim1(1, 1);
diff --git a/src/aim1_mod_maker/aim1_mod_maker.h b/src/aim1_mod_maker/aim1_mod_maker.h
index 5616963..23f9a93 100644
--- a/src/aim1_mod_maker/aim1_mod_maker.h
+++ b/src/aim1_mod_maker/aim1_mod_maker.h
@@ -16,7 +16,7 @@
#include
#include
-constexpr auto aim_exe = "aim.exe"sv;
+inline const path aim_exe = "aim.exe";
using byte_array = std::vector;
@@ -292,8 +292,8 @@ struct politics {
struct mod_maker {
struct db_wrapper {
mod_maker &mm;
- db2::files::db2_internal m;
- db2::files::db2_internal m2;
+ db2::files_type::db2_internal m;
+ db2::files_type::db2_internal m2;
path fn;
int codepage{1251};
bool written{};
@@ -317,11 +317,11 @@ struct mod_maker {
auto &operator[](this auto &&d, const std::string &s) {
return d.m[s];
}
- auto ©_from_aim2(db2::files::db2_internal &other_db, auto &&table_name, auto &&value_name, auto &&field_name) {
+ auto ©_from_aim2(db2::files_type::db2_internal &other_db, auto &&table_name, auto &&value_name, auto &&field_name) {
m[table_name][value_name][field_name] = other_db.at(table_name).at(value_name).at(field_name);
return m[table_name][value_name][field_name];
}
- auto ©_from_aim2(db2::files::db2_internal &other_db, auto &&table_name, auto &&value_name) {
+ auto ©_from_aim2(db2::files_type::db2_internal &other_db, auto &&table_name, auto &&value_name) {
m[table_name][value_name] = other_db.at(table_name).at(value_name);
return m[table_name][value_name];
}
@@ -390,6 +390,7 @@ struct mod_maker {
std::set files_to_pak;
std::set files_to_pak_mmp;
std::set files_to_distribute;
+ //std::map files_to_distribute2;
std::set code_files_to_distribute;
std::set restored_files;
std::set copied_files;
@@ -397,7 +398,7 @@ struct mod_maker {
db_wrapper dw{*this};
quest_wrapper qw{*this};
bool injections_prepared{};
- int next_sector_id{9};
+ uint8_t number_of_sectors{8};
politics pol;
mod_maker(std::source_location loc = std::source_location::current()) : loc{loc} {
@@ -1032,7 +1033,9 @@ struct mod_maker {
copy_texture_from_aim2(gun["SHOOTTEX1"]);
}
void copy_sector_from_aim1(int id_from) {
- copy_sector_from_aim1(id_from, next_sector_id++);
+ ++number_of_sectors;
+ copy_sector_from_aim1(id_from, number_of_sectors);
+ //patch(aim_exe, 0x12CC2, number_of_sectors - 1, number_of_sectors);
}
void copy_sector_from_aim1(int id_from, int id_to) {
auto from = std::format("location{}", id_from);
@@ -1040,13 +1043,16 @@ struct mod_maker {
auto mmp = find_real_filename(from + ".mmp");
auto mmo = find_real_filename(from + ".mmo");
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);
+ //auto mmp_dest = get_mod_dir() / (to + ".mmp");
+ auto mmp_dest = game_dir / (to + ".mmp");
+ if (mmp != mmp_dest)
+ fs::copy_file(mmp, mmp_dest, 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);
if (mmm != get_mod_dir() / (to + ".mmm"))
fs::copy_file(mmm, get_mod_dir() / (to + ".mmm"), fs::copy_options::update_existing);
- files_to_pak_mmp.insert(get_mod_dir() / (to + ".mmp"));
+ files_to_distribute.insert(mmp_dest);
+ //files_to_pak_mmp.insert(get_mod_dir() / (to + ".mmp")); // we cannot pack .mmp properly now
files_to_pak.insert(get_mod_dir() / (to + ".mmo"));
files_to_pak.insert(get_mod_dir() / (to + ".mmm"));
quest()["ru_RU"]["INFORMATION"][boost::to_upper_copy(to)] = quest()["ru_RU"]["INFORMATION"][boost::to_upper_copy(from)];
@@ -1054,6 +1060,26 @@ struct mod_maker {
s += " Copy";
quest()["ru_RU"]["INFORMATION"][boost::to_upper_copy(to)]["NAME"] = s;
quest()["ru_RU"]["INFORMATION"][std::format("INFO_SECTOR{}", id_to)] = quest()["ru_RU"]["INFORMATION"][std::format("INFO_SECTOR{}", id_from)];
+
+ auto var = "INFO_LET_JUMP_NEW_SECTORS"s;
+ // Здесь ты можешь совершить Переход в новые Сектора.
+ s.clear();
+ for (int i = 9; i <= number_of_sectors; ++i) {
+ s += std::format("
", i);
+ }
+
+ quest()["ru_RU"]["INFORMATION"][var]["NAME"] = "Совершить Переход в новые Сектора";
+ quest()["ru_RU"]["INFORMATION"][var]["TEXT"] = s;
+
+ quest()["en_US"]["INFORMATION"][var]["NAME"] = "Go through the Passage into new Sectors";
+ quest()["en_US"]["INFORMATION"][var]["TEXT"] = s;
+
+ static std::once_flag o;
+ std::call_once(o, [&]() {
+ for (int i = 1; i <= 7; ++i) {
+ replace(std::format("Script/bin/B_L{}_TUNNEL.scr", i), "_INFO(INFO_LET_JUMP)", "_INFO(INFO_LET_JUMP)\n_INFO(" + var + ")");
+ }
+ });
}
auto &db() {
@@ -1061,7 +1087,9 @@ struct mod_maker {
auto cp = 1251; // always 1251 or 0 probably for db
open_db("db", cp);
if (aim2_available()) {
- dw.m2 = db2{aim2_game_dir / "data" / "db"}.open().to_map(cp);
+ auto f = db2{aim2_game_dir / "data" / "db"}.create();
+ f.open();
+ dw.m2 = f.to_map(cp);
}
}
return dw;
@@ -1132,13 +1160,15 @@ private:
}
void open_db(auto &&name, int db_codepage) {
auto d = db2{get_data_dir() / name};
- auto files = d.open().get_files();
+ auto files = d.create().get_files();
for (auto &&f : files) {
backup_or_restore_once(f);
files_to_distribute.insert(f);
}
auto &w = dw;
- w.m = d.open().to_map(db_codepage);
+ auto f = d.create();
+ f.open();
+ w.m = f.to_map(db_codepage);
w.fn = d.fn;
w.codepage = db_codepage;
}
diff --git a/src/common/db2.h b/src/common/db2.h
index 1c81c8c..e92ddeb 100644
--- a/src/common/db2.h
+++ b/src/common/db2.h
@@ -158,20 +158,27 @@ struct db2 {
primitives::templates2::mmap_file f;
T *data;
- file(auto &&base) : fn{path{base} += "."s} {
+ file(const path &base) : fn{path{base} += "."s} {
fn += type_name();
+ }
+ void open() {
f.open(fn, primitives::templates2::mmap_file::ro{});
data = (T *)f.p;
}
};
// actual db
- struct files {
+ struct files_type {
db2 &db;
file tab_;
file ind_;
file dat_;
- files(auto &&db, auto &&base) : db{db}, tab_{base}, ind_{base}, dat_{base} {}
+ files_type(auto &&db, auto &&base) : db{db}, tab_{base}, ind_{base}, dat_{base} {}
+ void open() {
+ tab_.open();
+ ind_.open();
+ dat_.open();
+ }
auto get_files() const {
return std::set{tab_.fn,ind_.fn,dat_.fn};
}
@@ -386,7 +393,10 @@ struct db2 {
}
};
- auto open() {
- return files{*this, fn};
+ auto files() {
+ return files_type{*this, fn}.get_files();
+ }
+ auto create() {
+ return files_type{*this, fn};
}
};