From e13b5950ca0517b6fed9d8438bce155df8df9ffe Mon Sep 17 00:00:00 2001 From: Martin Michelsen Date: Sat, 20 Jan 2024 15:30:24 -0800 Subject: [PATCH] use SetDataTable files as map indexes --- src/FileContentsCache.cc | 9 +- src/Lobby.cc | 102 +++--- src/Lobby.hh | 17 +- src/Main.cc | 193 ++++++++++- src/Map.cc | 335 +++++++++++++++---- src/Map.hh | 86 ++++- src/ReceiveCommands.cc | 15 +- src/ServerState.cc | 76 +++-- src/ServerState.hh | 7 + system/maps/bb-v4/SetDataTableOff.rel | Bin 0 -> 10624 bytes system/maps/bb-v4/SetDataTableOffUlti.rel | Bin 0 -> 9056 bytes system/maps/bb-v4/SetDataTableOn.rel | Bin 0 -> 10816 bytes system/maps/bb-v4/SetDataTableOnUlti.rel | Bin 0 -> 9344 bytes system/maps/bb-v4/map_city02_00_00e_c1.dat | 1 + system/maps/bb-v4/map_city02_00_00e_d.dat | 1 + system/maps/bb-v4/map_city02_00_00o_c1.dat | 1 + system/maps/bb-v4/map_city02_00_00o_d.dat | 1 + system/maps/bb-v4/map_test01_00_00e.dat | 0 system/maps/bb-v4/map_test01_00_00o.dat | 0 system/maps/dc-v1/SetDataTableOff.rel | Bin 0 -> 3552 bytes system/maps/dc-v1/SetDataTableOn.rel | Bin 0 -> 3680 bytes system/maps/dc-v2/SetDataTableGAMEJAM.rel | Bin 0 -> 5824 bytes system/maps/dc-v2/SetDataTableOff.rel | Bin 0 -> 5632 bytes system/maps/dc-v2/SetDataTableOffUlti.rel | Bin 0 -> 5664 bytes system/maps/dc-v2/SetDataTableOn.rel | Bin 0 -> 5856 bytes system/maps/dc-v2/SetDataTableOnUlti.rel | Bin 0 -> 5856 bytes system/maps/gc-nte/SetDataTableGAMEJAM.rel | Bin 0 -> 5824 bytes system/maps/gc-nte/SetDataTableOff.rel | Bin 0 -> 7840 bytes system/maps/gc-nte/SetDataTableOffUlti.rel | Bin 0 -> 7872 bytes system/maps/gc-nte/SetDataTableOn.rel | Bin 0 -> 7584 bytes system/maps/gc-nte/SetDataTableOnUlti.rel | Bin 0 -> 7584 bytes system/maps/gc-nte/SetDataTable_TGS2001.rel | Bin 0 -> 7552 bytes system/maps/gc-nte/map_labo00_00e_c1.dat | 1 + system/maps/gc-nte/map_labo00_00e_d.dat | 1 + system/maps/gc-nte/map_labo00_00o_c1.dat | 1 + system/maps/gc-nte/map_labo00_00o_d.dat | 1 + system/maps/gc-nte/map_seabed01_00_00e.dat | Bin 73 -> 72 bytes system/maps/gc-nte/map_seabed01_01_00e.dat | Bin 73 -> 72 bytes system/maps/gc-v3/SetDataTableOff.rel | Bin 0 -> 9120 bytes system/maps/gc-v3/SetDataTableOffUlti.rel | Bin 0 -> 9056 bytes system/maps/gc-v3/SetDataTableOn.rel | Bin 0 -> 9312 bytes system/maps/gc-v3/SetDataTableOnUlti.rel | Bin 0 -> 9344 bytes system/maps/gc-v3/SetDataTable_TGS2001.rel | Bin 0 -> 8352 bytes system/maps/gc-v3/map_lobby_01o.dat | Bin 0 -> 3536 bytes system/maps/gc-v3/map_lobby_02o.dat | Bin 0 -> 4964 bytes system/maps/gc-v3/map_lobby_03o.dat | Bin 0 -> 3536 bytes system/maps/gc-v3/map_lobby_04o.dat | Bin 0 -> 3536 bytes system/maps/gc-v3/map_lobby_05o.dat | Bin 0 -> 4624 bytes system/maps/gc-v3/map_lobby_06o.dat | Bin 0 -> 4148 bytes system/maps/gc-v3/map_lobby_07o.dat | Bin 0 -> 3536 bytes system/maps/gc-v3/map_lobby_08o.dat | Bin 0 -> 3672 bytes system/maps/gc-v3/map_lobby_09o.dat | Bin 0 -> 3740 bytes system/maps/gc-v3/map_lobby_10o.dat | Bin 0 -> 4760 bytes system/maps/gc-v3/map_lobby_green_be00o.dat | Bin 0 -> 1564 bytes system/maps/gc-v3/map_lobby_red_be00o.dat | Bin 0 -> 1564 bytes system/maps/gc-v3/map_lobby_soccer01o.dat | Bin 0 -> 1700 bytes system/maps/gc-v3/map_lobby_soccer02o.dat | Bin 0 -> 1700 bytes system/maps/gc-v3/map_lobby_yellow_be00o.dat | Bin 0 -> 1564 bytes system/maps/pc-nte/SetDataTableOff.rel | Bin 0 -> 5632 bytes system/maps/pc-nte/SetDataTableOn.rel | Bin 0 -> 5856 bytes system/maps/pc-v2/SetDataTableGAMEJAM.rel | Bin 0 -> 5824 bytes system/maps/pc-v2/SetDataTableOff.rel | Bin 0 -> 5632 bytes system/maps/pc-v2/SetDataTableOffUlti.rel | Bin 0 -> 5664 bytes system/maps/pc-v2/SetDataTableOn.rel | Bin 0 -> 5856 bytes system/maps/pc-v2/SetDataTableOnUlti.rel | Bin 0 -> 5856 bytes system/maps/xb-v3/SetDataTableOn.rel | Bin 0 -> 9312 bytes system/maps/xb-v3/SetDataTableOnUlti.rel | Bin 0 -> 9344 bytes system/maps/xb-v3/map_lobby_01o.dat | Bin 0 -> 3536 bytes system/maps/xb-v3/map_lobby_02o.dat | Bin 0 -> 4964 bytes system/maps/xb-v3/map_lobby_03o.dat | Bin 0 -> 3536 bytes system/maps/xb-v3/map_lobby_04o.dat | Bin 0 -> 3536 bytes system/maps/xb-v3/map_lobby_05o.dat | Bin 0 -> 4624 bytes system/maps/xb-v3/map_lobby_06o.dat | Bin 0 -> 4148 bytes system/maps/xb-v3/map_lobby_07o.dat | Bin 0 -> 3536 bytes system/maps/xb-v3/map_lobby_08o.dat | Bin 0 -> 3672 bytes system/maps/xb-v3/map_lobby_09o.dat | Bin 0 -> 3740 bytes system/maps/xb-v3/map_lobby_10o.dat | Bin 0 -> 4760 bytes system/maps/xb-v3/map_lobby_green_be00o.dat | Bin 0 -> 1564 bytes system/maps/xb-v3/map_lobby_red_be00o.dat | Bin 0 -> 1564 bytes system/maps/xb-v3/map_lobby_soccer01o.dat | Bin 0 -> 1700 bytes system/maps/xb-v3/map_lobby_soccer02o.dat | Bin 0 -> 1700 bytes system/maps/xb-v3/map_lobby_yellow_be00o.dat | Bin 0 -> 1564 bytes 82 files changed, 689 insertions(+), 159 deletions(-) create mode 100644 system/maps/bb-v4/SetDataTableOff.rel create mode 100755 system/maps/bb-v4/SetDataTableOffUlti.rel create mode 100644 system/maps/bb-v4/SetDataTableOn.rel create mode 100755 system/maps/bb-v4/SetDataTableOnUlti.rel create mode 120000 system/maps/bb-v4/map_city02_00_00e_c1.dat create mode 120000 system/maps/bb-v4/map_city02_00_00e_d.dat create mode 120000 system/maps/bb-v4/map_city02_00_00o_c1.dat create mode 120000 system/maps/bb-v4/map_city02_00_00o_d.dat create mode 100644 system/maps/bb-v4/map_test01_00_00e.dat create mode 100644 system/maps/bb-v4/map_test01_00_00o.dat create mode 100644 system/maps/dc-v1/SetDataTableOff.rel create mode 100644 system/maps/dc-v1/SetDataTableOn.rel create mode 100644 system/maps/dc-v2/SetDataTableGAMEJAM.rel create mode 100644 system/maps/dc-v2/SetDataTableOff.rel create mode 100644 system/maps/dc-v2/SetDataTableOffUlti.rel create mode 100644 system/maps/dc-v2/SetDataTableOn.rel create mode 100644 system/maps/dc-v2/SetDataTableOnUlti.rel create mode 100755 system/maps/gc-nte/SetDataTableGAMEJAM.rel create mode 100755 system/maps/gc-nte/SetDataTableOff.rel create mode 100755 system/maps/gc-nte/SetDataTableOffUlti.rel create mode 100755 system/maps/gc-nte/SetDataTableOn.rel create mode 100755 system/maps/gc-nte/SetDataTableOnUlti.rel create mode 100755 system/maps/gc-nte/SetDataTable_TGS2001.rel create mode 120000 system/maps/gc-nte/map_labo00_00e_c1.dat create mode 120000 system/maps/gc-nte/map_labo00_00e_d.dat create mode 120000 system/maps/gc-nte/map_labo00_00o_c1.dat create mode 120000 system/maps/gc-nte/map_labo00_00o_d.dat create mode 100755 system/maps/gc-v3/SetDataTableOff.rel create mode 100755 system/maps/gc-v3/SetDataTableOffUlti.rel create mode 100755 system/maps/gc-v3/SetDataTableOn.rel create mode 100755 system/maps/gc-v3/SetDataTableOnUlti.rel create mode 100755 system/maps/gc-v3/SetDataTable_TGS2001.rel create mode 100755 system/maps/gc-v3/map_lobby_01o.dat create mode 100755 system/maps/gc-v3/map_lobby_02o.dat create mode 100755 system/maps/gc-v3/map_lobby_03o.dat create mode 100755 system/maps/gc-v3/map_lobby_04o.dat create mode 100755 system/maps/gc-v3/map_lobby_05o.dat create mode 100755 system/maps/gc-v3/map_lobby_06o.dat create mode 100755 system/maps/gc-v3/map_lobby_07o.dat create mode 100755 system/maps/gc-v3/map_lobby_08o.dat create mode 100755 system/maps/gc-v3/map_lobby_09o.dat create mode 100755 system/maps/gc-v3/map_lobby_10o.dat create mode 100755 system/maps/gc-v3/map_lobby_green_be00o.dat create mode 100755 system/maps/gc-v3/map_lobby_red_be00o.dat create mode 100755 system/maps/gc-v3/map_lobby_soccer01o.dat create mode 100755 system/maps/gc-v3/map_lobby_soccer02o.dat create mode 100755 system/maps/gc-v3/map_lobby_yellow_be00o.dat create mode 100644 system/maps/pc-nte/SetDataTableOff.rel create mode 100644 system/maps/pc-nte/SetDataTableOn.rel create mode 100644 system/maps/pc-v2/SetDataTableGAMEJAM.rel create mode 100644 system/maps/pc-v2/SetDataTableOff.rel create mode 100644 system/maps/pc-v2/SetDataTableOffUlti.rel create mode 100644 system/maps/pc-v2/SetDataTableOn.rel create mode 100644 system/maps/pc-v2/SetDataTableOnUlti.rel create mode 100644 system/maps/xb-v3/SetDataTableOn.rel create mode 100644 system/maps/xb-v3/SetDataTableOnUlti.rel create mode 100644 system/maps/xb-v3/map_lobby_01o.dat create mode 100644 system/maps/xb-v3/map_lobby_02o.dat create mode 100644 system/maps/xb-v3/map_lobby_03o.dat create mode 100644 system/maps/xb-v3/map_lobby_04o.dat create mode 100644 system/maps/xb-v3/map_lobby_05o.dat create mode 100644 system/maps/xb-v3/map_lobby_06o.dat create mode 100644 system/maps/xb-v3/map_lobby_07o.dat create mode 100644 system/maps/xb-v3/map_lobby_08o.dat create mode 100644 system/maps/xb-v3/map_lobby_09o.dat create mode 100644 system/maps/xb-v3/map_lobby_10o.dat create mode 100644 system/maps/xb-v3/map_lobby_green_be00o.dat create mode 100644 system/maps/xb-v3/map_lobby_red_be00o.dat create mode 100644 system/maps/xb-v3/map_lobby_soccer01o.dat create mode 100644 system/maps/xb-v3/map_lobby_soccer02o.dat create mode 100644 system/maps/xb-v3/map_lobby_yellow_be00o.dat diff --git a/src/FileContentsCache.cc b/src/FileContentsCache.cc index 15c176a1..91fb7679 100644 --- a/src/FileContentsCache.cc +++ b/src/FileContentsCache.cc @@ -79,20 +79,13 @@ shared_ptr ThreadSafeFileCache::get( const string& name, std::function(const std::string&)> generate) { try { shared_lock g(this->lock); - auto ret = this->name_to_file.at(name); - if (!ret) { - throw cannot_open_file(name); - } - return ret; + return this->name_to_file.at(name); } catch (const out_of_range&) { unique_lock g(this->lock); auto it = this->name_to_file.find(name); if (it == this->name_to_file.end()) { it = this->name_to_file.emplace(name, generate(name)).first; } - if (!it->second) { - throw cannot_open_file(name); - } return it->second; } } diff --git a/src/Lobby.cc b/src/Lobby.cc index 4b20f6d0..d63d0e21 100644 --- a/src/Lobby.cc +++ b/src/Lobby.cc @@ -291,10 +291,30 @@ shared_ptr Lobby::load_maps( uint8_t difficulty, uint8_t event, uint32_t lobby_id, + shared_ptr sdt, function(Version, const string&)> get_file_data, shared_ptr rare_rates, shared_ptr random_crypt, - const parray& variations) { + const parray& variations, + const PrefixedLogger* log) { + auto enemy_filenames = sdt->map_filenames_for_variations(variations, episode, mode, true); + auto object_filenames = sdt->map_filenames_for_variations(variations, episode, mode, false); + return Lobby::load_maps(enemy_filenames, object_filenames, version, episode, mode, difficulty, event, lobby_id, get_file_data, rare_rates, random_crypt, log); +} + +shared_ptr Lobby::load_maps( + const vector& enemy_filenames, + const vector& object_filenames, + Version version, + Episode episode, + GameMode mode, + uint8_t difficulty, + uint8_t event, + uint32_t lobby_id, + function(Version, const string&)> get_file_data, + shared_ptr rare_rates, + shared_ptr random_crypt, + const PrefixedLogger* log) { auto map = make_shared(version, lobby_id, random_crypt); // Don't load free-roam maps in Challenge mode, since players can't go to @@ -303,58 +323,42 @@ shared_ptr Lobby::load_maps( return map; } - for (size_t floor = 0; floor < 0x10; floor++) { - auto enemy_filenames = map_filenames_for_variation( - version, - episode, - mode, - floor, - variations[floor * 2], - variations[floor * 2 + 1], - true); - if (!enemy_filenames.empty()) { - bool any_map_loaded = false; - for (const string& filename : enemy_filenames) { - auto map_data = get_file_data(version, filename); - if (map_data) { - map->add_enemies_from_map_data( - episode, - difficulty, - event, - floor, - map_data->data(), - map_data->size(), - rare_rates); - any_map_loaded = true; - break; + for (size_t floor = 0; floor < 0x12; floor++) { + const auto& floor_enemy_filename = enemy_filenames.at(floor); + if (!floor_enemy_filename.empty()) { + auto map_data = get_file_data(version, floor_enemy_filename); + if (map_data) { + map->add_enemies_from_map_data( + episode, + difficulty, + event, + floor, + map_data->data(), + map_data->size(), + rare_rates); + if (log) { + log->info("Loaded enemies map %s for floor %02zX", floor_enemy_filename.c_str(), floor); } + } else if (log) { + log->info("Enemies map %s for floor %02zX cannot be used; skipping", floor_enemy_filename.c_str(), floor); } - if (!any_map_loaded) { - throw runtime_error(string_printf("no enemy maps loaded for floor %zu", floor)); - } + } else if (log) { + log->info("No enemies to load for floor %02zX", floor); } - auto object_filenames = map_filenames_for_variation( - version, - episode, - mode, - floor, - variations[floor * 2], - variations[floor * 2 + 1], - false); - if (!object_filenames.empty()) { - bool any_map_loaded = false; - for (const string& filename : object_filenames) { - auto map_data = get_file_data(version, filename); - if (map_data) { - map->add_objects_from_map_data(floor, map_data->data(), map_data->size()); - any_map_loaded = true; - break; + const auto& floor_object_filename = object_filenames.at(floor); + if (!floor_object_filename.empty()) { + auto map_data = get_file_data(version, floor_object_filename); + if (map_data) { + map->add_objects_from_map_data(floor, map_data->data(), map_data->size()); + if (log) { + log->info("Loaded objects map %s for floor %02zX", floor_object_filename.c_str(), floor); } + } else if (log) { + log->info("Objects map %s for floor %02zX cannot be used; skipping", floor_object_filename.c_str(), floor); } - if (!any_map_loaded) { - throw runtime_error(string_printf("no object maps loaded for floor %zu", floor)); - } + } else if (log) { + log->info("No objects to load for floor %02zX", floor); } } @@ -392,10 +396,12 @@ void Lobby::load_maps() { this->difficulty, this->event, this->lobby_id, + s->set_data_table(this->base_version, this->episode, this->mode, this->difficulty), bind(&ServerState::load_map_file, s.get(), placeholders::_1, placeholders::_2), rare_rates, this->random_crypt, - this->variations); + this->variations, + &this->log); } else { this->map = make_shared(this->base_version, this->lobby_id, this->random_crypt); diff --git a/src/Lobby.hh b/src/Lobby.hh index 82d93b83..edb6d8ae 100644 --- a/src/Lobby.hh +++ b/src/Lobby.hh @@ -211,10 +211,25 @@ struct Lobby : public std::enable_shared_from_this { uint8_t difficulty, uint8_t event, uint32_t lobby_id, + std::shared_ptr sdt, std::function(Version, const std::string&)> get_file_data, std::shared_ptr rare_rates, std::shared_ptr random_crypt, - const parray& variations); + const parray& variations, + const PrefixedLogger* log = nullptr); + static std::shared_ptr load_maps( + const std::vector& enemy_filenames, + const std::vector& object_filenames, + Version version, + Episode episode, + GameMode mode, + uint8_t difficulty, + uint8_t event, + uint32_t lobby_id, + std::function(Version, const std::string&)> get_file_data, + std::shared_ptr rare_rates, + std::shared_ptr random_crypt, + const PrefixedLogger* log = nullptr); void load_maps(); void create_ep3_server(); diff --git a/src/Main.cc b/src/Main.cc index 888bc3d7..af777835 100644 --- a/src/Main.cc +++ b/src/Main.cc @@ -1114,6 +1114,196 @@ Action a_disassemble_quest_map( string result = Map::disassemble_quest_data(data.data(), data.size()); write_output_data(args, result.data(), result.size(), "txt"); }); +Action a_disassemble_set_data_table( + "disassemble-set-data-table", "\ + disassemble-set-data-table [INPUT-FILENAME]\n\ + Show the contents of a SetDataTable.rel file. A version option is required.\n", + +[](Arguments& args) { + Version version = get_cli_version(args); + SetDataTable sdt(version, read_input_data(args)); + string str = sdt.str(); + write_output_data(args, str.data(), str.size(), "txt"); + }); +Action a_check_set_data_table( + "check-set-data-tables", nullptr, +[](Arguments&) { + ServerState s; + s.load_objects_and_upstream_dependents("set_data_tables"); + static_game_data_log.min_level = LogLevel::DISABLED; + + auto get_file_data = [&](Version version, const string& filename) -> shared_ptr { + try { + return s.load_map_file(version, filename); + } catch (const cannot_open_file&) { + return nullptr; + } + }; + + auto check_filenames = [&](Version version, const string& sdt_filename, const vector& ns_filenames) -> string { + for (size_t z = 0; z < ns_filenames.size(); z++) { + const auto& ns_filename = ns_filenames[z]; + auto data = get_file_data(version, ns_filename); + if (data) { + if (sdt_filename != ns_filename) { + string ns_filenames_str = join(ns_filenames, ", "); + return string_printf("SDT => %s, NS => [%s]", sdt_filename.c_str(), ns_filenames_str.c_str()); + } + return "OK"; + } + if (!data && (sdt_filename == ns_filename)) { + string ns_filenames_str = join(ns_filenames, ", "); + return string_printf("SDT => %s (missing)", sdt_filename.c_str()); + } + } + if (ns_filenames.empty() && sdt_filename.empty()) { + return "OK (no files)"; + } else if (ns_filenames.empty()) { + auto data = get_file_data(version, sdt_filename); + if (data) { + return string_printf("NS blank, SDT => %s", sdt_filename.c_str()); + } else { + return string_printf("NS blank, SDT => %s (missing)", sdt_filename.c_str()); + } + } else if (sdt_filename.empty()) { + string ns_filenames_str = join(ns_filenames, ", "); + return string_printf("SDT blank, NS => [%s] (all missing)", ns_filenames_str.c_str()); + } else { + string ns_filenames_str = join(ns_filenames, ", "); + return string_printf("SDT => %s (missing), NS => [%s] (all missing)", sdt_filename.c_str(), ns_filenames_str.c_str()); + } + }; + + size_t num_checks = 0; + size_t num_errors = 0; + auto check_table = [&](Version version) { + vector episodes({Episode::EP1}); + if (!is_v1_or_v2(version) || (version == Version::GC_NTE)) { + episodes.emplace_back(Episode::EP2); + if (is_v4(version)) { + episodes.emplace_back(Episode::EP4); + } + } + + vector modes({GameMode::NORMAL}); + if (!is_v1(version)) { + modes.emplace_back(GameMode::BATTLE); + modes.emplace_back(GameMode::CHALLENGE); + } + if (is_v4(version)) { + modes.emplace_back(GameMode::SOLO); + } + + uint8_t max_difficulty = is_v1(version) ? 2 : 3; + + for (Episode episode : episodes) { + for (GameMode mode : modes) { + for (uint8_t difficulty = 0; difficulty <= max_difficulty; difficulty++) { + auto sdt = s.set_data_table(version, episode, mode, difficulty); + auto ns_var_maxes = variation_maxes_deprecated(version, episode, (mode == GameMode::SOLO)); + size_t num_floors; + if (episode == Episode::EP4) { + num_floors = 0x0B; + } else if (episode == Episode::EP2) { + num_floors = 0x10; + } else { + num_floors = 0x0F; + } + for (size_t floor = 0; floor < num_floors; floor++) { + auto sdt_var_avail = sdt->num_available_variations_for_floor(episode, floor); + auto sdt_var_maxes = sdt->num_free_roam_variations_for_floor(episode, mode == GameMode::SOLO, floor); + size_t sdt_var1_max_avail = sdt_var_avail.first - 1; + size_t sdt_var2_max_avail = sdt_var_avail.second - 1; + size_t sdt_var1_max = sdt_var_maxes.first - 1; + size_t sdt_var2_max = sdt_var_maxes.second - 1; + size_t ns_var1_max = ns_var_maxes[floor * 2]; + size_t ns_var2_max = ns_var_maxes[floor * 2 + 1]; + num_checks += 4; + if (sdt_var1_max > sdt_var1_max_avail) { + fprintf(stdout, "## %-8s %-10s %-10s %-10s %02zX VAR1:[SDT:%02zX SDTA:%02zX]\n", + name_for_enum(version), + name_for_episode(episode), + name_for_mode(mode), + name_for_difficulty(difficulty), + floor, + sdt_var1_max, + sdt_var1_max_avail); + num_errors++; + } + if (sdt_var2_max > sdt_var2_max_avail) { + fprintf(stdout, "## %-8s %-10s %-10s %-10s %02zX VAR2:[SDT:%02zX SDTA:%02zX]\n", + name_for_enum(version), + name_for_episode(episode), + name_for_mode(mode), + name_for_difficulty(difficulty), + floor, + sdt_var2_max, + sdt_var2_max_avail); + num_errors++; + } + if (sdt_var1_max < ns_var1_max) { + fprintf(stdout, "## %-8s %-10s %-10s %-10s %02zX VAR1:[SDT:%02zX NS:%02zX]\n", + name_for_enum(version), + name_for_episode(episode), + name_for_mode(mode), + name_for_difficulty(difficulty), + floor, + sdt_var1_max, + ns_var1_max); + num_errors++; + } + if (sdt_var2_max < ns_var2_max) { + fprintf(stdout, "## %-8s %-10s %-10s %-10s %02zX VAR2:[SDT:%02zX NS:%02zX]\n", + name_for_enum(version), + name_for_episode(episode), + name_for_mode(mode), + name_for_difficulty(difficulty), + floor, + sdt_var2_max, + ns_var2_max); + num_errors++; + } + for (size_t var1 = 0; var1 <= ns_var1_max; var1++) { + for (size_t var2 = 0; var2 <= ns_var2_max; var2++) { + auto sdt_enemy_filename = sdt->map_filename_for_variation(floor, var1, var2, episode, mode, true); + auto sdt_object_filename = sdt->map_filename_for_variation(floor, var1, var2, episode, mode, false); + auto ns_enemy_filenames = map_filenames_for_variation_deprecated(floor, var1, var2, version, episode, mode, true); + auto ns_object_filenames = map_filenames_for_variation_deprecated(floor, var1, var2, version, episode, mode, false); + string enemies_error = check_filenames(version, sdt_enemy_filename, ns_enemy_filenames); + string objects_error = check_filenames(version, sdt_object_filename, ns_object_filenames); + num_checks += 2; + num_errors += (enemies_error != "OK") + (objects_error != "OK"); + fprintf(stdout, "%s %-8s %-10s %-10s %-10s %02zX %02zX %02zX E:[%s] O:[%s] E:%-30s O:%-30s\n", + ((enemies_error != "OK") || (objects_error != "OK")) ? "##" : " ", + name_for_enum(version), + name_for_episode(episode), + name_for_mode(mode), + name_for_difficulty(difficulty), + floor, + var1, + var2, + enemies_error.c_str(), + objects_error.c_str(), + sdt_enemy_filename.c_str(), + sdt_object_filename.c_str()); + } + } + } + } + } + } + }; + + check_table(Version::DC_NTE); + check_table(Version::DC_V1_11_2000_PROTOTYPE); + check_table(Version::DC_V1); + check_table(Version::DC_V2); + check_table(Version::PC_NTE); + check_table(Version::PC_V2); + check_table(Version::GC_NTE); + check_table(Version::GC_V3); + check_table(Version::XB_V3); + check_table(Version::BB_V4); + fprintf(stdout, "%zu/%zu errors\n", num_errors, num_checks); + }); Action a_assemble_quest_script( "assemble-quest-script", "\ @@ -1883,7 +2073,7 @@ Action a_find_rare_enemy_seeds( map = Lobby::load_maps(version, episode, difficulty, 0, 0, rare_rates, random_crypt, vq); } else { - generate_variations(variations, random_crypt, version, episode, (mode == GameMode::SOLO)); + generate_variations_deprecated(variations, random_crypt, version, episode, (mode == GameMode::SOLO)); map = Lobby::load_maps( version, episode, @@ -1891,6 +2081,7 @@ Action a_find_rare_enemy_seeds( difficulty, 0, 0, + s.set_data_table(version, episode, mode, difficulty), bind(&ServerState::load_map_file, &s, placeholders::_1, placeholders::_2), rare_rates, random_crypt, diff --git a/src/Map.cc b/src/Map.cc index 36449322..cde22a2e 100644 --- a/src/Map.cc +++ b/src/Map.cc @@ -1637,8 +1637,59 @@ string Map::disassemble_quest_data(const void* data, size_t size) { return join(ret, "\n") + "\n"; } -SetDataTable::SetDataTable(shared_ptr data, bool big_endian) { - if (big_endian) { +SetDataTableBase::SetDataTableBase(Version version) : version(version) {} + +parray SetDataTableBase::generate_variations( + Episode episode, bool is_solo, std::shared_ptr random_crypt) const { + parray ret; + for (size_t floor = 0; floor < 0x10; floor++) { + auto num_vars = this->num_free_roam_variations_for_floor(episode, is_solo, floor); + ret[floor * 2] = (num_vars.first > 1) ? (random_crypt->next() % num_vars.first) : 0; + ret[floor * 2 + 1] = (num_vars.second > 1) ? (random_crypt->next() % num_vars.second) : 0; + } + return ret; +} + +vector SetDataTableBase::map_filenames_for_variations( + const parray& variations, Episode episode, GameMode mode, bool is_enemies) const { + vector ret; + for (uint8_t floor = 0; floor < 0x10; floor++) { + ret.emplace_back(this->map_filename_for_variation( + floor, variations[floor * 2], variations[floor * 2 + 1], episode, mode, is_enemies)); + } + for (uint8_t floor = 0x10; floor < 0x12; floor++) { + ret.emplace_back(this->map_filename_for_variation(floor, 0, 0, episode, mode, is_enemies)); + } + return ret; +} + +uint8_t SetDataTableBase::default_area_for_floor(Episode episode, uint8_t floor) const { + // For some inscrutable reason, Pioneer 2's area number in Episode 4 is + // discontiguous with all the rest. Why, Sega?? + static const std::array areas_ep1 = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11}; + static const std::array areas_ep2_gc_nte = { + 0x00, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0xFF, 0xFF}; + static const std::array areas_ep2 = { + 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23}; + static const std::array areas_ep4 = { + 0x2D, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; + switch (episode) { + case Episode::EP1: + return areas_ep1.at(floor); + case Episode::EP2: { + const auto& areas = ((this->version == Version::GC_NTE) ? areas_ep2_gc_nte : areas_ep2); + return areas.at(floor); + } + case Episode::EP4: + return areas_ep4.at(floor); + default: + throw logic_error("incorrect episode"); + } +} + +SetDataTable::SetDataTable(Version version, const string& data) : SetDataTableBase(version) { + if (is_big_endian(this->version)) { this->load_table_t(data); } else { this->load_table_t(data); @@ -1646,10 +1697,10 @@ SetDataTable::SetDataTable(shared_ptr data, bool big_endian) { } template -void SetDataTable::load_table_t(shared_ptr data) { +void SetDataTable::load_table_t(const string& data) { using U32T = typename conditional::type; - StringReader r(*data); + StringReader r(data); struct Footer { U32T table3_offset; @@ -1688,17 +1739,99 @@ void SetDataTable::load_table_t(shared_ptr data) { } } -void SetDataTable::print(FILE* stream) const { +pair SetDataTable::num_available_variations_for_floor(Episode episode, uint8_t floor) const { + uint8_t area = this->default_area_for_floor(episode, floor); + if (area == 0xFF) { + return make_pair(1, 1); + } else { + const auto& e = this->entries.at(area); + return make_pair(e.size(), e.at(0).size()); + } +} + +pair SetDataTable::num_free_roam_variations_for_floor(Episode episode, bool is_solo, uint8_t floor) const { + uint8_t area = this->default_area_for_floor(episode, floor); + if (area == 0xFF) { + return make_pair(1, 1); + } + static const array counts_on = { + // Episode 1 (00-11) + // P2 -F1-, -F2-, -C1-, -C2-, -C3-, -M1-, -M2-, -R1-, -R2-, -R3-, DRGN, DRL-, -VO-, -DF-, LOBBY, VS1-, VS2-, + 1, 1, 1, 5, 1, 5, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, 10, 1, 1, 1, 1, 1, + // Episode 2 (12-23) + // P2 VRTA, VRTB, VRSA, VRSB, CCA-, -JN-, -JS-, MNTN, SEAS, SBU-, SBL-, -GG-, -OF-, -BR-, -GD-, SSN-, TWR-, + 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 1, 3, 1, 3, 1, 3, 2, 2, 1, 3, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + // Episode 4 (24-2E) + // CE -CW-, -CS-, -CN-, -CI-, DES1, DES2, DES3, SMIL, -P2-, TEST + 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 1, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1}; + static const array counts_off = { + // Episode 1 (00-11) + // P2 -F1-, -F2-, -C1-, -C2-, -C3-, -M1-, -M2-, -R1-, -R2-, -R3-, DRGN, DRL-, -VO-, -DF-, LOBBY, VS1-, VS2-, + 1, 1, 1, 3, 1, 3, 3, 1, 3, 1, 3, 1, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, 10, 1, 1, 1, 1, 1, + // Episode 2 (12-23) + // P2 VRTA, VRTB, VRSA, VRSB, CCA-, -JN-, -JS-, MNTN, SEAS, SBU-, SBL-, -GG-, -OF-, -BR-, -GD-, SSN-, TWR-, + 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 1, 3, 1, 3, 1, 3, 2, 2, 1, 3, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + // Episode 4 (24-2E) + // CE -CW-, -CS-, -CN-, -CI-, DES1, DES2, DES3, SMIL, -P2-, TEST + 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 1, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1}; + const auto& data = is_solo ? counts_off : counts_on; + if ((floor * 2 + 1) < data.size()) { + auto available = this->num_available_variations_for_floor(episode, floor); + return make_pair(min(available.first, data[area * 2]), min(available.second, data[area * 2 + 1])); + } + throw runtime_error("invalid area"); +} + +string SetDataTable::map_filename_for_variation( + uint8_t floor, uint32_t var1, uint32_t var2, Episode episode, GameMode mode, bool is_enemies) const { + uint8_t area = this->default_area_for_floor(episode, floor); + if (area == 0xFF) { + return ""; + } + + if (area >= this->entries.size()) { + return ""; + } + + const auto& entry = this->entries.at(area).at(var1).at(var2); + string filename = is_enemies ? entry.enemy_list_basename : entry.object_list_basename; + + filename += (is_enemies ? "e" : "o"); + + switch ((floor != 0) ? GameMode::NORMAL : mode) { + case GameMode::NORMAL: + filename += ".dat"; + break; + case GameMode::SOLO: + filename += "_s.dat"; + break; + case GameMode::CHALLENGE: + filename += "_c1.dat"; + break; + case GameMode::BATTLE: + filename += "_d.dat"; + break; + default: + throw logic_error("invalid game mode"); + } + + return filename; +} + +string SetDataTable::str() const { + vector lines; + lines.emplace_back(string_printf("FL/V1/V2 => ----------------------OBJECT -----------------------ENEMY -----------------------EVENT\n")); for (size_t a = 0; a < this->entries.size(); a++) { const auto& v1_v = this->entries[a]; for (size_t v1 = 0; v1 < v1_v.size(); v1++) { const auto& v2_v = v1_v[v1]; for (size_t v2 = 0; v2 < v2_v.size(); v2++) { const auto& e = v2_v[v2]; - fprintf(stream, "[%02zX/%02zX/%02zX] %s %s %s\n", a, v1, v2, e.object_list_basename.c_str(), e.enemy_list_basename.c_str(), e.event_list_basename.c_str()); + lines.emplace_back(string_printf("%02zX/%02zX/%02zX => %28s %28s %28s\n", a, v1, v2, e.object_list_basename.c_str(), e.enemy_list_basename.c_str(), e.event_list_basename.c_str())); } } } + return join(lines, ""); } struct AreaMapFileInfo { @@ -1715,23 +1848,97 @@ struct AreaMapFileInfo { variation2_values(variation2_values) {} }; +const array>, 0x10> SetDataTableDCNTE::NAMES = {{ + /* 00 */ {{"map_city00_00"}}, + /* 01 */ {{"map_forest01_00", "map_forest01_01"}}, + /* 02 */ {{"map_forest02_00", "map_forest02_03"}}, + /* 03 */ {{"map_cave01_00_00", "map_cave01_00_01"}, {"map_cave01_01_00", "map_cave01_01_01"}}, + /* 04 */ {{"map_cave02_00_00", "map_cave02_00_01"}, {"map_cave02_01_00", "map_cave02_01_01"}}, + /* 05 */ {{"map_cave03_00_00", "map_cave03_00_01"}, {"map_cave03_01_00", "map_cave03_01_01"}}, + /* 06 */ {{"map_machine01_00_00", "map_machine01_00_01"}}, + /* 07 */ {{"map_machine02_00_00", "map_machine02_00_01"}}, + /* 08 */ {{"map_ancient01_00_00", "map_ancient01_00_01"}, {"map_ancient01_01_00", "map_ancient01_01_01"}}, + /* 09 */ {{"map_ancient02_00_00", "map_ancient02_00_01"}, {"map_ancient02_01_00", "map_ancient02_01_01"}}, + /* 0A */ {{"map_ancient03_00_00", "map_ancient03_00_01"}, {"map_ancient03_01_00", "map_ancient03_01_01"}}, + /* 0B */ {{"map_boss01"}}, + /* 0C */ {{"map_boss02"}}, + /* 0D */ {{"map_boss03"}}, + /* 0E */ {{"map_boss04"}}, + /* 0F */ {{"map_visuallobby"}, {"map_visuallobby"}, {"map_visuallobby"}, {"map_visuallobby"}, {"map_visuallobby"}, {"map_visuallobby"}, {"map_visuallobby"}, {"map_visuallobby"}, {"map_visuallobby"}, {"map_visuallobby"}}, +}}; + +SetDataTableDCNTE::SetDataTableDCNTE() : SetDataTableBase(Version::DC_NTE) {} + +pair SetDataTableDCNTE::num_available_variations_for_floor(Episode, uint8_t floor) const { + return make_pair(this->NAMES[floor].size(), this->NAMES[floor][0].size()); +} + +pair SetDataTableDCNTE::num_free_roam_variations_for_floor(Episode episode, bool, uint8_t floor) const { + return this->num_available_variations_for_floor(episode, floor); +} + +string SetDataTableDCNTE::map_filename_for_variation( + uint8_t floor, uint32_t var1, uint32_t var2, Episode, GameMode, bool is_enemies) const { + if (floor >= this->NAMES.size()) { + return ""; + } + return this->NAMES.at(floor).at(var1).at(var2) + (is_enemies ? "e.dat" : "o.dat"); +} + +const array>, 0x10> SetDataTableDC112000::NAMES = {{ + /* 00 */ {{"map_city00_00"}}, + /* 01 */ {{"map_forest01_00", "map_forest01_01", "map_forest01_02", "map_forest01_03", "map_forest01_04"}}, + /* 02 */ {{"map_forest02_00", "map_forest02_01", "map_forest02_02", "map_forest02_03", "map_forest02_04"}}, + /* 03 */ {{"map_cave01_00_00", "map_cave01_00_01"}, {"map_cave01_01_00", "map_cave01_01_01"}, {"map_cave01_02_00", "map_cave01_02_01"}}, + /* 04 */ {{"map_cave02_00_00", "map_cave02_00_01"}, {"map_cave02_01_00", "map_cave02_01_01"}, {"map_cave02_02_00", "map_cave02_02_01"}}, + /* 05 */ {{"map_cave03_00_00", "map_cave03_00_01"}, {"map_cave03_01_00", "map_cave03_01_01"}, {"map_cave03_02_00", "map_cave03_02_01"}}, + /* 06 */ {{"map_machine01_00_00", "map_machine01_00_01"}, {"map_machine01_01_00", "map_machine01_01_01"}, {"map_machine01_02_00", "map_machine01_02_01"}}, + /* 07 */ {{"map_machine02_00_00", "map_machine02_00_01"}, {"map_machine02_01_00", "map_machine02_01_01"}, {"map_machine02_02_00", "map_machine02_02_01"}}, + /* 08 */ {{"map_ancient01_00_00", "map_ancient01_00_01"}, {"map_ancient01_01_00", "map_ancient01_01_01"}, {"map_ancient01_02_00", "map_ancient01_02_01"}}, + /* 09 */ {{"map_ancient02_00_00", "map_ancient02_00_01"}, {"map_ancient02_01_00", "map_ancient02_01_01"}, {"map_ancient02_02_00", "map_ancient02_02_01"}}, + /* 0A */ {{"map_ancient03_00_00", "map_ancient03_00_01"}, {"map_ancient03_01_00", "map_ancient03_01_01"}, {"map_ancient03_02_00", "map_ancient03_02_01"}}, + /* 0B */ {{"map_boss01"}}, + /* 0C */ {{"map_boss02"}}, + /* 0D */ {{"map_boss03"}}, + /* 0E */ {{"map_boss04"}}, + /* 0F */ {{"map_visuallobby"}, {"map_visuallobby"}, {"map_visuallobby"}, {"map_visuallobby"}, {"map_visuallobby"}, {"map_visuallobby"}, {"map_visuallobby"}, {"map_visuallobby"}, {"map_visuallobby"}, {"map_visuallobby"}}, +}}; + +SetDataTableDC112000::SetDataTableDC112000() : SetDataTableBase(Version::DC_V1_11_2000_PROTOTYPE) {} + +pair SetDataTableDC112000::num_available_variations_for_floor(Episode, uint8_t floor) const { + return make_pair(this->NAMES[floor].size(), this->NAMES[floor][0].size()); +} + +pair SetDataTableDC112000::num_free_roam_variations_for_floor(Episode episode, bool, uint8_t floor) const { + return this->num_available_variations_for_floor(episode, floor); +} + +string SetDataTableDC112000::map_filename_for_variation( + uint8_t floor, uint32_t var1, uint32_t var2, Episode, GameMode, bool is_enemies) const { + if (floor >= this->NAMES.size()) { + return ""; + } + return this->NAMES.at(floor).at(var1).at(var2) + (is_enemies ? "e.dat" : "o.dat"); +} + static const vector map_file_info_dc_nte = { {"city00", {}, {0}}, - {"forest01", {}, {0, 1, 2, 3, 4}}, - {"forest02", {}, {0, 1, 2, 3, 4}}, - {"cave01", {0, 1, 2}, {0, 1}}, - {"cave02", {0, 1, 2}, {0, 1}}, - {"cave03", {0, 1, 2}, {0, 1}}, - {"machine01", {0, 1}, {0, 1}}, - {"machine02", {0, 1}, {0, 1}}, - {"ancient01", {0, 1}, {0, 1}}, - {"ancient02", {0, 1}, {0, 1}}, - {"ancient03", {0, 1}, {0, 1}}, + {"forest01", {}, {0, 1}}, + {"forest02", {}, {0, 3}}, + {"cave01", {0, 1}, {0, 1}}, + {"cave02", {0, 1}, {0, 1}}, + {"cave03", {0, 1}, {0, 1}}, + {"machine01", {0}, {0, 1}}, + {"machine02", {0}, {0, 1}}, + {"ancient01", {0}, {0, 1}}, + {"ancient02", {0}, {0, 1}}, + {"ancient03", {0}, {0, 1}}, {"boss01", {}, {}}, {"boss02", {}, {}}, {"boss03", {}, {}}, {"boss04", {}, {}}, - {nullptr, {}, {}}, + {"map_visuallobby", {}, {}}, }; static const vector> map_file_info_gc_nte = { @@ -1752,13 +1959,13 @@ static const vector> map_file_info_gc_nte = { {"boss02", {}, {}}, {"boss03", {}, {}}, {"boss04", {}, {}}, - {nullptr, {}, {}}, + {"lobby_01", {}, {}}, }, { // Episode 2 Non-solo {"labo00", {}, {0}}, - {"ruins01", {0, 1}, {0}}, - {"ruins02", {0, 1}, {0}}, + {"ruins01", {0}, {0}}, + {"ruins02", {0}, {0}}, {"space01", {0, 1}, {0}}, {"space02", {0, 1}, {0}}, {"jungle01", {}, {0, 1}}, @@ -1766,8 +1973,8 @@ static const vector> map_file_info_gc_nte = { {"jungle03", {}, {0, 1}}, {"jungle04", {0, 1}, {0}}, {"jungle05", {}, {0, 1}}, - {nullptr, {}, {}}, - {nullptr, {}, {}}, + {"seabed01", {0, 1}, {0}}, + {"seabed02", {0}, {0}}, {"boss05", {}, {}}, {"boss06", {}, {}}, {"boss07", {}, {}}, @@ -1796,7 +2003,7 @@ static const vector>> map_file_info = { {"boss02", {}, {}}, {"boss03", {}, {}}, {"boss04", {}, {}}, - {nullptr, {}, {}}, + {"lobby_01", {}, {}}, }, { // Solo @@ -1873,7 +2080,7 @@ static const vector>> map_file_info = { {"desert02", {0}, {0, 1, 2}}, {"desert03", {0, 1, 2}, {0}}, {"boss09", {0}, {0}}, - {nullptr, {}, {}}, + {"test01", {0}, {0}}, {nullptr, {}, {}}, {nullptr, {}, {}}, {nullptr, {}, {}}, @@ -1892,7 +2099,7 @@ static const vector>> map_file_info = { {"desert02", {0}, {0, 1, 2}}, {"desert03", {0, 1, 2}, {0}}, {"boss09", {0}, {0}}, - {nullptr, {}, {}}, + {"test01", {0}, {0}}, {nullptr, {}, {}}, {nullptr, {}, {}}, {nullptr, {}, {}}, @@ -1902,7 +2109,7 @@ static const vector>> map_file_info = { }, }; -const AreaMapFileInfo& file_info_for_variation( +const AreaMapFileInfo& file_info_for_variation_deprecated( Version version, Episode episode, uint8_t area, bool is_solo) { const vector* multi_index = nullptr; const vector* solo_index = nullptr; @@ -1919,8 +2126,7 @@ const AreaMapFileInfo& file_info_for_variation( default: throw invalid_argument("episode has no maps"); } - } - else { + } else { switch (episode) { case Episode::EP1: multi_index = &map_file_info.at(0).at(0); @@ -1952,14 +2158,14 @@ const AreaMapFileInfo& file_info_for_variation( return multi_index->at(area); } -void generate_variations( +void generate_variations_deprecated( parray& variations, shared_ptr random_crypt, Version version, Episode episode, bool is_solo) { for (size_t z = 0; z < 0x10; z++) { - const auto& a = file_info_for_variation(version, episode, z, is_solo); + const auto& a = file_info_for_variation_deprecated(version, episode, z, is_solo); if (!a.name_token) { variations[z * 2 + 0] = 0; variations[z * 2 + 1] = 0; @@ -1970,10 +2176,10 @@ void generate_variations( } } -vector> generate_all_possible_variations(Version version, Episode episode, bool is_solo) { - parray maxes; +parray variation_maxes_deprecated(Version version, Episode episode, bool is_solo) { + parray maxes; for (size_t z = 0; z < 0x10; z++) { - const auto& a = file_info_for_variation(version, episode, z, is_solo); + const auto& a = file_info_for_variation_deprecated(version, episode, z, is_solo); if (!a.name_token) { maxes[z * 2 + 0] = 0; maxes[z * 2 + 1] = 0; @@ -1982,38 +2188,32 @@ vector> generate_all_possible_variations(Version versi maxes[z * 2 + 1] = (a.variation2_values.size() <= 1) ? 0 : (a.variation2_values.size() - 1); } } - - vector> ret; - parray current; - for (;;) { - ret.emplace_back(current); - - // Increment current by 1 as if it were an 0x20-place integer, with each - // "place" having a base of maxes[x] + 1 - ssize_t x; - for (x = 0x1F; x >= 0; x--) { - if (current[x] < maxes[x]) { - current[x]++; - break; - } else { - current[x] = 0; - } - } - if (x < 0) { - break; - } - } - - return ret; + return maxes; } -vector map_filenames_for_variation( - Version version, - Episode episode, - GameMode mode, +bool next_variation_deprecated(parray& variations, Version version, Episode episode, bool is_solo) { + auto maxes = variation_maxes_deprecated(version, episode, is_solo); + + // Increment variations by 1 as if it were an 0x20-place integer, with each + // "place" having a base of maxes[x] + 1 + for (ssize_t x = 0x1F; x >= 0; x--) { + if (variations[x] < maxes[x]) { + variations[x]++; + return true; + } else { + variations[x] = 0; + } + } + return false; +} + +vector map_filenames_for_variation_deprecated( uint8_t floor, uint32_t var1, uint32_t var2, + Version version, + Episode episode, + GameMode mode, bool is_enemies) { // Map filenames are like map___(_off)?(e|o)(_s|_c1)?.dat // name_token comes from AreaMapFileInfo @@ -2024,7 +2224,7 @@ vector map_filenames_for_variation( // _c1 is used for the city map in Challenge mode (which we don't load, // since it contains only NPCs and not enemies) // e|o specifies what kind of data: e = enemies, o = objects - const auto& a = file_info_for_variation(version, episode, floor, mode == GameMode::SOLO); + const auto& a = file_info_for_variation_deprecated(version, episode, floor, mode == GameMode::SOLO); if (!a.name_token) { return vector(); } @@ -2067,5 +2267,18 @@ vector map_filenames_for_variation( return ret; } +vector> map_filenames_for_variations_deprecated( + const parray& variations, + Version version, + Episode episode, + GameMode mode, + bool is_enemies) { + vector> ret; + for (size_t z = 0; z < 0x10; z++) { + ret.emplace_back(map_filenames_for_variation_deprecated(z, variations[z * 2], variations[z * 2 + 1], version, episode, mode, is_enemies)); + } + return ret; +} + const shared_ptr Map::NO_RARE_ENEMIES = make_shared(0, 0); const shared_ptr Map::DEFAULT_RARE_ENEMIES = make_shared(0x0083126E, 0x1999999A); diff --git a/src/Map.hh b/src/Map.hh index 18db5475..a6088507 100644 --- a/src/Map.hh +++ b/src/Map.hh @@ -321,11 +321,28 @@ struct Map { std::vector rare_enemy_indexes; }; -// TODO: This class is currently unused. It would be nice if we could use this -// to generate variations and link to the corresponding map filenames, but it -// seems that SetDataTable.rel files link to map filenames that don't actually -// exist in some cases, so we can't just directly use this data structure. -class SetDataTable { +class SetDataTableBase { +public: + virtual ~SetDataTableBase() = default; + + parray generate_variations(Episode episode, bool is_solo, std::shared_ptr random_crypt) const; + virtual std::pair num_available_variations_for_floor(Episode episode, uint8_t floor) const = 0; + virtual std::pair num_free_roam_variations_for_floor(Episode episode, bool is_solo, uint8_t floor) const = 0; + + virtual std::string map_filename_for_variation( + uint8_t floor, uint32_t var1, uint32_t var2, Episode episode, GameMode mode, bool is_enemies) const = 0; + std::vector map_filenames_for_variations( + const parray& variations, Episode episode, GameMode mode, bool is_enemies) const; + + uint8_t default_area_for_floor(Episode episode, uint8_t floor) const; + +protected: + explicit SetDataTableBase(Version version); + + Version version; +}; + +class SetDataTable : public SetDataTableBase { public: struct SetEntry { std::string object_list_basename; @@ -333,31 +350,68 @@ public: std::string event_list_basename; }; - SetDataTable(std::shared_ptr data, bool big_endian); + SetDataTable(Version version, const std::string& data); + virtual ~SetDataTable() = default; - inline const std::vector>> get() const { - return this->entries; - } + virtual std::pair num_available_variations_for_floor(Episode episode, uint8_t floor) const; + virtual std::pair num_free_roam_variations_for_floor(Episode episode, bool is_solo, uint8_t floor) const; + virtual std::string map_filename_for_variation( + uint8_t floor, uint32_t var1, uint32_t var2, Episode episode, GameMode mode, bool is_enemies) const; - void print(FILE* stream) const; + std::string str() const; private: template - void load_table_t(std::shared_ptr data); + void load_table_t(const std::string& data); // Indexes are [floor][variation1][variation2] // floor is cumulative per episode, so Ep2 starts at floor=18. std::vector>> entries; }; -void generate_variations( +class SetDataTableDCNTE : public SetDataTableBase { +public: + SetDataTableDCNTE(); + virtual ~SetDataTableDCNTE() = default; + + virtual std::pair num_available_variations_for_floor(Episode episode, uint8_t floor) const; + virtual std::pair num_free_roam_variations_for_floor(Episode episode, bool is_solo, uint8_t floor) const; + virtual std::string map_filename_for_variation( + uint8_t floor, uint32_t var1, uint32_t var2, Episode episode, GameMode mode, bool is_enemies) const; + +private: + static const std::array>, 0x10> NAMES; +}; + +class SetDataTableDC112000 : public SetDataTableBase { +public: + SetDataTableDC112000(); + virtual ~SetDataTableDC112000() = default; + + virtual std::pair num_available_variations_for_floor(Episode episode, uint8_t floor) const; + virtual std::pair num_free_roam_variations_for_floor(Episode episode, bool is_solo, uint8_t floor) const; + virtual std::string map_filename_for_variation( + uint8_t floor, uint32_t var1, uint32_t var2, Episode episode, GameMode mode, bool is_enemies) const; + +private: + static const std::array>, 0x10> NAMES; +}; + +void generate_variations_deprecated( parray& variations, std::shared_ptr random, Version version, Episode episode, bool is_solo); -std::vector> generate_all_possible_variations( - Version version, Episode episode, bool is_solo); -std::vector map_filenames_for_variation( - Version version, Episode episode, GameMode mode, uint8_t floor, uint32_t var1, uint32_t var2, bool is_enemies); +parray variation_maxes_deprecated(Version version, Episode episode, bool is_solo); +bool next_variation_deprecated(parray& variations, Version version, Episode episode, bool is_solo); + +std::vector map_filenames_for_variation_deprecated( + uint8_t floor, uint32_t var1, uint32_t var2, Version version, Episode episode, GameMode mode, bool is_enemies); +std::vector> map_filenames_for_variations_deprecated( + const parray& variations, + Version version, + Episode episode, + GameMode mode, + bool is_enemies); diff --git a/src/ReceiveCommands.cc b/src/ReceiveCommands.cc index 2616d24d..b2664df3 100644 --- a/src/ReceiveCommands.cc +++ b/src/ReceiveCommands.cc @@ -4200,8 +4200,19 @@ shared_ptr create_game_generic( game->rare_enemy_rates = s->rare_enemy_rates_by_difficulty.at(game->difficulty); } - generate_variations(game->variations, game->random_crypt, game->base_version, game->episode, is_solo); - game->load_maps(); + if (game->episode != Episode::EP3) { + // GC NTE ignores the passed-in variations and always uses all zeroes + if (game->base_version != Version::GC_NTE) { + auto sdt = s->set_data_table(game->base_version, game->episode, game->mode, game->difficulty); + game->variations = sdt->generate_variations(game->episode, is_solo, game->random_crypt); + } else { + game->variations.clear(0); + } + game->load_maps(); + } else { + game->variations.clear(0); + game->map = make_shared(game->base_version, game->lobby_id, game->random_crypt); + } return game; } diff --git a/src/ServerState.cc b/src/ServerState.cc index 16339f34..2e000cb4 100644 --- a/src/ServerState.cc +++ b/src/ServerState.cc @@ -31,8 +31,8 @@ ServerState::QuestF960Result::QuestF960Result(const JSON& json, std::shared_ptr< } ServerState::ServerState(const string& config_filename) - : creation_time(now()), - config_filename(config_filename) { + : creation_time(now()), + config_filename(config_filename) { this->create_load_step_graph(); } @@ -371,6 +371,21 @@ void ServerState::dispatch_destroy_lobbies(evutil_socket_t, short, void* ctx) { reinterpret_cast(ctx)->lobbies_to_destroy.clear(); } +shared_ptr ServerState::set_data_table( + Version version, Episode episode, GameMode mode, uint8_t difficulty) const { + bool use_ult_tables = ((episode == Episode::EP1) && (difficulty == 3) && !is_v1(version) && (version != Version::PC_NTE)); + if (mode == GameMode::SOLO && is_v4(version)) { + return use_ult_tables ? this->bb_solo_set_data_table_ep1_ult : this->bb_solo_set_data_table; + } + + const auto& tables = use_ult_tables ? this->set_data_tables_ep1_ult : this->set_data_tables; + auto ret = tables.at(static_cast(version)); + if (ret == nullptr) { + throw runtime_error("no set data table exists for this version"); + } + return ret; +} + shared_ptr ServerState::item_parameter_table(Version version) const { auto ret = this->item_parameter_tables.at(static_cast(version)); if (ret == nullptr) { @@ -450,11 +465,8 @@ shared_ptr ServerState::load_bb_file( // First, look in the patch tree's data directory string patch_index_path = "./data/" + patch_index_filename; try { - auto ret = this->bb_patch_file_index->get(patch_index_path)->load_data(); - static_game_data_log.info("Loaded %s from file in BB patch tree", patch_index_path.c_str()); - return ret; + return this->bb_patch_file_index->get(patch_index_path)->load_data(); } catch (const out_of_range&) { - static_game_data_log.info("%s missing from BB patch tree", patch_index_path.c_str()); } } @@ -464,11 +476,8 @@ shared_ptr ServerState::load_bb_file( try { // TODO: It's kinda not great that we copy the data here; find a way to // avoid doing this (also in the below case) - auto ret = make_shared(this->bb_data_gsl->get_copy(effective_gsl_filename)); - static_game_data_log.info("Loaded %s from data.gsl in BB patch tree", effective_gsl_filename.c_str()); - return ret; + return make_shared(this->bb_data_gsl->get_copy(effective_gsl_filename)); } catch (const out_of_range&) { - static_game_data_log.info("%s missing from data.gsl in BB patch tree", effective_gsl_filename.c_str()); } // Third, look in data.gsl without the filename extension @@ -476,11 +485,8 @@ shared_ptr ServerState::load_bb_file( if (dot_offset != string::npos) { string no_ext_gsl_filename = effective_gsl_filename.substr(0, dot_offset); try { - auto ret = make_shared(this->bb_data_gsl->get_copy(no_ext_gsl_filename)); - static_game_data_log.info("Loaded %s from data.gsl in BB patch tree", no_ext_gsl_filename.c_str()); - return ret; + return make_shared(this->bb_data_gsl->get_copy(no_ext_gsl_filename)); } catch (const out_of_range&) { - static_game_data_log.info("%s missing from data.gsl in BB patch tree", no_ext_gsl_filename.c_str()); } } } @@ -490,11 +496,8 @@ shared_ptr ServerState::load_bb_file( static FileContentsCache cache(10 * 60 * 1000 * 1000); // 10 minutes try { auto ret = cache.get_or_load("system/blueburst/" + effective_bb_directory_filename); - static_game_data_log.info("Loaded %s", effective_bb_directory_filename.c_str()); return ret.file->data; } catch (const exception& e) { - static_game_data_log.info("%s missing from system/blueburst", effective_bb_directory_filename.c_str()); - static_game_data_log.error("%s not found in any source", patch_index_filename.c_str()); throw cannot_open_file(patch_index_filename); } } @@ -509,25 +512,20 @@ shared_ptr ServerState::load_map_file_uncached(Version version, co try { return this->load_bb_file(filename); } catch (const exception& e) { - static_game_data_log.info("Failed to load %s from BB patch tree: %s", filename.c_str(), e.what()); } } else if (version == Version::PC_V2) { try { string path = "system/patch-pc/Media/PSO/" + filename; auto ret = make_shared(load_file(path)); - static_game_data_log.info("Loaded %s from PC patch tree", filename.c_str()); return ret; } catch (const exception& e) { - static_game_data_log.info("Failed to load %s from PC patch tree: %s", filename.c_str(), e.what()); } } try { string path = string_printf("system/maps/%s/%s", file_path_token_for_version(version), filename.c_str()); auto ret = make_shared(load_file(path)); - static_game_data_log.info("Loaded %s from default maps", filename.c_str()); return ret; } catch (const exception& e) { - static_game_data_log.info("Failed to load %s from default maps: %s", filename.c_str(), e.what()); } return nullptr; } @@ -1129,6 +1127,36 @@ void ServerState::clear_map_file_caches() { } } +void ServerState::load_set_data_tables() { + config_log.info("Loading set data tables"); + std::array, NUM_VERSIONS> set_data_tables; + + auto load_table = [this](Version version) -> void { + auto data = this->load_map_file(version, "SetDataTableOn.rel"); + this->set_data_tables[static_cast(version)] = make_shared(version, *data); + if (!is_v1(version) && (version != Version::PC_NTE)) { + auto data_ep1_ult = this->load_map_file(version, "SetDataTableOnUlti.rel"); + this->set_data_tables_ep1_ult[static_cast(version)] = make_shared(version, *data_ep1_ult); + } + }; + + this->set_data_tables[static_cast(Version::DC_NTE)] = make_shared(); + this->set_data_tables[static_cast(Version::DC_V1_11_2000_PROTOTYPE)] = make_shared(); + load_table(Version::DC_V1); + load_table(Version::DC_V2); + load_table(Version::PC_NTE); + load_table(Version::PC_V2); + load_table(Version::GC_NTE); + load_table(Version::GC_V3); + load_table(Version::XB_V3); + load_table(Version::BB_V4); + + auto bb_solo_data = this->load_map_file(Version::BB_V4, "SetDataTableOff.rel"); + this->bb_solo_set_data_table = make_shared(Version::BB_V4, *bb_solo_data); + auto bb_solo_data_ep1_ult = this->load_map_file(Version::BB_V4, "SetDataTableOffUlti.rel"); + this->bb_solo_set_data_table_ep1_ult = make_shared(Version::BB_V4, *bb_solo_data_ep1_ult); +} + void ServerState::load_battle_params() { config_log.info("Loading battle parameters"); this->battle_params = make_shared( @@ -1505,6 +1533,10 @@ void ServerState::create_load_step_graph() { // Out: lobbies this->load_step_graph.add_step("lobbies", {"all"}, bind(&ServerState::create_default_lobbies, this)); + // In: bb_patch_file_index + // Out: set_data_tables + this->load_step_graph.add_step("set_data_tables", {"all", "patch_indexes"}, bind(&ServerState::load_set_data_tables, this)); + // In: bb_patch_file_index // Out: battle_params this->load_step_graph.add_step("battle_params", {"all", "patch_indexes"}, bind(&ServerState::load_battle_params, this)); diff --git a/src/ServerState.hh b/src/ServerState.hh index de27ebf1..ead8d29c 100644 --- a/src/ServerState.hh +++ b/src/ServerState.hh @@ -148,6 +148,10 @@ struct ServerState : public std::enable_shared_from_this { std::shared_ptr text_index; std::array, NUM_VERSIONS> item_name_indexes; std::shared_ptr word_select_table; + std::array, NUM_VERSIONS> set_data_tables; + std::array, NUM_VERSIONS> set_data_tables_ep1_ult; + std::shared_ptr bb_solo_set_data_table; + std::shared_ptr bb_solo_set_data_table_ep1_ult; std::array, 4> rare_enemy_rates_by_difficulty; std::shared_ptr rare_enemy_rates_challenge; std::array, 3> min_levels_v4; // Indexed as [episode][difficulty] @@ -272,6 +276,8 @@ struct ServerState : public std::enable_shared_from_this { std::shared_ptr proxy_destinations_menu(Version version) const; const std::vector>& proxy_destinations(Version version) const; + std::shared_ptr set_data_table(Version version, Episode episode, GameMode mode, uint8_t difficulty) const; + std::shared_ptr item_parameter_table(Version version) const; std::shared_ptr item_parameter_table_for_encode(Version version) const; void set_item_parameter_table(Version version, std::shared_ptr table); @@ -314,6 +320,7 @@ struct ServerState : public std::enable_shared_from_this { void load_item_name_indexes(); void load_drop_tables(); void load_item_definitions(); + void load_set_data_tables(); void load_word_select_table(); void load_ep3_data(); void load_quest_index(); diff --git a/system/maps/bb-v4/SetDataTableOff.rel b/system/maps/bb-v4/SetDataTableOff.rel new file mode 100644 index 0000000000000000000000000000000000000000..0705d70a5a05c9fd082e636e84846b26a93d1f2b GIT binary patch literal 10624 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 SGt2&sFJC?*`7@8P|MOo(VEd&2 literal 0 HcmV?d00001 diff --git a/system/maps/bb-v4/SetDataTableOn.rel b/system/maps/bb-v4/SetDataTableOn.rel new file mode 100644 index 0000000000000000000000000000000000000000..7edf6c7af7862d81d5af217852f782f130aecc41 GIT binary patch literal 10816 zcmd^DEl_328NIV%6OxdGBqVuBCRsK?AP{e6*j=^?ftacw5F-!>s`!1gka`2JfZcsl zg+L$>2*d~k0x<%CKp+qZ1OkCTj6fg|BM=A#0)fam-KYEZ?Y<;a*^J8U9?t3Sp0E4s z@AkX*!K;bJ*wpOO>uPnZTFtWTl^=W9{1_MJ$Jow4HSt}|RByLu*7PyA-`w-Wt?N8yyyCfJEXso?S&wBD_KiTHj~tieC4Gdc&@YZl@{)52U*TMG z9OS*4n3|cL%RlPuLl|?lhcTu{KGW7XR+4L48~IFY<5)?qX>a7iZtU|lsE_T9>w_<; z*|a#Ck1dXKO`9X1X>%Ma$u+GGecWtZvuQxIuJsjbW&=uc{h4z;u)ZYMEECn@-xonH z(+fR7An7w>@qVo@$xZqUU(#pBO4d#K3?GkkT%Ygr#N5DX4mrLV68kBd4jdPr?3_c@me;CJ-0a+Cu=blu7$BpGiSx;X{~>L zJNHf9-Y|3Bjoo>5V@}F-^RYb(8k-e@>zLivkY6w4v#4-Be8lZDM1KEybmM4!_zU@b zj+kZzHTY+X=CB_1CXd+$7V`?V^4a5in&;W37W3ko%r?V)`tKZ?$3IuxINB%tg*m^B z`sANO%Ks|5?w?Ef^}^oZFU*gz{hdAc+uzw2YZH^TX>;0qpM#j$V=(sp%42z-gIJW8 z_c{0EeGXz#9z5=|Z0lrFT&J0c_e=9wPm-6^X(lh`C3V7MrVs04EFSwh&HD;>pYs}x zJLxs2l!dwMR-;(zN#;UcGMC+caV|Y$e4X$lbD1th zYnrD)9E-;#bD5`t^-V2IEb(m^o`WD}>I}yIz7%4rf4a6TGpfU8+gpk3Fc-u+O1^o zfsg6jnZIfJo#{UD@0@m8v$rMpmrb*h_4pX(asS#O9{(=O9+8C}aKAu3Bv6kE)OCTn zia9<7FAMA7ErEJhpgt6+PX+2F&2a%u+yJI96i3|wCc1$>fqF<72R8)jRbdmnBTyd- zXW&bL`c`QDB+DuS^#SSvWoP0marS!~uZXMS9+-&%;DtavEi}Pv0`-=#2R;(0-w9XX zJAu0GM_JYh^Z|pwsB}~7Z-{rqN8)qw68yv(uqjaQ3P<2Gf%?602X1Y#pneQZRDl73 zdRUkNHwEf-VH>Lf%;r^-H2N&c0ZlsKJg224|0eBU|67@5thLl0`*(r0DLM? zUkbP2)}L5VKZYi%z;l6mM5u#T1nN!IwI@CiUyARy((;icLnMZt=|x@iMPcE;v;y8cfgfEeJ`~CG|RdK>ONrzJT6c# z32WdjfqG9k2A>PmcUr&wPqt6p;sNo9_!?d!`x(xvK;13$gI@^L(?S!xE>Ld^``{CS z`a-w?xBT3KdQX^Z|pyD7Y@HfS2W66TcB};2QB3*cVQ~ z=fXAkK;C2VnfM;pi1uIN9VzsJp9>@4TY0m;>Yj*aaE)jJYXbGAKwX6wufA*tnm7PX z1nP5vdQ{#kXyOiN{gnlE1)88T!X(AyBUf)We!%TwE77#jD~C zc!{^bzCe8g?AR9pEm3`T+B>2WR3daUZS`L%^s&-4Is6Zv^Tc;ShW(P**zb z{8jOw_!8F~nuxJ)*N8c+D|UyN!?t2Azrpib*jKC_W1JxZ*E=Qq>2CyPf zzY(Z!<=ufM4uMmF`ck0o{M^oa3r)2C7W)>cdj#qsc?Y10VPIOIZVE=ryN(#K4eSZW z;CI3m_$|DTu(v(&q4*Bhh_()V-w~**0`(=l?8|d#Vg#5Gmci@7Hn{C?cAbj2OT33` z#4#|a*gI(A3K&)F4w`7g?*|RVx}jNnUA!kA#CLIgRm*O`_*$9m;JYKoGx)AW?#6cs z@)?-d8+bR9+wndjKi7L@L|hlIi2Lz;=g0aS%>8%ZnMdx^v+qLVik>^u8gGk-5og^i z;$88*{C)bYW}SB4aq%jcd7I*0@sW5)c^hEv<67~`=Qi)TxFOyWpMY6^i~3pxb3Cl^ zjCfhR3jW8Zk5J1aJOeC0^z(;ae`ww`{t0Sv|D{(yJmTi~PnG{SGyZ?f`M>Gl$C<_5 zfrt3R@9Kv;^PQBbbRO&a_i&z2-Lm`nFO$UXd;kCd literal 0 HcmV?d00001 diff --git a/system/maps/bb-v4/SetDataTableOnUlti.rel b/system/maps/bb-v4/SetDataTableOnUlti.rel new file mode 100755 index 0000000000000000000000000000000000000000..7e8118a2a20455c17668eead49a3eef18ffc0b28 GIT binary patch literal 9344 zcmd^?FHl|E8O2XtX-iw$M_by`mbQop1mckJ-lH=JL<9nXKp>dm@698f8(@IE-pn8( zm?;8*Kp+r^2m}IwKtv!AhzJA%frvmLA`plx5M68UwfEU)??Ydv=~K;nzpS;t^L_iz zcg{Wc=H>L#|!s^mjG0dwV>yrjNPv7CC)xU6*4H9_2B~^htHdN$Rix zwzHJSLxpw7N$Q?f)IE*rkdxH)SJd@Kb;wETzN)DEDylvUj$KAV%&CH+(r z!n&lN$kFsg{}>DRX>*eGl71qu)K88p&X@EPd5ldiK7Wp7OZzDG+2$qtVDFP!ZZ7Vl zHthRhbIS8^!xeQ*3hRSajc@&v^UDbY3%zo*dN;) z?+~zR%MOvoC53_KVl`DvY_> zFy__`V!qE|tfJOG&p{rxXrIY2R#A&Q+p8eY_c@GJ)cWT+$n$*;V->Z&&n}M}j`wU1 zfnq){<-GEqd5DTy|4at8Nv}|AmWkHz&ty=`W#YXgy+V?ICWG3fSIA3x#aP@cn^#_! zi^k_Q8;N>l^OD-6S7vi*ZPF{`VLRpLim`alHZNHh;iNX{6_W6OQk(P&NlC95bG0*z zD=T^5D|5fBx6hIB*fH<7@z{a)n32A|I5YE_6R9T}`*UjS_pY(ukH-ETq4C$zeBVUl zfoS~q^0?1`huis zbkW^6>+QX<-u{k<_s@m(J_m7|Q=gt$bU&EPT4rq5U0Ir*Ex!HZSTr`fiDS{&>?V$d zVd7P05H z2IFKc#=^BQwq@qI@O4`2AFmd^t=k)BuDh{&Ufr0Ja@}HVp9PK03c+>EZud}JFV%BX z;e7bG+xLm`{pZn*qxF$rs^>e!G%MJHf6r(Ro1@+oG26g$U1_g;5BZ)Jb+)PHx_D3K znBh77?+?x6-z#n$ofG+`IlqqjD7>mb#pXU1tcc1ebk2~o-?wa@Jn}naHENcf{zsa&kRM86^6!as4enQaK z1$~Y=ehgg`o6ucBe<0}J3HtYfepPc^!IN8HHipg7cR)!G7!dR$VhXw>=-0&#bYIZF z6X(zmg8ojlevxIJg8mr$f@J5?8)^1i8}F3n(q1H!AuuZF=R^a#A?SC-A@oGhUx*uM zQ_#2lD9gIR02l@n@(r!OCEb^vNH3+U$R`_MN6;UL6X?01zZOksYm0@x3!da)NYIao zd1yn>Z;CzWp`h>Vuzk#>!_p~fL%JnBMGd(G9|gU60PzrZfF40VC`O@kg1#X(p?iY< zNSr~h1pTdO`3d$c=r6UeTWRa>?0LGS1JY4xFKWmT7!&mKVhy?_=--NC=zBr`LEJ%G ze`=xcf+sn6Cg{gS9r{Ml?`U6#(lhA?X;a$%dwZ^J)R2AfPSBr=YiLu@x3yZjq5Xn> zSWG~d1pT_$fgT9@ajm~3-H`4{kEJKbB^TgE(BF&ppJmx&K|dfypi_c=Rct_a1^uBo zgqO58$Qeqo{C z(fWtdGwBCuQ`(7|$6}zc*i!p<1M`7 z2;OlD@3??>T*Eu=;2o`P_Ij~sFgdKEi`Czs$x z+(X-bY3YUzDR)FVF3oX`JOg859@-F_&^6_5NVlcCxJC}aiMW7Xizf6~xu?=|Y3r|W zpFtPs6+_TbF$cXw=-&$Z9J%=F%Z}j5DYy{y*MfdRxp(lSF~^Z&J&19Ry7W*wjNfzky3cN*_-T^u%;F?fE}h3_{pYybf0*?tb)T0XR$E`a zk2EihJiOb7XAWm6dKpF^@(-<+=7*W?bg34rf1ay)x0=}B@cRQ_uzbh!&&^-0y1)Mo Dt`yJG literal 0 HcmV?d00001 diff --git a/system/maps/bb-v4/map_city02_00_00e_c1.dat b/system/maps/bb-v4/map_city02_00_00e_c1.dat new file mode 120000 index 00000000..5580ba73 --- /dev/null +++ b/system/maps/bb-v4/map_city02_00_00e_c1.dat @@ -0,0 +1 @@ +map_city02_00_00e.dat \ No newline at end of file diff --git a/system/maps/bb-v4/map_city02_00_00e_d.dat b/system/maps/bb-v4/map_city02_00_00e_d.dat new file mode 120000 index 00000000..5580ba73 --- /dev/null +++ b/system/maps/bb-v4/map_city02_00_00e_d.dat @@ -0,0 +1 @@ +map_city02_00_00e.dat \ No newline at end of file diff --git a/system/maps/bb-v4/map_city02_00_00o_c1.dat b/system/maps/bb-v4/map_city02_00_00o_c1.dat new file mode 120000 index 00000000..39199e78 --- /dev/null +++ b/system/maps/bb-v4/map_city02_00_00o_c1.dat @@ -0,0 +1 @@ +map_city02_00_00o.dat \ No newline at end of file diff --git a/system/maps/bb-v4/map_city02_00_00o_d.dat b/system/maps/bb-v4/map_city02_00_00o_d.dat new file mode 120000 index 00000000..39199e78 --- /dev/null +++ b/system/maps/bb-v4/map_city02_00_00o_d.dat @@ -0,0 +1 @@ +map_city02_00_00o.dat \ No newline at end of file diff --git a/system/maps/bb-v4/map_test01_00_00e.dat b/system/maps/bb-v4/map_test01_00_00e.dat new file mode 100644 index 00000000..e69de29b diff --git a/system/maps/bb-v4/map_test01_00_00o.dat b/system/maps/bb-v4/map_test01_00_00o.dat new file mode 100644 index 00000000..e69de29b diff --git a/system/maps/dc-v1/SetDataTableOff.rel b/system/maps/dc-v1/SetDataTableOff.rel new file mode 100644 index 0000000000000000000000000000000000000000..e1b7e740b51ddd7ede3c86692e196bb76bd1938b GIT binary patch literal 3552 zcmd5-Eo@U!7=42Q11csbpFl38Yo9UYn`_(oQMKBvR+A*z z9UrehUvKB;c(e0%;~=jt(ZTc1akI0zS<-CEt~2q~N}gu57UY`M%=2Wvr{?X?Ty zAHKS~Hjjgxw?90S{ny%u8|LcmEi!Alnpv#4cZF9)%>9&RZlLF*7RxV1^1NWgOZ!uc z^zzbzJavD6XhDBzv3$@U-k`s< zSl;cw+g{t+-kZEad?#E@Rn2pCbu{)ha|vF)s2cGGd2dAK(9?6TDoubWf>G$#dzF7hjj4KebridV_q>AHHaR z>XH3}{_sWnQ!nzXor42hin$g$+s6DJnB$srPOFX2)tz&7FK7S7OxDdDZ#MBBZXdjB z@9cC|SC5R>IWBG;e^$-kJU-7KCCLmp1^9#e8dw3gG#`Vzny=u!kGTh&0%yP_aIN_k zT)|@0=jN<8#c>8SfEJJgU7!c_fdP=g3rb#z8{#3v5m338Bq@*q4WI?&Ko{7T_gMT% z+{3v(FaUY7_$Kdn@tL@Vb3_hw1SGN2)FZV5TKD{$@!eegiwysY(F;`ibq&JiP^^1y;~ikZlOhQPTcCCn~UNVFkZ3bv-qdDif2UqM0_KDgZ|V{#TUAsYw@jkUj3heAtgDu`1?IGgDx|8 xr!Bjmf3Mw}lE0ho?rmr0V=ew?XVG^$+pD_EXYsTmTuG8&kj?u99y!mJ?my#4)ENK( literal 0 HcmV?d00001 diff --git a/system/maps/dc-v1/SetDataTableOn.rel b/system/maps/dc-v1/SetDataTableOn.rel new file mode 100644 index 0000000000000000000000000000000000000000..5b33adf9ee9f3f5c2b422a726e64b9ac1f31210c GIT binary patch literal 3680 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 GB>w`CJyPBP literal 0 HcmV?d00001 diff --git a/system/maps/dc-v2/SetDataTableOffUlti.rel b/system/maps/dc-v2/SetDataTableOffUlti.rel new file mode 100644 index 0000000000000000000000000000000000000000..6000d05ed79da7d034b7db6bb4856b119eae1dde GIT binary patch literal 5664 zcmcJRFHluk9LKN9?y|e=`gWIKFc1hY7@qK)ArM|5Y#_W~FffBpkbxPLHw!vALm&_c z1cHG;AQ%V)f`LFV7zhM|fnYEY2nGXzVA#*^p6|V!d(L4;XI%8-_ji8x_d9>S@4PEd zI^D^sxuqA4#$=HT)~06IpV!7wPp~#MmupXTot(QCO>?>)aaKUi>H<)U60liySGopI!| za;e^m&(vwUOP`fX^;UeQF7jEqRBy#+>LQ<&OZ8TK&OgY&E9IhIZLsu;apaY9sosiL z)Un0tom4K>Tk(oI{zko)OZ8T~qA2o8xm0iHRdgrmP2Ne%>rOuDOwG=V7@-Z}fRk7kO{FqPO#OYVPq<_n&=nUO!iy*Uu$-OP{^E^4|No zL@(QMK6`bg&weh^Tl(zPl|K8qL~rS{S6BM%=fYmwaJc9E5V}`Iud8!+!^=fpQ5Sh- zxx~8pGWLD*=8L?dD4#N@i@c&J^2&0FbtA8+i@dU2*lUZ1UgaAJymEC_uWTcU-pDIg z7xl88>b;^a^2&0FJ(G@lBd;jpZ?taY6-AL(mMeN6Ei5iJ?mo-kH7<7V$~@|?ppwX9Q z*U;N=2U^gEhtPs0SW`Sk?G55B*o8wlh7XEAqc)l4yQ=MHT!$94VH#Fo19sp5j^G2F zL(lary9Ets!F`yAZRX=~wkv%teIq@Vo=8{d*@Rs%!tuXu~ut!-nF|>8x~zKI1hU35!37&uGt24vTLQ8+V{3EWR&h(G_9wrg()O2#b%!NAz4+ysv#7 zNk2+2q_vywTy<%0FK30@&=3}ni3jMsuy|FxM0bV7hvFT2DlEPbeLr)TgvDL0zb@U8 z9!TFwo75VA!-TN7E7s60Vey`LgT5CQpNTJM?H7l|gT%%Nj0=lvyin{O)TJ%y18G$u!|i{A+AYy0 zXYZX?j0>if+qXHzvT}!vkHv;^CyWbrl>1(K#@q$x#044e!GbSZv-eMTmVRj;H3heb z3kHb`MpQc{ZA(X~F<)k-FQum_U)ik9JHcKhZ%`Yr@?A1*aYs$hP6u5s?6mMzHSd!&Ex04*PNI0__Kd&{Qt~SxOKH&u3JR$&fSx%@R literal 0 HcmV?d00001 diff --git a/system/maps/dc-v2/SetDataTableOn.rel b/system/maps/dc-v2/SetDataTableOn.rel new file mode 100644 index 0000000000000000000000000000000000000000..460e3a4c108f4022b930629ac519aba18bf02dde GIT binary patch literal 5856 zcmd^>El^}f6onszBqSl(O@crmR;)lE2AHivj6keFAP|TZQ^f)U1y%f2m{4rh2m}H# zA_9RxAP_4?AVx%tKp+qZ1Y*Sq1OkCTAP|V0(|!8Uultdtl8p+x-=5QV?(M$sPS3C_ zGwaiHOVtmB!gQgKB*{v;wtivlm-&rqVTiBtHMd4;W<6aP3f9BHdL&pE{q=CL|8THB zUeD~0b!LC8Gy7w0_n({DoHyOu$1`W9G55SrIYaJTmt!70$YYY3lj@KY)u927Gn2=M z^6QWj)s5uTjRbYbiRy|ub;Y0#IZ@r4oVqtb9dfdDe7LYq51c-q&57!wd1?rLT{KVR zX#1!6G3NJabE5O2c_J?}Pp)&GFPbOv7@J;OSirHFJ~DH*c~KvneN@Zl!a1tpbRIS* zyB{0Qsbi8~7tIlMXfJy&84K!=6P?F4GS7`bW{zCv)J1bdQf6LU=hQ{_5_y?>$+cIv zGBdZhwEFZ>=N$Z)>)nsBJjgR+4P!aAX0$<`8EqKLsWsyb^6)hF`_=1@;|=>mUevQ0 zaj+jp9M+mK2YF`9VJxTCjM~rR!-hSZ0R-pTyll@LKu&FX=iCfzUQ}z233^F?UwE}F z&&&XUXwHm<&ujCd+Gx(mi{{K&&biT?k;m&C_Lt6iW_509e%1csb+htguGWvabG=wP zXFrxxo8D(H4=vg|>Bn+vk!NS+<)w4>V>z|yefILwIs37k+H}q?j}3=Cn} z+cO^`r#8KlUTrih)S6?0GtxWh)$*9ImuOZEMnuE9*3rCZ@1c%=x zNe8rF3_?qSenQZf1^u$1Z(@%xp*2y59tiq|pl=EKb3y;0J=*Z(4w%N!9DOg841iHV zKOx>j*9HBK*oS@;^eu4#y%O~IqPsIm`UHKcCrKd5lyq6TBR!BdrGrQ&V_;IySHu={ zSI{4bW9W&XzZ5sn2SMNSMUuP%qhK7A-~YnSwJ4pCR-`rQo>SE9fsddi=r6=I z^g+<~bX#6Qi-LY!l%eZ_en;#>8-l*A^Y5iS`0~QXA$ct=Nl%bVF2RkUe-tmjL5-jv z6%)|+g1#ztp$CHgSe!yX3HqAO-;*|^r_#3c7P%z(7I#(94~PAq> zd|f1i_{?*CD{bKJay^B+z}N4kdzcm1XPQ}CdMEADxqVQ)l}R0nui)fNdIj}=ZaO>A zPX|69R-gO#-@g9bzHz)0y|_Q|tA9V@_V}yL|H+R3k3B!n1pk{|+&l2RKAr1a{7&0f Zo{PJ>Khy1>@%@SqG(Xe)S;yM{`2(r9J@Nnm literal 0 HcmV?d00001 diff --git a/system/maps/dc-v2/SetDataTableOnUlti.rel b/system/maps/dc-v2/SetDataTableOnUlti.rel new file mode 100644 index 0000000000000000000000000000000000000000..71c623e52ba9e310601cbc18fa6ece1301a9cb3e GIT binary patch literal 5856 zcmd^>El^!o6ooI8wy!O1Xd8h*AP@+|uKW_?Q$P5Az@dP3w z0)cp<0)aq8AP`SPAR-V51OgGkOc96(1fpx5v(DxGT-r{Xs*-$J>+HApIs5K+-Xp6s z)v3AV%~yFomFHQOtrlzR7uSDX*x1Z_`6^#?YorG2sk}E@_eJaeXg%Ps`=b5(qW$rD zus_zp{#Xb5V{P}Jo7q}0-P^}AXBIK{ypK7(?p&8+9z4opl9`k0kdxG*0gf}s<3ss% z$Vuw@OX~WgI^-mE10{6>Q5|xUx)&vNFQPi+gmrwlxK0mTJfF=;>XLbC2!35MPvmI( z$N4el_i1yI^OAWYFPJCSCC``46M2kHtuHR(*r1PK&NeUUgR@U+*<3tFHC)WY=7jsP z;gUKg`E|)0QHS=zd&yW-hn(a*wh=rx0>K=)E~!iAh@@a%T$j`(_Y!%*z2w@fTb-F( zT3&nnsB;c}%=PZaSRUn>vBt5IS~J=x&x|&XmDHN?MtOJ|`~B+m$MMGfAus9Kj5ykl zBaUm$n4>&1<~UYTYewzo@nPeh%>bfvZC=fdC8m^D>*lrGxB(ylacdi#J=IqBx zYK!~q<)KA;C;eDSE%NNFyu4!0eypUnxX)f*F=szkQd`W~<+0(oXY&v!=6wnC!k+mM zCAGz!^lFn?q1GG|ol)FLua?Key(F_jQgJ7}+GJM9OJ>DbJS&?Qp36hy=QWK)v$A84<^nwSlAW zvaAW(A$p)gf__xcPYU`KLEpe0UqW}p9`r!a9|`(XLH|L}x3t1^5iluV`QG-~DIJuKNtdLX$R{h?s;{1^sKW4?Pm}H#(nRTKE`b?b2L2B5fd-T(CyaKZv$(vaCzc z4~kLfw4mPACbqdW&3=eT%y)=)1)bbWG6Ci*4whps$N} z&@(}QCGMat_+BRT-9PGmmQF~k(wej#`CZ}+F?=m%Io6IV#fA`b+$lDKn4{$JWOsq{>Gf*j7}K{|}@ey%T}_y}gZ z`0m2jMK*}fJlFTq6Wn30r*RkfdWN}C>(UF&@kaU}ZPU43P`s7dJ``WU*@g5L`g?N| zdT7FD!|GH2{@d4|+Bc0iqZjulef950+#Y|``9In5|FP%inc#o3i+cy2*2i<5OW$ex a%2RPy_h-8MGd_p-5c6})pB=3IpFaTpSwXn~ literal 0 HcmV?d00001 diff --git a/system/maps/gc-nte/SetDataTableGAMEJAM.rel b/system/maps/gc-nte/SetDataTableGAMEJAM.rel new file mode 100755 index 0000000000000000000000000000000000000000..46d5baab94d9ae5c70cfa9bceebf2e49c9f0f8ed GIT binary patch literal 5824 zcmd^BD^OfX6n*>$W`H+j1pL=_rW)f`{d z^C2hjJ<0Js@qEb1`gl0srvs*e7&W%83j$G&Xf;l27GcT@le8Ig$UglnM?fBN_7M54m>mPN_!Hp%oyD{3mJTq25 zmg6;}_43SU{aB9IjMvMPXa^UrJZ0&g&9i#$6kCoi3| z8_V&g_u0uy=j_IEyy={iJT~n2Yz_f4?@Kl>+cOW5<4y0R;|*p7uPNizNbjWMWf{Mh zU{**<@1)}mW`(?9R*dEpdJ^dz{>(PY8#;Eh9iOc zy>J1(7NASLsMQF@-i9Z{v*H~w_Tck|uNII|V=Pb)2%})^VL&}C)WEv}^;_Wtd?rv| z0yn^26g3rqKC4UDEP_72S?k1sKs?tRhR%z3Dm2?E_h#{J{Hcv7XtNX0ri@( zHPJ-V2@RM7idh*@ z4+>Ag*vo+Wxv&G?6R3}b_uvbG`m^vYirShjTB&=5$KWvmy6XF163NPK3w z{T)2SIdCOV-wHpXs3W#$rydYS!IJ{@tgr<}Ed%O9;S~H)fR68M{WA7uf8{~(n0U%^ z$2B}(fbYmTKn&jvMNon=dN;8WVnX>`v0lW4GR|i5(0@@VWHGAWpERi`Q#7a%&YNt?8Bc%v0a7# z|I_E;j`u|x(M$4kU(Q3~$sT{z`9t=yIrSa?AA8o%`|ufsng7i$$vbdA*Xt(gzTWPO aC%!-9=+P`bibwcR;q%DXBm6$8zy1Jx11`P* literal 0 HcmV?d00001 diff --git a/system/maps/gc-nte/SetDataTableOff.rel b/system/maps/gc-nte/SetDataTableOff.rel new file mode 100755 index 0000000000000000000000000000000000000000..af661ceca028987c76d77355f45eb6a09826f2ee GIT binary patch literal 7840 zcmcJSEpS!I62}iW7dDWun~>bxyM>5AAP{%q?t2JCM8t{+1g~lZRrzLxG# zA`plO1OkCTAP|TZ2t-6g#EJ++1R`67Kp-MkAP|WC^>m+e=FCjC9<}?D{OO+m^uN2O z&)g60%x%mptZe<#>CALGS(e=?*6QD0|9NS1tMi@g%AU8LS-*X|!XdA$XF6BHb)=c; zbc2{~7;`14E$b*Is7=gOKd-DKO;DSdvi8EQ9gEB5b1qpvuRJzbyP+kxl=izI zP7VoGsViJcdnJgwn$QZD(q0X;-Go-Sl(rjazfWj|OKHFNweDcSd5w#-HW+tLW$vt_ zIUASKR_08cr7P!bTuNJ+GjY+JjZ0}Ob0#jDvvDbHWzOzF2D36Q(prPXtXN00GA^a9 z%!)W#tlmlEQrgO_h~qEP3YXGWW<^jmE8|kya8}WsM4P;m!rPs^GqNb5!&)RmEjTH+!tC(-w6uda+V)DjnI-Kc}QGSW~>T%>iQ z_O%eHd@|-RAEDKJs;zP|l<;i+oy^axagjE99&UI+FT#brz)8wV&%%Z0(732>^gM`* zo`-OWy3zcIi=KyY32pQ|h>K<~T&|s4TUc3I(+~Unygrwo*XI)2V$NP%aqoRDp`{(2 zvlmy)+2<14V$NP%F=wAkXp1>}amAc{F4RiHVbAUmcCT`+#_8SgxM)_yMY9qvQP-7` z*PE9wniWAVWe^w5ilAs#!X@fPvm!2Dc_gj=KpUr zPMY^M?l56YkXH^8XrjEltSWhB9o8;h$JPrmmAtYJHS(I4)P8;ATxiG#YklzE%;dG7 zw-&|*Yd5L{m#V9;TRT_rUBFw1=PJG%lrfcA$oGUov$-@kzqF{0=d-ACWltXOdN0@I zEUH{etG!s9yCXqe<07pantSijo>@nAjZ0~@u6r+LLXyY%|ML8Qd;T@Ksl`tt%Z6{V zIt4C(%U}}R0JC5cY=MXB4=-bTz*F!N?1BSuWd0wTO8DU?aKxS(1((1iAn&O~@Br+9 z=im+a4Ups1r!1@0K?`&Mn%YgUO1`~}0Ibv#`_AkKv($F{7qvBN)E)!+tWl$eu10K) z8a=&W0#Ku83fuzJ=-CEOvuxy=<``j5a*o_EOPpITtL-6o&n`FwD57e>N(6}w+!M_ z+krZ#e>I3t9}eU_eQdx#Lm7ur>?MQv*TD_22=0R&_0O}H)w1mTWwTReZ<(bRw@T=Qux||F9~jHGv@FmO6H56yXzi7CI zoi^Z)QB(RGgL8J#>;tn;)SjC~BiI6u4B|gC{EFQ-i2u%ToMnBa5S$Z#)Nl!V-5~xA z1NHmv8}P>t5lVk(#Ww3^FPQDB?b|_PXwsLw_WGWdXwtLeUcece^zJzN?b}l{@f~-- z+R)rr?w_)KN94}&5kJQ#e8c#J)*QcVmS-h>^A+%1E9x&UNAx2p~bydJJ5lj0`xFI&Vg+}t?@6q z-$EyK2dFWy3(yacbKrB94K}i@MSrs2B9GX?34lLH&O!PdTvWd`%|7>G@IH71o`F|@ zoZ`2r?e^cYeh=t*s18QeZ|&&*&?UI*fZRjm9wOh+WAGfj1_$IKuj}cJ*?qM`N9-SG zS%YPRe;O0&w?0D9TcZnp0JC5NJOuRC?q#2|wdqA{gZzy>@D8ADeBrZ_y>`dq=uhH? zFP3QkXdE%ahW4s)#19+V+s4tyu%Z3LxLLD1X6<|<(jOltBU@NL>_$H5`uq#Eql;?C z`gMPd{w1zCZFU<=zfG&td}-@lvv0BIxD!)YzHf|go0a_NTAW?x*OGH%$M?-18!z=G z?xERSCwa-&#>jqq0*k)Qxt%p#`@Ze(n0;*ikEx$gWmpI6W*QTXv+ tzpkoJUX}I2id9Xxo3Br{`8@uPm6tC+-|q49{~d?-0Qvb=-q(tsKLG_0IBNg^ literal 0 HcmV?d00001 diff --git a/system/maps/gc-nte/SetDataTableOffUlti.rel b/system/maps/gc-nte/SetDataTableOffUlti.rel new file mode 100755 index 0000000000000000000000000000000000000000..431bd30e1a5591fc49b429fd9e2fa96fff5c4d89 GIT binary patch literal 7872 zcmcJSFK`vv62>PtSzZYFb3>Awd$$k~2n6B+;Vl9Yu>ygJK&;rR{O2XFLXz49imgIK zL_{DW5C{YU5rK$U5fKrAh(N4BM6gv6hzJBC094y_ z&&<7dAI+>y%`I*G+HOy^+gX-9DtxscuKu#HzR|uRSLK@LPpv+DScxI8_*3nhp&x0c z+T%gac$jlD=q-Mf6Z9tMmS0!=NE7rXr|dm9^JKxDTG!%g`7u{4-&dX+_-<*5SW0^% z$df}7s`QmuN_#WNyOq#NETz2_XvY&;iKVpTf%bMnE3uUJwy$*u3(jk?NNbC6&#CMk zKiad!QrgO%$+L3ho-LNrR`yI@v}cQ@w3R)R7wy?%DQ#uX?nVZ?vRI_G0gGMXN4v6E zN?X|#d5lh@kreI9VkvF7tLT|Tn|vlEZqMYSnYqQKmGbqM z{rNG{-1Fkc*lZXpJ~O>MS!p6K(z;a#ePyMgmb^&IN%XVY>nke_wd6%wx9Xs;tTfb; z7irz9eJz1hJy~;DkJM^C)mCG&l<;i+Gnt=P^CE3@Kiu+yStJ(DLQG0lW|mlZ4$X`D zM)!lf=zd5n(Kp&3dC~olSV9}!5AvejODxyUtjsMftmv10eqKM8pVyBiw8fsiyyCg{ zV+k$e=$^g2V$Xgop)L08ja zC9yN1+Lgo-GZT)q(XL41zo>7tE0UsJNi5gSuCA}QZ#;INHEQc;rL&n>?xVAr zps@94tLN*rCrj&(XO@>&XJ>zP*Pc*0Ka1KruiE-s9lO|-+C>g=%~_tAUDZ3OebiTb zeQjp0{N_x=>`Pl_FLQ%DH)SH0(((k9wPbWTVImf3-7%}$s4qDZOKGj|FOQd2bggCI zO3c%iahY#Q;y-o-mz=IFEU`JqPMZ+GLp znJwm0{T&sb1y)bq`GmH7;Hot%v!HdW3hEc@3gfJVWlnV$UfkEZLkE2=7WH*Y^X9{k`dTcd)g8Fc-`nMN z_4VA&{-tF&*f@v@THo%tJgTkHQCD;WA;63sqvO_C$&2d zzz0C>&aYY4RR?2W9NY)g?pg!efZAPe!8?Ga>om*0qtxYnt4rMV`Q7-VF?lY2ru-c} z9InE53}VyIVH(~rh)r*YSMZ)eZ2CDI!=DY<7ii-!3|}*deHToEdGHiGS9_?9pq6Dr z_l)W3d~zJ`81E`yc#Tf*8#pqE&3PTZWZ6Hu6c@y98m_|=2C*L)7U5?GvFYdV2HrP_ z{oZf_pBb=+=pl0scN>ox-!YyvrncmDljm>+ZX3k@(eM+zY!G|X@B-d7h<#xA9sXnx z`>Wz&Z@JQ@_|kL0%!0-aF+NW&y(!VacCkHThQ_|d z4v4*1G+>u^jBjY1XzZ`zOQ+P%afWT^rA>}eb|Z6)-ZOrn+)F}%CU%ai*oM)krr9#K zee|};5lm3`H>-Cae;T0a-3HvxUapNEnf8O_y(4}MzGPV+p}t{oojiOu=by@b%-uH$ z76CQ;o`W}8)@dSra z-vTedF4zau6uY@?*FWNa&awgAfjSsdyGf4d2gboYFb$|ZK)r!i;4L@=oVj^KF0(X0 z7@sH)oO1nZmeqR!v)8Yy-Qp}#yFLLPfMxIu>;U?^%EHvSCv@a#;({N5OqeBnb__S}ZqUsKKv zkDi#{ZM+Ff-fQDSW2sA>))nQ8vG%-3Il=!n!+CZ5_+M4Ctm9YzR{QU%l5gvLF8k(IJh@)^ z@A15YW{JYj|8~EsKHn?*g&nJ!@M`X#&-p(7AGSC6`x8DQ{=ngLLjJy&&$i<4Kc93& AB>(^b literal 0 HcmV?d00001 diff --git a/system/maps/gc-nte/SetDataTableOn.rel b/system/maps/gc-nte/SetDataTableOn.rel new file mode 100755 index 0000000000000000000000000000000000000000..3e2f931ec8fbd9201c4d49a3ded91492876cbbc0 GIT binary patch literal 7584 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 literal 0 HcmV?d00001 diff --git a/system/maps/gc-nte/SetDataTable_TGS2001.rel b/system/maps/gc-nte/SetDataTable_TGS2001.rel new file mode 100755 index 0000000000000000000000000000000000000000..2945b416ed31d3b9ad44cefbd5e370fd6293bf0d GIT binary patch literal 7552 zcmd^BEl^ck7(Mc%C>OlIg{w0J0)b$-D85H95C{f>!9Z|^KT&Y5zz8}zV;~p|27-Y= zAP{&n27`fMAQ%h=1A$;57z_r3fna!R?QflP_u2dKp3ZwOJ#?|Y{hhV;_wDcQdoTBA zR;K0_*PhgBQ?*)>B=@tm#dnq;%&)H1hNte{bI;N>r2hIc-Sq1D<@otZsyTEs;BMcb7{W~&2U;b_0byT0v|My&mAbx@lb9)ss~NvyHZf^O5lSg@{JVu zMgku+k?(4O?`q(KChz0nLZ1$tozFCpFPf)@;QOL^LZj^)^JC8M(=<`NXr9pJ=E-%z z`J#D3$K2HNojWL->mxU3(?xx7_K}y(g>zKH**r{>-;WI!_$cyy(H!AJd-?m!T;PKy zs>e2R=SCtoN3IKe(HtSl&5P>-Uvw{_%iT+^J>UJAxrN20##^0p@N;SJevbA)=f)c5 z3cPN#fzFLK%oTXucmo|yW1oLse;jYvA9PXAZp6WU9C7G%V-9p~%wev;>qhPCc-XLK zH-Mn7>GC~u00rLc&ZRRjUF3CTf?l%k3(re?ZU#t1b7n3)ujwLhG-v3dIWt#KH<~ka zyv|{N*_>yV<`(Cd_{G_nv!6@7elD%+<+3^ZxdLx?pFJH~v^(kN3cS$StUO&dXFpfq z&F-_O%jWFo3cT5zQym))dv=F_nfE2H%lFJf6nL{c>3O4B!RyKdHL^SDd08gxC7KmP z*`4&f(X610X2o1ME7RrcvS@f-*GMoc(?#BBR<60&8_fzjw3EMA%!NIhE~<-k#&Budd9@HNGLkT(EZC zggJlBR@iZv3)ay-@Znv>89aEnxMatka>L8#0!_}7uWkD<=X+SE(O;&~KKC9j-L2a& zTrcT5eGSufdKa{IMc8M$4)iSQ?}zJT_f`7ruBPii&pVo(Lz?W~Hr949uaE4`HZ+ZS zcsai}ekZxXd;4VHNvrcSv-7vJuOH|0a>2UMPeWsK(3;I;=kjv?KAc^F#`baVqpQJt z4BfJK_v|+>{@sg5`3hw}` zj#tFb#oOXN<5OSZ1z<^<$^zp-VHA8_V0=r!zD?@_^5+;JSdg8y?r!v2jmXJR}}7Zd-?kcnRzZ zjNb|$!Jh@j*pE0{0tN)eBf@p?ErIch@C>{uAnrj;_Sb`)eoGTm7G9DC0!4m@GX<-fgTwuHe&+ryZXd_qDR7?l6t@ryy>-=m zEPkfGaPIaLYlu^y&(6$qAfe*qFo*&!uz82}e;TcfE zx>ON{lB91yx=Y3-yiN`iVySLp>iyj+g`%1k~<$A#6i?3@u*&YKypR-0>P3 z;+NeWr~&`;jMVz?c9{RWqnQm+m&65o>t1que^yLUm6$ z^xi2{KPb0}oKQVd4*l|6o!^bmkBUEn@j+jH494F!UFeJJu5ZTO^kLmIY0rC(jVqgC z)vO$0jr}XyzqifSy*O)f4tHz=+zh6k%>AM7n+9WkeLOe0EFKlJK6M|(@>RJn_Nh)- zzFG&vUwtW-uZq`;{_3IltC)Qj{xtsqJ^wX{Z599ir_bXZPs%i*m-OFBnxDz1d;DGJ zKeLx<8aw_!_H3N@=Vufv|C?RXSKwrB)J>z4di(2qTESG@%h&(H1_&=kZTC`!u;YfR7@6KH+nRKNnk!?f0LH&u3)- literal 0 HcmV?d00001 diff --git a/system/maps/gc-nte/map_labo00_00e_c1.dat b/system/maps/gc-nte/map_labo00_00e_c1.dat new file mode 120000 index 00000000..ad77e260 --- /dev/null +++ b/system/maps/gc-nte/map_labo00_00e_c1.dat @@ -0,0 +1 @@ +map_labo00_00e.dat \ No newline at end of file diff --git a/system/maps/gc-nte/map_labo00_00e_d.dat b/system/maps/gc-nte/map_labo00_00e_d.dat new file mode 120000 index 00000000..ad77e260 --- /dev/null +++ b/system/maps/gc-nte/map_labo00_00e_d.dat @@ -0,0 +1 @@ +map_labo00_00e.dat \ No newline at end of file diff --git a/system/maps/gc-nte/map_labo00_00o_c1.dat b/system/maps/gc-nte/map_labo00_00o_c1.dat new file mode 120000 index 00000000..95f62883 --- /dev/null +++ b/system/maps/gc-nte/map_labo00_00o_c1.dat @@ -0,0 +1 @@ +map_labo00_00o.dat \ No newline at end of file diff --git a/system/maps/gc-nte/map_labo00_00o_d.dat b/system/maps/gc-nte/map_labo00_00o_d.dat new file mode 120000 index 00000000..95f62883 --- /dev/null +++ b/system/maps/gc-nte/map_labo00_00o_d.dat @@ -0,0 +1 @@ +map_labo00_00o.dat \ No newline at end of file diff --git a/system/maps/gc-nte/map_seabed01_00_00e.dat b/system/maps/gc-nte/map_seabed01_00_00e.dat index 8339418e77b2e6dfbbde4db4a03c98a5f20670fd..2463088970f8c65db53e69614c478aff31ded56a 100644 GIT binary patch delta 14 VcmebD;JC}c!0`V+1H(j42LK?81Wy0} delta 15 Wcmeb96BA-}=_K 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 literal 0 HcmV?d00001 diff --git a/system/maps/gc-v3/SetDataTableOffUlti.rel b/system/maps/gc-v3/SetDataTableOffUlti.rel new file mode 100755 index 0000000000000000000000000000000000000000..860f47abddf8030571048c2083ceb415b1aded22 GIT binary patch literal 9056 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 AuK)l5 literal 0 HcmV?d00001 diff --git a/system/maps/gc-v3/SetDataTableOnUlti.rel b/system/maps/gc-v3/SetDataTableOnUlti.rel new file mode 100755 index 0000000000000000000000000000000000000000..35d12bb3c8277b6931a03e32950c5fdd64eadf1e GIT binary patch literal 9344 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 HtUvz^pTy77 literal 0 HcmV?d00001 diff --git a/system/maps/gc-v3/SetDataTable_TGS2001.rel b/system/maps/gc-v3/SetDataTable_TGS2001.rel new file mode 100755 index 0000000000000000000000000000000000000000..41e1fa4af869b2c04e33099634ab751f5140486d GIT binary patch literal 8352 zcmd^BEmTxn6ut^5DnFybFf$Se1cG7EQF&__2n2$`U?BJwzoY0Heiool*CH4U1cJdp zFc1g?0>NM~5C{YVfnYEY3RefZd{SsS6geND0@m+RN!_5RfQX!%-TUk~hx zu_wo$R#Dxym-g9y>oNVduFaFw$QR@xCdxAh3gYBYW>76Uq-GOZxDym=;xo;pNu!`4{=e?X2ijMGU71Tj5&xiV-9^8xn|UU zoE$dn*$g14t8wX`WdIqu?#|g6Xk3(Q$^^Z*?+Y(i(o-{lBbu}L!t-ielpD<%anYQ` zmr*yGGveerhyA%ZkIzm%s?N$6XMN7T&*u6*Ti5fsIs3khTz8+nIJBsD()VTLB2H)J z#ko2AzKmRVpS?IYXWy5R>*j3Zq~Wk&3(X0^U?xdF+%?feRti%`2O5@UXrD%9w(?~EYjf--lS()bI+-O#aLp$kvCBCp{ zjf?8S9py%|LJ8QR9o+r(bpc&q}FgExesOy z9XgGQqHA*#6VIg(_oMCRK--;-w(FO+`wXFdGuZD|U=IZLA8EVaeaGv53)QL7i7H0! z_58eAtIhpIx95MjP_52dx94A+o1CmJ$VuzxrjIjviYeRYs#>3&YW+JO+T9z~E(U&$ zsf|y}>8)lhW2;`AAD^uMbrAXj+jJB9d|O(PjzeEyNBba;b69xtXjYFsYA%kK&Svc( zUK;cF!|SK-H{;#?w{{RO@3d*!tKr^r=E(b;5tFKm7(IM?AH7%HN4~?&!}4O>`^T7@ zQpj6(?<3c51?%qpT&#{yRHsa%u2;`z_N?3W^LRc#Mh+A1`Iv4Y~btCvp z!)fJgW(_BE8mDmDe8R|6Hb1!}$#p=T0=kK-|6J$#kkbU*Chmam6QXN`=w(9mDgm9V zLCYR*h;8r=A^Lzg0)Hi-Pqh#|V7wj%qKAkP@H8PB^$lKu*9p;Yi9PT~0y-zPPlKTi zACjd9_%G(jeaff4AQ!+=avEy}qI-z}@Gv17b269*zaT`vCN{zE2+<#aLjd&~nt^WB z7m;K7Ss|~Jk!$?>$_*9d2!??XLUfII0e(e@-XO3~!yX~}6LFj*jo4byAi9I-0}l|Q z?+|0)c>?-U4v84nCBzsWB%?QDBi8VWa^p+n3f6!vLi7%C06ro_e^WG}PE#)-8oe2y zuck3V^b&!3O>YR%+r%#TBLRJBpZ%ex^m!R%xIiwGhn1VYAQw0T^9*KXAi9sZ4Zcf= zo+6%sR|(PU#9QzlA^H<>oFr!(6=y`FAA_slK?3^nD-@T$H_1EXk7VS^dPlSJ*?Y(p zOase=XzXLK0e(k_{y-dpPYCE{>}SvoE)$}Mh!Jp&fbO`h@K~2f>GN5y5m^ucQ%u;m-N{=K)$PdZVNer z9pHcveMEdqlJhymInliY_Bnrt5IsgLfmaC8Z-{O1E&<*7O6zxSl2Oz2_mO<8d>;1s z&%jBNB@YRWwF+vNA;Ju>Q<^+WO(@>k`q zMl$9oab1|7Va!apWzfSNXp0eOqHBve@5nf>$(=%s#XPjdGBnYJ8JKz}$_0?gT|tas zElCQ!^liWvpiavk@d@h#%pGDJ&e#I9!feI446sLGjBz#P)(X}H!(`DTo}NYydXRn! zugUAoeTF!}D)5Hb2Ja9D$k}DiJ{i5rUag;rlO$Gh66%<`*rS~& z4b%4xKB9DAeYs}*twfaO>FXg+kvEku4ubJTc<~5~zx^()t9^M)xub`?2gZ8mv~s?g zd>f3JLm}VzjTi*eIviLtX$k9f1+RZ%lv6t{RIT+8)%RiSO;V$Pb~zwz<&?8**48vlfW&p-LOvZ1WM{{|C` B_+0=1 literal 0 HcmV?d00001 diff --git a/system/maps/gc-v3/map_lobby_01o.dat b/system/maps/gc-v3/map_lobby_01o.dat new file mode 100755 index 0000000000000000000000000000000000000000..ad683600c577568ce86b62ef1b9967d47607c45a GIT binary patch literal 3536 zcmb8wZERCj7zgk}!`7_>Hi-MAnT@Ccvq;x%h=kGGd%-f1Y))~^O|5T3(MipGOALC| zz!oJk5DBsuIyO-^Ff*8_)0NU9aeM)dM$7=Od{}TXY64e35XJvF&pmxhZ(5&ZYwx+| z{Otp|E~8o(#)mMP$++}&y;lB5r&{x^Rm&dqwi$7*1Two+W&p0D#nI$8MVP~KBv7fTFAg2Tgh0^U$&vjYaxSbojVcbu~ z-d$ddb*qEbS7=@2bSTBEI`+;`BUhjb(0O z?19lnM)Ujzt-AAw|Juf0nh$y$wys?sx0eay9T*RgG38ko_f}8&7j$gN(^yXX;|mxM zlHse=;*-C%s{I|uX+AtMk@U57Sk1b*!Vqga4&$MuvFE20qbHY9cUl-g++N9 z^^`{+jHk$`-n>?;J<{zr#<$YC$WoYH9(Ph6{V<*;c76!qjLklFM-cwyMggMR%Gncbc6apotYOD27X@xC8UFY&MMdq`~jXoioWv@}RuSs$U9kFs=pw3Ce)Q|5%XX0o*JeBV9nW4OcZ%_G+$720ZSMkg@o&DG2J~wE zs?qoYj5%Z^-TzJI#@L@jO&a}+FqbW0%q8R5SxJ~n!S0jw{`X^sxeRb(9Ccv4L&o%m z_L$43!-EWcZt$9jTJU?Q+CVQFN5Pm!#`rstN*hbO9DV6g!(0N5L2fkMV9eKZ2~9>L z;zGI-kc(j)gI#DG1LIvXiazOtMse+vCJmd4Mm-n{$SA#XP3E~Ibj~(uNDeeSU@Ro# zOlCaB@%7|^hK7HRs%DqaI042YGKM?|Q@UqOkqNOs*Hji^c{p3doo+H4Tm2TbE4E)1g$;(_kziqhw5f z%w-=NVX_|2d9fa6z*tI#E4m*VZ=SUo8iDgP)s4niU@RkJQr>7ZZcfZFX{5Q(I0wdZ zGJarvJ*S%fw$IxX@A01pzWpb7%?(r0I1dKwy*$PqwPbAA{YPL;4cE)_4m2);QAkGK z_EDac#!52Q*3YWz zm9xq|ztftd{`d2*hkw7S4QFWV0ArONN1t364@pXjzi-y?qEP|HYBC0$&V}*#KgI|* z8kJzYPe$h9ZFP*@v!A@S$Z%`}bIEWm;q}-F#u_sASaUo@AxU!GMSZ=v#1+2(7d{8X zOVviIXzT)GtE~7`H@evs7$tXP?r;O{lKrZ_>U&d=)tr;&$g}kOEU~C`* z=Gb7y9QHwZ+f0tj7;E!hxRH$F_54}NB9|xM4_q%&Wb?B_7zD`2g*R0j8;iy!h+`A= zXPkUWnX;>++@MAV#$jlTqyK&W46~VxaUC+0u^s}@>P4sX$wpmFBjps@aM5&GHi*8r{ULZxop~Ts)tns5;(RYdbg_O#G+9H#s@xQ z^A$e><{mX8V?0BHKaXwIjp7-~gU3tdg*OIJ9IYF7(csTxC1lLZ%u;Hio{?|exJ`!C zS{xI+XdD5fl#GOHp^9gZD#vwAQ1EJJYsSR$Xz=H;GBV;CoM>bxt&r*J=GkNu`yub~ z)zslegFlaLBV+IJmpnX<{q@llhi^t27?Y}3@b$76jO}FnS-2ABrz9mT>uSe1B#K7F zz>gv_{)?);;zFYe3>O(ua|+@9eulf{b=xd!uNI-P2aIwu*4AsdpE|FvgLwQ~;QSE3 zsM=%|*BoE_JIJW)l@8Zh}k??o#H43V<#EOZ>1}J4iwtGHOuTG3pyIb@dm|F2F5Nj zzOSgZr8Hf&Cmsofc>J4@G1a*kiW3g|N2tHcygpvXKY3dPS+|~`ReiU~!iX+Sd zXN0gvz|i+Gx`M|NPW4c!hu(el5WQ++m=`{Wuuw4ceT*^JF?fN|A;=Kd^P{h+jo~VM z3t?ek==&I5-;%*3|8WtD+8AL$BODBUAEV#6(LE>*Nis0pXheXa?_-Qr!FX^ZjmCwa zflZZKHX)(vxi1GdhH#{K@ literal 0 HcmV?d00001 diff --git a/system/maps/gc-v3/map_lobby_03o.dat b/system/maps/gc-v3/map_lobby_03o.dat new file mode 100755 index 0000000000000000000000000000000000000000..a4dd5b4c34461f3303d143116a3a716446bb4440 GIT binary patch literal 3536 zcmb8xUu;uV90%}2;EW_X4lq`~DOz(~99|On&TY<95HYj~mBf zoFXG$ze{IKReks0Daw2@ue}K?y~sTH z(JqGRjlIKj`549s86)1dM3>8_MZf8p1dQ<187sE;Z_vf3$0L-&wg_xqFusr(Ej7 z!Z;1%6Eb=(SL!=f@6mdHXxBvFNIs)J)XB%R8^#zJSYw+Q3k4dU?<;U#)-~_v#$gzr zl5zBq4}BGFp!N>UiyRKMbhBKi#i--+!i!-(?iI#|Fg~ODrrF2z=T5BD=8V$JI2?`j ziZG7A7$;-LiYC3beLQeqb2p6#Jq}CPDUK&9gz*84&&ingZcq4X=L0Ku?EUKvQ{+`6o4!`zq@b2|a!OWQc|bDGhW&uF+Jj0-TnvW%lI z>i<5_qrGus1I3Zo*hG8oB8+onywtK&pYW{H7H-@mL(Lb5e@w(N3FAB&Ro9C2#E79) zuBy^S?{GdtrF|QPF+oP-k&04Xw5eCRkZ2W->or~ ztxHn-mOo48W0+5>V!s@N5u^I5Ep@_p<&l!CIGl`NOc;GIrpXBZQ={`Zg1@XT&}gJM zdSGBx^7v|B*rwNycLtIZdjm2HIy%Mi6vfdC15f3~PlIFrx?A&s>d7L+lU|&Rr`5O7 z(cKSYh75lVe;1Caq0+LfTE-nuV1HUgp>;1u41kd9|DbOe)1HUgp zYu_?<(=w9QkwoN%YdaTNYb+KkICrsoV0>ifNU^wSJPg^IA9ET>+;FiX7{{a$nI>aJ zmLdD|qg{+ew}C4cD~8dXG7vK#lWc>jx#K8NgyDwKBMsCDAD6MKmT?u&O)pMylqdfKc>O4` literal 0 HcmV?d00001 diff --git a/system/maps/gc-v3/map_lobby_04o.dat b/system/maps/gc-v3/map_lobby_04o.dat new file mode 100755 index 0000000000000000000000000000000000000000..14a3bc46405a54733928b96fe83c43c84a08cd2b GIT binary patch literal 3536 zcmb8vdu&rx90%}2<6a%GLEK-Oc_V7TEK<6mNEp4n7wzW6Ei;N_`=fthVnVE$uf(8N z3~o^(1Cbzm(6NcSftkTXovxG?37ZcFf(-ZYiaO_FbO}`dAd25}e)sft&2Cyx()&2Q z=X1a3b+<2IEN`rcRi9=Im&~`y8)vLv4HgvQoLUSYWAt;SR2x?hD%-g+31f(i9*;*D zu|&Nt9&MHl9E`+DLl_eDttG*$|u(w${r5*6WBd0)C< zd_~5t*fWt8jj#J(xbcnSG69|KzNFS0iF-W4I0WNsGGeQ@Acv}YZ@!kLv8GrU-7vl( zqjGpl{C^s=!svldU<&uki7B2gV2)eV)d6tIMlJ&RvKJ zAuJu+;Oj{KjKtc0VH}2W);9h=U27Y`OvXA>81KS3N5;g_JN2qtecI-l+o&%}CZm%2 z@*a$D$++@GwO;aPlU8xo>dVOW>!djKWqnlScpt`jGTMhr^i9jRX&vXAG|@Jk$?)~J z@G)(Jae)l1vGt4v{gqF2W;rivcqcdZ!uXDi{d@SnRkW`1Ycwx%IMjj-a^L2nj?W7( zM#66h<1H8$slN8qUHapPmuf>s!Q32H5w3fctK3 zYI2$kHB*iU>Vz=}W0H*0@fA{kTunZ? z#(0fArVo0AaU6z8#*vec#d(eoVuh5$UXc#QMx~jr^&>ETB;&7^*RVcSwRFcazsRAA zBMx)tHd&i^s8|@iFfNnfey#=YPcfqN?_1lbWy0u#@e>)lVhQm*4NdGup48%$qjpy8 z7rys@CZlIX4caQ&iH1L{F_lh!a^LbXik~K5ACazs92gU(uginyMB+ZcR`PnYUOrC)|7t4jwmNbxo=SVl0 znmR91F=p}=VdTMRmj?fr8@H$BP*n#biUuy052HgGy_gSfRMEWfCqyyS`Hg}g{&ukf z7@g9HSjNsYBkW+fLBMdsIGAqCA`41X9QlPhe-3vTf4W#93|uY14P#Sy|9pKh)%lG= z)WcW^qe~jSu{j2Rf(mlU`IS|unJF}J=VFUs9Fj)FGOWI+^7W1%68#W1?l4Qou3 zhT>o>QiM?iqemK34t?=B8Bwus`S;@^X_!&CC~Gu2%VWsFC=Lr_H;kjw;QNJ_Z1;YV WB8)vSK9t6&WsKszsl_Qrk@+9iB`v`K literal 0 HcmV?d00001 diff --git a/system/maps/gc-v3/map_lobby_05o.dat b/system/maps/gc-v3/map_lobby_05o.dat new file mode 100755 index 0000000000000000000000000000000000000000..91a039291b88dcbf6f1c271302bc14d55c80e881 GIT binary patch literal 4624 zcmb8xd2AF_7y$6;Lc8r2Y#}ru(bTCZ0aIjqK{-liXMm*?Y%L;`7Faoonh@92D{0W@ z0W{J`xhh9n7O03^R%>FZP?jzdAW`rN7@*l`La-Vo!ss6a@%!F4Z)bPi$u2LMotZcD ze)E0r*qL=nl4ReLA{;| z3)7wccQBU^!I(nEA!lu%*_N;Ne)nS^ztbn~Hx2AJu`xZ*$Bq49Of`*v&Q_R)C!Uet z%#Dx0C?Vt8k;k=JkCdv_<&RP>ay+AeapM3O)5y5>RhgFcXT4hZt&z*cd-q7O%B9fD zjgP^Ap28ek&u3{1#;j4>eyCS@TVFh*$kT{@x(f`2447jOk;hf?LVJSaGNG~wjjdp~ z$k@I)AKJ?5o`O3xE|dsNnY8I*o~A$@#*BsO6P?`H1_nfq^%ZBH&{pjquAXCQk#SfW z#WFWqz|hE8Fswo=sPA$;Sh3m=6FWQMQ(fvhTAZ< zzoh;9aI5-8|740It}%_)+;K2wk@0d>wbtX9pkD94L5319j?zvZ#|bdX$jH8$tOX7+ zHEUEhj1&}aJVT*%+Y82QGP2Hjxlxn9UZvKd*#xVB`W0);K6TN!oCKqsjKilF1~87J zed!d3IU_9$m8}QVei)27Wc=Ou9?VZg$zD6k#p6&Y8W98TMPzt|>6(`t2f>(2hU2wH zcz&4SkG*a~vOe9zjYD8ONyf%Lo&TSDuWf>O!b{{F6IYl%gVrss{R%QV#+E}{Sv^(r zhta3v?$pq_#au)_OrNRn^|BL;N~+JEQOJ!~N2f-`VP&}e+-L{mDKflw^E8aZ{qvXv zjWUX(6^tq}3SKPNinqP@Aqq344 zILDqLqxM2BwCz+vMvOHV8Anx+8#vb&2xB}qN*syiGT$r10<`1%b|D#Sf6EIbDfe96 z{n3UO#wn=4pMeYK7p~jEurYn1#0~7zYSZ|-saB0`pyPF6Tj4OhnhgB@SVZ*=BgSd9 z8}G+hLz{6CHwGVr}$8<~qcXI_FvEgAUUUu+uKr?HJ#eY%(o zoF7X>F1gxKHyW{WiDfJy1HZ?X3S%5My89gg(GzBW#4?sj8(@&^xNbd0F6k{s+p{o^ z;l-Tm5w*I93|zO*k|9YgMqe5R6D_QaWtn`AeFDZZGDdfA4HSN#qn=#8MdhtCg`q%P z2Vi4-j@h7k5Nu3eA#jOAoh_p}6x>PMBHM(xR1NycYjtRN%5 zcw3<8R-t;S>i8+%{HAy}n1+afj5;!og0Yf}-Sr=6j!QXeL-qwS;^wl73|#wlWW3w8 zQ^Q>TY8b*}4y6(!7mSDL&ympu#ws#S-`%Wz(=qjU}tboMfzd9EUc+dLGJF<>0|+o2 zVC;@IZbB?j{QMUWl-O}Nd~newrGo)SNpK=b*WvlGatSK2jdZ97V+a^~gmJJh!oWMI zKwM&cMHSQxqzB>5CJhB+uP}NI!^lMu_h(udLl`$60ApXYVf1OpkS&a%GB+~7=n%$r zi(H&mhM%un{Qvk|7(qX{P>NOBi(jvWk?G^cCNPc&1J?_dMAv?X%#F=pd@78~hH)95 L8(ys9$O!%iS~$sP literal 0 HcmV?d00001 diff --git a/system/maps/gc-v3/map_lobby_06o.dat b/system/maps/gc-v3/map_lobby_06o.dat new file mode 100755 index 0000000000000000000000000000000000000000..19663f36fab579092b9d2ac5e62c70e566852556 GIT binary patch literal 4148 zcmb8xdu&rx7y$4?!(JU@fbK8NtfB@CN?A9Yld;=#fdPZCEFpj!TKxkfGFRAmC;|tN zZNh|YJTms8z(i#XXTYdKN@;NsVgjfH%ou6-W8yTr2vRx?QpJtaOW8~4J)jG5cx5x*_{KnYHl0?V>ufB zoMkE@ijwv4-S`Y`G7-jMFkVL^|H87s|1^Ta=m28{8YQ2%dkMMY?7hATtnec9;76k{ z&F(|YQ}GsH2boi%ccAGQ8CLU+bxWb zz*vb!>xB$;(S!}O?fXh9+InIcIj&mXr!8QtLIdX5bV6Lt{N?R&j?2{II&SO%qY{m# z#w=)SqX!*#aa?3~C@C}KJWYf;J}$g4?OD4p_JUD`^$U8RQC~eWj-F>J!{abDa&5xc z2gYhN7L8q?Ix0^%A1ZFa{=mn<)HRFaxiP}n4aOQY`t0)qS&lyExbh8g8hJQBz5rt_ z8U>To!1-TFX<_yPWcb)x^lGL}3yQJr0b`wE?E4|isE=jjUlPVCFy7RSrj_bH zkF?T_H}Wu!n8tKmb680gYql76*77$Ni}o zhcP2f49aTwTt5cJMl}AY-463pQ8KrUcZxU^j7H9Lew2~%D@;?}!Z-@XCN!*TYvK7} zhA;ZM4awRJmoPfPU})^}Yhpij_cuU1;bnNA$}3EpiR+fH{mp1}Oe})7HhQ-7SG`Z= z-N~VK%X5+WFm0A1)=M)OTd+QJX0|ZaJeeF3hnZ366Gl52ThVaeo1*eK3U5w`)0l&C zw1V*t8jgx0HRnXFGuX4uDYL+%SsZgQjy5p1p>g$acR}{;KIf#<2@p?sF*D{VTcC52 zJ_e&2je;qBFYH!aDX9^;7~^6MqnS3}Cye7@)S%H}w+q9sm0%oDkHyR=E*3@?7`14W zU7Q4MyOod;Wz7wbqa-MdZZO`J#$;jSTg`Jxm7&3rX$#$A?Kgq39gUfD)xh!r5B;m+ zdCUd=%dr@_$oa+VnYNe+V?P)>&}cciFmPqw9@=~LX*AMwBJ>Uvx#kuR34_nmIy9Qr z<^`+{Mmy`~qp>uWu>|*IzFyu#BXF|Xd9kjBcD0@Ii`MiN-5uGt}G% zR#D5RLulm7?9KY46!&C4Pj{hlXjYz@y{4KrxBQI8y;yOSb&ELonuGrU{zPT(kF@!l zM*4Skn%<|e;#i7%@&Pa!(5U(@P3`@?lHTmUOhp8+M`AI{<;8jthX;&CGK_!gz3FHjWFwLlmY& zH&R@1*+NplXqSdpH|in`kBK36R|~O%aUjwdf>@yV#5ez;M32Mjfr}QB3I_Zd0VjkE z!1JT!5>%oasZbBbC@>C6w6+E2F$qY;cxq;X9*uEBG|i&-4$!G8gu&6cqM literal 0 HcmV?d00001 diff --git a/system/maps/gc-v3/map_lobby_07o.dat b/system/maps/gc-v3/map_lobby_07o.dat new file mode 100755 index 0000000000000000000000000000000000000000..325bffc999b412e0ee0c9abeb161af817a3522b2 GIT binary patch literal 3536 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 A-~a#s literal 0 HcmV?d00001 diff --git a/system/maps/gc-v3/map_lobby_09o.dat b/system/maps/gc-v3/map_lobby_09o.dat new file mode 100755 index 0000000000000000000000000000000000000000..3bbd16cd8e8e86b92c54a604a8fbd6907b5a798c GIT binary patch literal 3740 zcma*qYitx%6ae7M#=dreF2w%Q)QPA8)5x+diiEPWGmx!RY^_mf+8_H16BFW^ikcX7 z#9$jGvLIrm54NsyGSg5M5CeDhbw9=D?+s$P>JHX=gi#~o$TDCy|Z`b zesj*bb7$Kf^B61ISIRb=Weg6PXN5b?SXlO#IH1pLnujs^DaaVsW)Dg`xbX%UBV_cs zTxi7f1{E)D6%$MheYu9lUNFv)(fm~f%ni#aBaqK3U=vt0Xkq z!5AlFcTA5kHtP+H?}2zSo0)OH^A(;;4;T}|*cMsV{F?Xqn_oYkDTsBYK7B^hS2HvY zf$;+wv6Wje7x%5#tQrY4dcjDLQGI#~*3`POhKxQiek7yelWwfXsj(L=)}uQ5GOx!w zV4Npoz||ZN+T2Ryo9|+nbx7o%t|?5xeZhN8UmHT>Fc?3jjjLbQr44^R!xKc~T`+zo zWBlmdYR&B)rLp!7%0!Q~0;s$>QO_9;Qm%oD~ zrKj>5t&1p!T(V9)tA#Me^Wja?*SXN(d;bEB*PXgYef;oZWmqf8j>FVgA4Y@k{UjNi z7S*YhEyujK)OS!l=ytG`&EoJ;9Qc?}=tSdlFfNnvbVH*$XunsPoR}g*&KJi(CpOHrXu#i@PE4dH0|BSAC{fN_<^%hy+-@yuPt&}TL?<54FX-C+DhM&RESupW}) zJHOPT@fgL?3C7=KR6bd&t~}P}O$_ezW=3J2%VvtB3ygorINKZcRLzWfD~1Xnp3G*J zOJndQC=UNy%D0aUnkCDO1#*l4#3lBB`daP6b3u(8@ILi@EXETspSLwR>ymBIHJ~OJ z`q6;*sc%piA)^kGMWcWWc%S-)gfV3p38NQxG>fB9f-7w7CNSO>2A{)YDWZC4{Ih83 zdZb2@g$X#eu>vp-2qScYj72$yn9uuk(~?CRe6q1ZFgj8O#K7aoHJF^aE<(|g#S$7t zU~~$DpXJ7#IdRCci4lbfHdYKqmoWNaJ-AUr>%y~C4M+ ziD3r<3_BPHbB$?;1zHq;^8nny}B%LW8ByG~{QdEfFcML4p{-J=7rz50hBJi59x#pygYOsKtnU3%2@Uvv&iA1( QMhs&F?wi@n;wVl04>Gn>fdBvi literal 0 HcmV?d00001 diff --git a/system/maps/gc-v3/map_lobby_10o.dat b/system/maps/gc-v3/map_lobby_10o.dat new file mode 100755 index 0000000000000000000000000000000000000000..1d21d43b6dcc8d9ff9a897c8abaca01d1b61f887 GIT binary patch literal 4760 zcmb8ydu&rx7y$4?W$PZm#$*D5rSg)E$;vhmk*x`?L*CBSLjDCSH28dS{n?EgE~k_>T<# zxFrf>l2kCbJ26AcXWZBe#yv8MFDwZ>q!Hvs6Bzf&s5sTw%Ge!O`?U|iiVRT)9`#T) zhwo#oWgi$1$T;Mv3e;K(0>2RvW9?vLLx$zYk7BX(1pRQ#8vr;blF;vT?2T&!3SuI5# zZX5vP5i;s8WGnMWt(F^pUMcgg-gw41cMTL^tplSc8L-ACGv;;`FKbM2UdESiL}M!$ zNn~u_QUHDJ^6tWJnirl7yh*83L_NuHierbNYR@>h@i`c90o%*k$0$qpXUQFEYIGi^ z#soVzwt-*ka~H|jfs>;Tw^lrx$nT}MaEkd3zU|$@p9*ln`B7w@^CiuJkEg8n+)5vBqeZ2 zm9vN06yDnt&yZ-}wt~@zjO-2%H!2I($<#Z%n&7!X&x%uSgR^R@VV)Jq$)B8Fy>e!}^pYTlFv(&qJbYL=Jcqnc)>xQ#{-_2u5Er(%!9s z&yO&CvG;9Q)~2|*aR`hoGB)`&{yg;zg55{9;6s{;$#vQA11zW0VUPLL(ERPwKM*|rB$+*0?*;#b^sw?kI666yZX2wkE z6Brz;AB+KHP_H|X!wRZJ5{^DEq6LqtHjDOL0E~fTw0BEwbE`MVo&C!U&rkww23h%-gp-L1S(gH@*O42pP$5PIRU(I_f&T*p{F%&+`!!X2tztC&M`w z$Dvtrr=~|65%YrIl_FH_#V&5(zI~F6CWnI?eyu{`_pJ-x9iH20V}Z&I+%H4PsQMuf z`Zh~pBgQj1+NjFp2F}YcVdQh8I4#jy7JAp?c$@%ZI2laEXQBNpV_v_gf{yw+jcix7 zmmSA-2WpQnIzvPlJYgN9oV_?9QJ9-e*6dC%S!&aD19;&v4_8hK{(bWFi z`}xW#Tfp__oP5KWni)%J&*6T_Bg0lbGw^W6Ym^7>m#2j>h8xwRvl6UjS=WcSPT_Z9 z$yU8a{LW^~1M4+1JTCD(#n$k6{PA9`iU#~nE;%XMgA(=cIgEE#dFrbAS zBMf;+l8NDi4i=UIMuRX8!hB#J(`a7s4j!r$+emf8WeZCMqfr>GA!DP#@R}I#&jK20 zVC*s)U62cekH6y|QtUj^yl~ON(!qegdcX-|o$&dwY6(iQjdW-SqZb&vg>ldyW#AnY zke8TW(F85G(t~hjVZFiFBaGIN5voNJ_h*_Iy;N@W0b{Sx2#smju$vgY?cB%!qe&Q@ zCbc-s3?JXO`2097jGzx(hzT+s#kEx=f)N=z81!nkZ}b* LH!{rf$O!%qmbu}{ literal 0 HcmV?d00001 diff --git a/system/maps/gc-v3/map_lobby_green_be00o.dat b/system/maps/gc-v3/map_lobby_green_be00o.dat new file mode 100755 index 0000000000000000000000000000000000000000..1b9a66e0d6d9670bc05276bae4dcb70a55ab2e9b GIT binary patch literal 1564 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 GB>w`CJyPBP literal 0 HcmV?d00001 diff --git a/system/maps/pc-nte/SetDataTableOn.rel b/system/maps/pc-nte/SetDataTableOn.rel new file mode 100644 index 0000000000000000000000000000000000000000..460e3a4c108f4022b930629ac519aba18bf02dde GIT binary patch literal 5856 zcmd^>El^}f6onszBqSl(O@crmR;)lE2AHivj6keFAP|TZQ^f)U1y%f2m{4rh2m}H# zA_9RxAP_4?AVx%tKp+qZ1Y*Sq1OkCTAP|V0(|!8Uultdtl8p+x-=5QV?(M$sPS3C_ zGwaiHOVtmB!gQgKB*{v;wtivlm-&rqVTiBtHMd4;W<6aP3f9BHdL&pE{q=CL|8THB zUeD~0b!LC8Gy7w0_n({DoHyOu$1`W9G55SrIYaJTmt!70$YYY3lj@KY)u927Gn2=M z^6QWj)s5uTjRbYbiRy|ub;Y0#IZ@r4oVqtb9dfdDe7LYq51c-q&57!wd1?rLT{KVR zX#1!6G3NJabE5O2c_J?}Pp)&GFPbOv7@J;OSirHFJ~DH*c~KvneN@Zl!a1tpbRIS* zyB{0Qsbi8~7tIlMXfJy&84K!=6P?F4GS7`bW{zCv)J1bdQf6LU=hQ{_5_y?>$+cIv zGBdZhwEFZ>=N$Z)>)nsBJjgR+4P!aAX0$<`8EqKLsWsyb^6)hF`_=1@;|=>mUevQ0 zaj+jp9M+mK2YF`9VJxTCjM~rR!-hSZ0R-pTyll@LKu&FX=iCfzUQ}z233^F?UwE}F z&&&XUXwHm<&ujCd+Gx(mi{{K&&biT?k;m&C_Lt6iW_509e%1csb+htguGWvabG=wP zXFrxxo8D(H4=vg|>Bn+vk!NS+<)w4>V>z|yefILwIs37k+H}q?j}3=Cn} z+cO^`r#8KlUTrih)S6?0GtxWh)$*9ImuOZEMnuE9*3rCZ@1c%=x zNe8rF3_?qSenQZf1^u$1Z(@%xp*2y59tiq|pl=EKb3y;0J=*Z(4w%N!9DOg841iHV zKOx>j*9HBK*oS@;^eu4#y%O~IqPsIm`UHKcCrKd5lyq6TBR!BdrGrQ&V_;IySHu={ zSI{4bW9W&XzZ5sn2SMNSMUuP%qhK7A-~YnSwJ4pCR-`rQo>SE9fsddi=r6=I z^g+<~bX#6Qi-LY!l%eZ_en;#>8-l*A^Y5iS`0~QXA$ct=Nl%bVF2RkUe-tmjL5-jv z6%)|+g1#ztp$CHgSe!yX3HqAO-;*|^r_#3c7P%z(7I#(94~PAq> zd|f1i_{?*CD{bKJay^B+z}N4kdzcm1XPQ}CdMEADxqVQ)l}R0nui)fNdIj}=ZaO>A zPX|69R-gO#-@g9bzHz)0y|_Q|tA9V@_V}yL|H+R3k3B!n1pk{|+&l2RKAr1a{7&0f Zo{PJ>Khy1>@%@SqG(Xe)S;yM{`2(r9J@Nnm literal 0 HcmV?d00001 diff --git a/system/maps/pc-v2/SetDataTableGAMEJAM.rel b/system/maps/pc-v2/SetDataTableGAMEJAM.rel new file mode 100644 index 0000000000000000000000000000000000000000..e776d522efe2cdcb5433bf75ddef46c93ef6b227 GIT binary patch literal 5824 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 GB>w`CJyPBP literal 0 HcmV?d00001 diff --git a/system/maps/pc-v2/SetDataTableOffUlti.rel b/system/maps/pc-v2/SetDataTableOffUlti.rel new file mode 100644 index 0000000000000000000000000000000000000000..6000d05ed79da7d034b7db6bb4856b119eae1dde GIT binary patch literal 5664 zcmcJRFHluk9LKN9?y|e=`gWIKFc1hY7@qK)ArM|5Y#_W~FffBpkbxPLHw!vALm&_c z1cHG;AQ%V)f`LFV7zhM|fnYEY2nGXzVA#*^p6|V!d(L4;XI%8-_ji8x_d9>S@4PEd zI^D^sxuqA4#$=HT)~06IpV!7wPp~#MmupXTot(QCO>?>)aaKUi>H<)U60liySGopI!| za;e^m&(vwUOP`fX^;UeQF7jEqRBy#+>LQ<&OZ8TK&OgY&E9IhIZLsu;apaY9sosiL z)Un0tom4K>Tk(oI{zko)OZ8T~qA2o8xm0iHRdgrmP2Ne%>rOuDOwG=V7@-Z}fRk7kO{FqPO#OYVPq<_n&=nUO!iy*Uu$-OP{^E^4|No zL@(QMK6`bg&weh^Tl(zPl|K8qL~rS{S6BM%=fYmwaJc9E5V}`Iud8!+!^=fpQ5Sh- zxx~8pGWLD*=8L?dD4#N@i@c&J^2&0FbtA8+i@dU2*lUZ1UgaAJymEC_uWTcU-pDIg z7xl88>b;^a^2&0FJ(G@lBd;jpZ?taY6-AL(mMeN6Ei5iJ?mo-kH7<7V$~@|?ppwX9Q z*U;N=2U^gEhtPs0SW`Sk?G55B*o8wlh7XEAqc)l4yQ=MHT!$94VH#Fo19sp5j^G2F zL(lary9Ets!F`yAZRX=~wkv%teIq@Vo=8{d*@Rs%!tuXu~ut!-nF|>8x~zKI1hU35!37&uGt24vTLQ8+V{3EWR&h(G_9wrg()O2#b%!NAz4+ysv#7 zNk2+2q_vywTy<%0FK30@&=3}ni3jMsuy|FxM0bV7hvFT2DlEPbeLr)TgvDL0zb@U8 z9!TFwo75VA!-TN7E7s60Vey`LgT5CQpNTJM?H7l|gT%%Nj0=lvyin{O)TJ%y18G$u!|i{A+AYy0 zXYZX?j0>if+qXHzvT}!vkHv;^CyWbrl>1(K#@q$x#044e!GbSZv-eMTmVRj;H3heb z3kHb`MpQc{ZA(X~F<)k-FQum_U)ik9JHcKhZ%`Yr@?A1*aYs$hP6u5s?6mMzHSd!&Ex04*PNI0__Kd&{Qt~SxOKH&u3JR$&fSx%@R literal 0 HcmV?d00001 diff --git a/system/maps/pc-v2/SetDataTableOn.rel b/system/maps/pc-v2/SetDataTableOn.rel new file mode 100644 index 0000000000000000000000000000000000000000..460e3a4c108f4022b930629ac519aba18bf02dde GIT binary patch literal 5856 zcmd^>El^}f6onszBqSl(O@crmR;)lE2AHivj6keFAP|TZQ^f)U1y%f2m{4rh2m}H# zA_9RxAP_4?AVx%tKp+qZ1Y*Sq1OkCTAP|V0(|!8Uultdtl8p+x-=5QV?(M$sPS3C_ zGwaiHOVtmB!gQgKB*{v;wtivlm-&rqVTiBtHMd4;W<6aP3f9BHdL&pE{q=CL|8THB zUeD~0b!LC8Gy7w0_n({DoHyOu$1`W9G55SrIYaJTmt!70$YYY3lj@KY)u927Gn2=M z^6QWj)s5uTjRbYbiRy|ub;Y0#IZ@r4oVqtb9dfdDe7LYq51c-q&57!wd1?rLT{KVR zX#1!6G3NJabE5O2c_J?}Pp)&GFPbOv7@J;OSirHFJ~DH*c~KvneN@Zl!a1tpbRIS* zyB{0Qsbi8~7tIlMXfJy&84K!=6P?F4GS7`bW{zCv)J1bdQf6LU=hQ{_5_y?>$+cIv zGBdZhwEFZ>=N$Z)>)nsBJjgR+4P!aAX0$<`8EqKLsWsyb^6)hF`_=1@;|=>mUevQ0 zaj+jp9M+mK2YF`9VJxTCjM~rR!-hSZ0R-pTyll@LKu&FX=iCfzUQ}z233^F?UwE}F z&&&XUXwHm<&ujCd+Gx(mi{{K&&biT?k;m&C_Lt6iW_509e%1csb+htguGWvabG=wP zXFrxxo8D(H4=vg|>Bn+vk!NS+<)w4>V>z|yefILwIs37k+H}q?j}3=Cn} z+cO^`r#8KlUTrih)S6?0GtxWh)$*9ImuOZEMnuE9*3rCZ@1c%=x zNe8rF3_?qSenQZf1^u$1Z(@%xp*2y59tiq|pl=EKb3y;0J=*Z(4w%N!9DOg841iHV zKOx>j*9HBK*oS@;^eu4#y%O~IqPsIm`UHKcCrKd5lyq6TBR!BdrGrQ&V_;IySHu={ zSI{4bW9W&XzZ5sn2SMNSMUuP%qhK7A-~YnSwJ4pCR-`rQo>SE9fsddi=r6=I z^g+<~bX#6Qi-LY!l%eZ_en;#>8-l*A^Y5iS`0~QXA$ct=Nl%bVF2RkUe-tmjL5-jv z6%)|+g1#ztp$CHgSe!yX3HqAO-;*|^r_#3c7P%z(7I#(94~PAq> zd|f1i_{?*CD{bKJay^B+z}N4kdzcm1XPQ}CdMEADxqVQ)l}R0nui)fNdIj}=ZaO>A zPX|69R-gO#-@g9bzHz)0y|_Q|tA9V@_V}yL|H+R3k3B!n1pk{|+&l2RKAr1a{7&0f Zo{PJ>Khy1>@%@SqG(Xe)S;yM{`2(r9J@Nnm literal 0 HcmV?d00001 diff --git a/system/maps/pc-v2/SetDataTableOnUlti.rel b/system/maps/pc-v2/SetDataTableOnUlti.rel new file mode 100644 index 0000000000000000000000000000000000000000..71c623e52ba9e310601cbc18fa6ece1301a9cb3e GIT binary patch literal 5856 zcmd^>El^!o6ooI8wy!O1Xd8h*AP@+|uKW_?Q$P5Az@dP3w z0)cp<0)aq8AP`SPAR-V51OgGkOc96(1fpx5v(DxGT-r{Xs*-$J>+HApIs5K+-Xp6s z)v3AV%~yFomFHQOtrlzR7uSDX*x1Z_`6^#?YorG2sk}E@_eJaeXg%Ps`=b5(qW$rD zus_zp{#Xb5V{P}Jo7q}0-P^}AXBIK{ypK7(?p&8+9z4opl9`k0kdxG*0gf}s<3ss% z$Vuw@OX~WgI^-mE10{6>Q5|xUx)&vNFQPi+gmrwlxK0mTJfF=;>XLbC2!35MPvmI( z$N4el_i1yI^OAWYFPJCSCC``46M2kHtuHR(*r1PK&NeUUgR@U+*<3tFHC)WY=7jsP z;gUKg`E|)0QHS=zd&yW-hn(a*wh=rx0>K=)E~!iAh@@a%T$j`(_Y!%*z2w@fTb-F( zT3&nnsB;c}%=PZaSRUn>vBt5IS~J=x&x|&XmDHN?MtOJ|`~B+m$MMGfAus9Kj5ykl zBaUm$n4>&1<~UYTYewzo@nPeh%>bfvZC=fdC8m^D>*lrGxB(ylacdi#J=IqBx zYK!~q<)KA;C;eDSE%NNFyu4!0eypUnxX)f*F=szkQd`W~<+0(oXY&v!=6wnC!k+mM zCAGz!^lFn?q1GG|ol)FLua?Key(F_jQgJ7}+GJM9OJ>DbJS&?Qp36hy=QWK)v$A84<^nwSlAW zvaAW(A$p)gf__xcPYU`KLEpe0UqW}p9`r!a9|`(XLH|L}x3t1^5iluV`QG-~DIJuKNtdLX$R{h?s;{1^sKW4?Pm}H#(nRTKE`b?b2L2B5fd-T(CyaKZv$(vaCzc z4~kLfw4mPACbqdW&3=eT%y)=)1)bbWG6Ci*4whps$N} z&@(}QCGMat_+BRT-9PGmmQF~k(wej#`CZ}+F?=m%Io6IV#fA`b+$lDKn4{$JWOsq{>Gf*j7}K{|}@ey%T}_y}gZ z`0m2jMK*}fJlFTq6Wn30r*RkfdWN}C>(UF&@kaU}ZPU43P`s7dJ``WU*@g5L`g?N| zdT7FD!|GH2{@d4|+Bc0iqZjulef950+#Y|``9In5|FP%inc#o3i+cy2*2i<5OW$ex a%2RPy_h-8MGd_p-5c6})pB=3IpFaTpSwXn~ literal 0 HcmV?d00001 diff --git a/system/maps/xb-v3/SetDataTableOn.rel b/system/maps/xb-v3/SetDataTableOn.rel new file mode 100644 index 0000000000000000000000000000000000000000..f72a54a13bac638d3bbc2d6ceb4a352bd93459a1 GIT binary patch literal 9312 zcmd^?FH~g76~^CeNR}idJ4wifBqV19Vg#aRhTSFSAP^%EEf9zioWtLqW%l#{2iQ%| zIfxN05Qq^71OkCTv>1UvAP@)y0x<&70)apv5C{Y!-&gfjy?RxT-8nmn$|k@4zPj(; zs{3v~UiZG9TAY}9weqG?nW$8sx7Znp71KKxiwM?>xs&fX#F%=Ka17_ z;reN`|I=uHTrcd8bzy(33;Sbj_n(>ip=P?bw`b1uF?YXt&J%a8%P}_|d*kkS;*r}g>}eD>YkO4yFN*_@;< znWu&j)+O^qj<(O|$5_~>%}LHn=83$*Jh?8pzhs`sV{BsKvBt5IS~J=x&x|&XmDHN?MtQg!`+g1j z<9Or#keBpqMjY+O5y!P=%u${ha~vzFHKPvmc(ZZOW&qK-Hm}$-2T)S$pE)-Jo0rs@ zW1?RC_eD_4^1=)dNaoB~e7`m?sZHjLykyRdm7JT*8F_r1!Ve6ARad$xJWxd8g4SP0`+XCw2cz}B zit8u-d)w}}RGXccu3?Np&u?n=`og~z4&vV~)oSxD9K@FwW@c(jZZ>vb#WbTIFgf>G zS#LiN>+NrMc>gR|?{g5hIrXXO1@|M#%-F1L@5_r*Gx;}u9E;Ybn>ZG&O*e5YTr+`p z7004=au(|J9NC_EdnNm5c1z#Cnz!T2bMlxy%ddm8@>rA;oaJ*0XE7l@%NB9wwg&6u zEXKmKu(oC9S@Cr`>$~sgzpdL3%v^VC_q@6_H|4qc+CB?fn-hZT*xmM!UoX_Nsc=91 ziQ9LG^8MeVTSw<3zfjNjh#6MUgMYVZ51XUexFwmeqn#C?SHf9`S!ormupkgwORAD z`8fwMbC1E=&nu7Ra}HurT|VbLC!cc=i|UZ${+4Z@EQ7MjNx`KSN1~vtKOB_N^1^tD%g?4sW=zHNw1q=)NF);^i z2>Nxg4Sg@@ySg<$>5z0xT9-DZN2noZ;7ZV&2M`ZoH+U@Qhr}p!R?s)ZI&@pm?}=k* zThL#Nj$h&V5cDVN>q2@b?f$d9uYT!sw?<7r7zSg4eom}H-wFC1u@5~F^ylIR+WEPK zz89WUz;i+WLe!ye1^v4E+L0beKS-~n9bek}*+3211qXuuR9rxB1$|eip1(2t05 z=%S!+icM%s&{uW-taR1&BW+0!kxM>+OF@4p9{w8dD?vXfs?bS6zarM4TY~<*ID(!D z`YWB^@fSO%Ug?0eD!pPZ$bN%oRnR{cL(ow{KPwv0bwR%^_MpdtzAdhy9ly2Euj~9B z>4Efv>r2{$8b^PReFgU+<``D2f|z4Wu_449bBc{1=6C_`n1gpT;2mr5j!k&SF1%wO z-f;}?ID>aw!aMHZ9o=1+yXc2HhT$En>U~YRA>Ed?r2En%>8Z3Wy_DWav%lJTc1e4r zebO=X;FyGW)Zrbw%H5M5N*l;=G~pfZ;2jsry_Vidw~#|x;L+b~kNfcC1hmC9H2a;U z8#nV=t4?j=0A1)X15=zHJ^ z{i<>wV@-xYRnSk06=+k?Z;BT5K+x}EKm1h44y9+(Q(PnG;9AhzAA&aC*=z6dA$}Z^ zM_>Rk{5;Ak@MIW_3i?SwzbNS63i=W4F(#dq)};;UJLHlbuqWt`MH_l0=(9gqx}kl7 zzJ>ibgCl8MI*4ne3dRNfqG&=l1pTf!fSw5Yu7BA5`=mqCb6j)O5#!vh5Ocg$>=rS{ zhGHG~P3hQGtQRrvF)7`V4&nD4zV5RND1Mq`Tln3<^*Fw-slE6qceHQO`Y6sp$ z)Iq(Is?tg6inM}v10RhOD4+RG{Jl{7^>=fsb(fyq7g}#fM-XS} z?-=fv+R%NkOSh$a(qYv#p}da+#G4%taMlBS-d6AX_orUJZ{IZj8G3R5ORs)>#O?7@ zo&TI2|3CKp?@aK2vy1x#?$eL|R6jm5zmqbT?qjolJns4rvp%No)AGY=>&yE{^U}!u x-QK@*xJy3EFnXWA@3b^O%yf5`YJU2sIlN9w|2h9BzK`)`%J(_{X=5G!^B?o?%dY?c literal 0 HcmV?d00001 diff --git a/system/maps/xb-v3/SetDataTableOnUlti.rel b/system/maps/xb-v3/SetDataTableOnUlti.rel new file mode 100644 index 0000000000000000000000000000000000000000..7e8118a2a20455c17668eead49a3eef18ffc0b28 GIT binary patch literal 9344 zcmd^?FHl|E8O2XtX-iw$M_by`mbQop1mckJ-lH=JL<9nXKp>dm@698f8(@IE-pn8( zm?;8*Kp+r^2m}IwKtv!AhzJA%frvmLA`plx5M68UwfEU)??Ydv=~K;nzpS;t^L_iz zcg{Wc=H>L#|!s^mjG0dwV>yrjNPv7CC)xU6*4H9_2B~^htHdN$Rix zwzHJSLxpw7N$Q?f)IE*rkdxH)SJd@Kb;wETzN)DEDylvUj$KAV%&CH+(r z!n&lN$kFsg{}>DRX>*eGl71qu)K88p&X@EPd5ldiK7Wp7OZzDG+2$qtVDFP!ZZ7Vl zHthRhbIS8^!xeQ*3hRSajc@&v^UDbY3%zo*dN;) z?+~zR%MOvoC53_KVl`DvY_> zFy__`V!qE|tfJOG&p{rxXrIY2R#A&Q+p8eY_c@GJ)cWT+$n$*;V->Z&&n}M}j`wU1 zfnq){<-GEqd5DTy|4at8Nv}|AmWkHz&ty=`W#YXgy+V?ICWG3fSIA3x#aP@cn^#_! zi^k_Q8;N>l^OD-6S7vi*ZPF{`VLRpLim`alHZNHh;iNX{6_W6OQk(P&NlC95bG0*z zD=T^5D|5fBx6hIB*fH<7@z{a)n32A|I5YE_6R9T}`*UjS_pY(ukH-ETq4C$zeBVUl zfoS~q^0?1`huis zbkW^6>+QX<-u{k<_s@m(J_m7|Q=gt$bU&EPT4rq5U0Ir*Ex!HZSTr`fiDS{&>?V$d zVd7P05H z2IFKc#=^BQwq@qI@O4`2AFmd^t=k)BuDh{&Ufr0Ja@}HVp9PK03c+>EZud}JFV%BX z;e7bG+xLm`{pZn*qxF$rs^>e!G%MJHf6r(Ro1@+oG26g$U1_g;5BZ)Jb+)PHx_D3K znBh77?+?x6-z#n$ofG+`IlqqjD7>mb#pXU1tcc1ebk2~o-?wa@Jn}naHENcf{zsa&kRM86^6!as4enQaK z1$~Y=ehgg`o6ucBe<0}J3HtYfepPc^!IN8HHipg7cR)!G7!dR$VhXw>=-0&#bYIZF z6X(zmg8ojlevxIJg8mr$f@J5?8)^1i8}F3n(q1H!AuuZF=R^a#A?SC-A@oGhUx*uM zQ_#2lD9gIR02l@n@(r!OCEb^vNH3+U$R`_MN6;UL6X?01zZOksYm0@x3!da)NYIao zd1yn>Z;CzWp`h>Vuzk#>!_p~fL%JnBMGd(G9|gU60PzrZfF40VC`O@kg1#X(p?iY< zNSr~h1pTdO`3d$c=r6UeTWRa>?0LGS1JY4xFKWmT7!&mKVhy?_=--NC=zBr`LEJ%G ze`=xcf+sn6Cg{gS9r{Ml?`U6#(lhA?X;a$%dwZ^J)R2AfPSBr=YiLu@x3yZjq5Xn> zSWG~d1pT_$fgT9@ajm~3-H`4{kEJKbB^TgE(BF&ppJmx&K|dfypi_c=Rct_a1^uBo zgqO58$Qeqo{C z(fWtdGwBCuQ`(7|$6}zc*i!p<1M`7 z2;OlD@3??>T*Eu=;2o`P_Ij~sFgdKEi`Czs$x z+(X-bY3YUzDR)FVF3oX`JOg859@-F_&^6_5NVlcCxJC}aiMW7Xizf6~xu?=|Y3r|W zpFtPs6+_TbF$cXw=-&$Z9J%=F%Z}j5DYy{y*MfdRxp(lSF~^Z&J&19Ry7W*wjNfzky3cN*_-T^u%;F?fE}h3_{pYybf0*?tb)T0XR$E`a zk2EihJiOb7XAWm6dKpF^@(-<+=7*W?bg34rf1ay)x0=}B@cRQ_uzbh!&&^-0y1)Mo Dt`yJG literal 0 HcmV?d00001 diff --git a/system/maps/xb-v3/map_lobby_01o.dat b/system/maps/xb-v3/map_lobby_01o.dat new file mode 100644 index 0000000000000000000000000000000000000000..ad683600c577568ce86b62ef1b9967d47607c45a GIT binary patch literal 3536 zcmb8wZERCj7zgk}!`7_>Hi-MAnT@Ccvq;x%h=kGGd%-f1Y))~^O|5T3(MipGOALC| zz!oJk5DBsuIyO-^Ff*8_)0NU9aeM)dM$7=Od{}TXY64e35XJvF&pmxhZ(5&ZYwx+| z{Otp|E~8o(#)mMP$++}&y;lB5r&{x^Rm&dqwi$7*1Two+W&p0D#nI$8MVP~KBv7fTFAg2Tgh0^U$&vjYaxSbojVcbu~ z-d$ddb*qEbS7=@2bSTBEI`+;`BUhjb(0O z?19lnM)Ujzt-AAw|Juf0nh$y$wys?sx0eay9T*RgG38ko_f}8&7j$gN(^yXX;|mxM zlHse=;*-C%s{I|uX+AtMk@U57Sk1b*!Vqga4&$MuvFE20qbHY9cUl-g++N9 z^^`{+jHk$`-n>?;J<{zr#<$YC$WoYH9(Ph6{V<*;c76!qjLklFM-cwyMggMR%Gncbc6apotYOD27X@xC8UFY&MMdq`~jXoioWv@}RuSs$U9kFs=pw3Ce)Q|5%XX0o*JeBV9nW4OcZ%_G+$720ZSMkg@o&DG2J~wE zs?qoYj5%Z^-TzJI#@L@jO&a}+FqbW0%q8R5SxJ~n!S0jw{`X^sxeRb(9Ccv4L&o%m z_L$43!-EWcZt$9jTJU?Q+CVQFN5Pm!#`rstN*hbO9DV6g!(0N5L2fkMV9eKZ2~9>L z;zGI-kc(j)gI#DG1LIvXiazOtMse+vCJmd4Mm-n{$SA#XP3E~Ibj~(uNDeeSU@Ro# zOlCaB@%7|^hK7HRs%DqaI042YGKM?|Q@UqOkqNOs*Hji^c{p3doo+H4Tm2TbE4E)1g$;(_kziqhw5f z%w-=NVX_|2d9fa6z*tI#E4m*VZ=SUo8iDgP)s4niU@RkJQr>7ZZcfZFX{5Q(I0wdZ zGJarvJ*S%fw$IxX@A01pzWpb7%?(r0I1dKwy*$PqwPbAA{YPL;4cE)_4m2);QAkGK z_EDac#!52Q*3YWz zm9xq|ztftd{`d2*hkw7S4QFWV0ArONN1t364@pXjzi-y?qEP|HYBC0$&V}*#KgI|* z8kJzYPe$h9ZFP*@v!A@S$Z%`}bIEWm;q}-F#u_sASaUo@AxU!GMSZ=v#1+2(7d{8X zOVviIXzT)GtE~7`H@evs7$tXP?r;O{lKrZ_>U&d=)tr;&$g}kOEU~C`* z=Gb7y9QHwZ+f0tj7;E!hxRH$F_54}NB9|xM4_q%&Wb?B_7zD`2g*R0j8;iy!h+`A= zXPkUWnX;>++@MAV#$jlTqyK&W46~VxaUC+0u^s}@>P4sX$wpmFBjps@aM5&GHi*8r{ULZxop~Ts)tns5;(RYdbg_O#G+9H#s@xQ z^A$e><{mX8V?0BHKaXwIjp7-~gU3tdg*OIJ9IYF7(csTxC1lLZ%u;Hio{?|exJ`!C zS{xI+XdD5fl#GOHp^9gZD#vwAQ1EJJYsSR$Xz=H;GBV;CoM>bxt&r*J=GkNu`yub~ z)zslegFlaLBV+IJmpnX<{q@llhi^t27?Y}3@b$76jO}FnS-2ABrz9mT>uSe1B#K7F zz>gv_{)?);;zFYe3>O(ua|+@9eulf{b=xd!uNI-P2aIwu*4AsdpE|FvgLwQ~;QSE3 zsM=%|*BoE_JIJW)l@8Zh}k??o#H43V<#EOZ>1}J4iwtGHOuTG3pyIb@dm|F2F5Nj zzOSgZr8Hf&Cmsofc>J4@G1a*kiW3g|N2tHcygpvXKY3dPS+|~`ReiU~!iX+Sd zXN0gvz|i+Gx`M|NPW4c!hu(el5WQ++m=`{Wuuw4ceT*^JF?fN|A;=Kd^P{h+jo~VM z3t?ek==&I5-;%*3|8WtD+8AL$BODBUAEV#6(LE>*Nis0pXheXa?_-Qr!FX^ZjmCwa zflZZKHX)(vxi1GdhH#{K@ literal 0 HcmV?d00001 diff --git a/system/maps/xb-v3/map_lobby_03o.dat b/system/maps/xb-v3/map_lobby_03o.dat new file mode 100644 index 0000000000000000000000000000000000000000..a4dd5b4c34461f3303d143116a3a716446bb4440 GIT binary patch literal 3536 zcmb8xUu;uV90%}2;EW_X4lq`~DOz(~99|On&TY<95HYj~mBf zoFXG$ze{IKReks0Daw2@ue}K?y~sTH z(JqGRjlIKj`549s86)1dM3>8_MZf8p1dQ<187sE;Z_vf3$0L-&wg_xqFusr(Ej7 z!Z;1%6Eb=(SL!=f@6mdHXxBvFNIs)J)XB%R8^#zJSYw+Q3k4dU?<;U#)-~_v#$gzr zl5zBq4}BGFp!N>UiyRKMbhBKi#i--+!i!-(?iI#|Fg~ODrrF2z=T5BD=8V$JI2?`j ziZG7A7$;-LiYC3beLQeqb2p6#Jq}CPDUK&9gz*84&&ingZcq4X=L0Ku?EUKvQ{+`6o4!`zq@b2|a!OWQc|bDGhW&uF+Jj0-TnvW%lI z>i<5_qrGus1I3Zo*hG8oB8+onywtK&pYW{H7H-@mL(Lb5e@w(N3FAB&Ro9C2#E79) zuBy^S?{GdtrF|QPF+oP-k&04Xw5eCRkZ2W->or~ ztxHn-mOo48W0+5>V!s@N5u^I5Ep@_p<&l!CIGl`NOc;GIrpXBZQ={`Zg1@XT&}gJM zdSGBx^7v|B*rwNycLtIZdjm2HIy%Mi6vfdC15f3~PlIFrx?A&s>d7L+lU|&Rr`5O7 z(cKSYh75lVe;1Caq0+LfTE-nuV1HUgp>;1u41kd9|DbOe)1HUgp zYu_?<(=w9QkwoN%YdaTNYb+KkICrsoV0>ifNU^wSJPg^IA9ET>+;FiX7{{a$nI>aJ zmLdD|qg{+ew}C4cD~8dXG7vK#lWc>jx#K8NgyDwKBMsCDAD6MKmT?u&O)pMylqdfKc>O4` literal 0 HcmV?d00001 diff --git a/system/maps/xb-v3/map_lobby_04o.dat b/system/maps/xb-v3/map_lobby_04o.dat new file mode 100644 index 0000000000000000000000000000000000000000..14a3bc46405a54733928b96fe83c43c84a08cd2b GIT binary patch literal 3536 zcmb8vdu&rx90%}2<6a%GLEK-Oc_V7TEK<6mNEp4n7wzW6Ei;N_`=fthVnVE$uf(8N z3~o^(1Cbzm(6NcSftkTXovxG?37ZcFf(-ZYiaO_FbO}`dAd25}e)sft&2Cyx()&2Q z=X1a3b+<2IEN`rcRi9=Im&~`y8)vLv4HgvQoLUSYWAt;SR2x?hD%-g+31f(i9*;*D zu|&Nt9&MHl9E`+DLl_eDttG*$|u(w${r5*6WBd0)C< zd_~5t*fWt8jj#J(xbcnSG69|KzNFS0iF-W4I0WNsGGeQ@Acv}YZ@!kLv8GrU-7vl( zqjGpl{C^s=!svldU<&uki7B2gV2)eV)d6tIMlJ&RvKJ zAuJu+;Oj{KjKtc0VH}2W);9h=U27Y`OvXA>81KS3N5;g_JN2qtecI-l+o&%}CZm%2 z@*a$D$++@GwO;aPlU8xo>dVOW>!djKWqnlScpt`jGTMhr^i9jRX&vXAG|@Jk$?)~J z@G)(Jae)l1vGt4v{gqF2W;rivcqcdZ!uXDi{d@SnRkW`1Ycwx%IMjj-a^L2nj?W7( zM#66h<1H8$slN8qUHapPmuf>s!Q32H5w3fctK3 zYI2$kHB*iU>Vz=}W0H*0@fA{kTunZ? z#(0fArVo0AaU6z8#*vec#d(eoVuh5$UXc#QMx~jr^&>ETB;&7^*RVcSwRFcazsRAA zBMx)tHd&i^s8|@iFfNnfey#=YPcfqN?_1lbWy0u#@e>)lVhQm*4NdGup48%$qjpy8 z7rys@CZlIX4caQ&iH1L{F_lh!a^LbXik~K5ACazs92gU(uginyMB+ZcR`PnYUOrC)|7t4jwmNbxo=SVl0 znmR91F=p}=VdTMRmj?fr8@H$BP*n#biUuy052HgGy_gSfRMEWfCqyyS`Hg}g{&ukf z7@g9HSjNsYBkW+fLBMdsIGAqCA`41X9QlPhe-3vTf4W#93|uY14P#Sy|9pKh)%lG= z)WcW^qe~jSu{j2Rf(mlU`IS|unJF}J=VFUs9Fj)FGOWI+^7W1%68#W1?l4Qou3 zhT>o>QiM?iqemK34t?=B8Bwus`S;@^X_!&CC~Gu2%VWsFC=Lr_H;kjw;QNJ_Z1;YV WB8)vSK9t6&WsKszsl_Qrk@+9iB`v`K literal 0 HcmV?d00001 diff --git a/system/maps/xb-v3/map_lobby_05o.dat b/system/maps/xb-v3/map_lobby_05o.dat new file mode 100644 index 0000000000000000000000000000000000000000..91a039291b88dcbf6f1c271302bc14d55c80e881 GIT binary patch literal 4624 zcmb8xd2AF_7y$6;Lc8r2Y#}ru(bTCZ0aIjqK{-liXMm*?Y%L;`7Faoonh@92D{0W@ z0W{J`xhh9n7O03^R%>FZP?jzdAW`rN7@*l`La-Vo!ss6a@%!F4Z)bPi$u2LMotZcD ze)E0r*qL=nl4ReLA{;| z3)7wccQBU^!I(nEA!lu%*_N;Ne)nS^ztbn~Hx2AJu`xZ*$Bq49Of`*v&Q_R)C!Uet z%#Dx0C?Vt8k;k=JkCdv_<&RP>ay+AeapM3O)5y5>RhgFcXT4hZt&z*cd-q7O%B9fD zjgP^Ap28ek&u3{1#;j4>eyCS@TVFh*$kT{@x(f`2447jOk;hf?LVJSaGNG~wjjdp~ z$k@I)AKJ?5o`O3xE|dsNnY8I*o~A$@#*BsO6P?`H1_nfq^%ZBH&{pjquAXCQk#SfW z#WFWqz|hE8Fswo=sPA$;Sh3m=6FWQMQ(fvhTAZ< zzoh;9aI5-8|740It}%_)+;K2wk@0d>wbtX9pkD94L5319j?zvZ#|bdX$jH8$tOX7+ zHEUEhj1&}aJVT*%+Y82QGP2Hjxlxn9UZvKd*#xVB`W0);K6TN!oCKqsjKilF1~87J zed!d3IU_9$m8}QVei)27Wc=Ou9?VZg$zD6k#p6&Y8W98TMPzt|>6(`t2f>(2hU2wH zcz&4SkG*a~vOe9zjYD8ONyf%Lo&TSDuWf>O!b{{F6IYl%gVrss{R%QV#+E}{Sv^(r zhta3v?$pq_#au)_OrNRn^|BL;N~+JEQOJ!~N2f-`VP&}e+-L{mDKflw^E8aZ{qvXv zjWUX(6^tq}3SKPNinqP@Aqq344 zILDqLqxM2BwCz+vMvOHV8Anx+8#vb&2xB}qN*syiGT$r10<`1%b|D#Sf6EIbDfe96 z{n3UO#wn=4pMeYK7p~jEurYn1#0~7zYSZ|-saB0`pyPF6Tj4OhnhgB@SVZ*=BgSd9 z8}G+hLz{6CHwGVr}$8<~qcXI_FvEgAUUUu+uKr?HJ#eY%(o zoF7X>F1gxKHyW{WiDfJy1HZ?X3S%5My89gg(GzBW#4?sj8(@&^xNbd0F6k{s+p{o^ z;l-Tm5w*I93|zO*k|9YgMqe5R6D_QaWtn`AeFDZZGDdfA4HSN#qn=#8MdhtCg`q%P z2Vi4-j@h7k5Nu3eA#jOAoh_p}6x>PMBHM(xR1NycYjtRN%5 zcw3<8R-t;S>i8+%{HAy}n1+afj5;!og0Yf}-Sr=6j!QXeL-qwS;^wl73|#wlWW3w8 zQ^Q>TY8b*}4y6(!7mSDL&ympu#ws#S-`%Wz(=qjU}tboMfzd9EUc+dLGJF<>0|+o2 zVC;@IZbB?j{QMUWl-O}Nd~newrGo)SNpK=b*WvlGatSK2jdZ97V+a^~gmJJh!oWMI zKwM&cMHSQxqzB>5CJhB+uP}NI!^lMu_h(udLl`$60ApXYVf1OpkS&a%GB+~7=n%$r zi(H&mhM%un{Qvk|7(qX{P>NOBi(jvWk?G^cCNPc&1J?_dMAv?X%#F=pd@78~hH)95 L8(ys9$O!%iS~$sP literal 0 HcmV?d00001 diff --git a/system/maps/xb-v3/map_lobby_06o.dat b/system/maps/xb-v3/map_lobby_06o.dat new file mode 100644 index 0000000000000000000000000000000000000000..19663f36fab579092b9d2ac5e62c70e566852556 GIT binary patch literal 4148 zcmb8xdu&rx7y$4?!(JU@fbK8NtfB@CN?A9Yld;=#fdPZCEFpj!TKxkfGFRAmC;|tN zZNh|YJTms8z(i#XXTYdKN@;NsVgjfH%ou6-W8yTr2vRx?QpJtaOW8~4J)jG5cx5x*_{KnYHl0?V>ufB zoMkE@ijwv4-S`Y`G7-jMFkVL^|H87s|1^Ta=m28{8YQ2%dkMMY?7hATtnec9;76k{ z&F(|YQ}GsH2boi%ccAGQ8CLU+bxWb zz*vb!>xB$;(S!}O?fXh9+InIcIj&mXr!8QtLIdX5bV6Lt{N?R&j?2{II&SO%qY{m# z#w=)SqX!*#aa?3~C@C}KJWYf;J}$g4?OD4p_JUD`^$U8RQC~eWj-F>J!{abDa&5xc z2gYhN7L8q?Ix0^%A1ZFa{=mn<)HRFaxiP}n4aOQY`t0)qS&lyExbh8g8hJQBz5rt_ z8U>To!1-TFX<_yPWcb)x^lGL}3yQJr0b`wE?E4|isE=jjUlPVCFy7RSrj_bH zkF?T_H}Wu!n8tKmb680gYql76*77$Ni}o zhcP2f49aTwTt5cJMl}AY-463pQ8KrUcZxU^j7H9Lew2~%D@;?}!Z-@XCN!*TYvK7} zhA;ZM4awRJmoPfPU})^}Yhpij_cuU1;bnNA$}3EpiR+fH{mp1}Oe})7HhQ-7SG`Z= z-N~VK%X5+WFm0A1)=M)OTd+QJX0|ZaJeeF3hnZ366Gl52ThVaeo1*eK3U5w`)0l&C zw1V*t8jgx0HRnXFGuX4uDYL+%SsZgQjy5p1p>g$acR}{;KIf#<2@p?sF*D{VTcC52 zJ_e&2je;qBFYH!aDX9^;7~^6MqnS3}Cye7@)S%H}w+q9sm0%oDkHyR=E*3@?7`14W zU7Q4MyOod;Wz7wbqa-MdZZO`J#$;jSTg`Jxm7&3rX$#$A?Kgq39gUfD)xh!r5B;m+ zdCUd=%dr@_$oa+VnYNe+V?P)>&}cciFmPqw9@=~LX*AMwBJ>Uvx#kuR34_nmIy9Qr z<^`+{Mmy`~qp>uWu>|*IzFyu#BXF|Xd9kjBcD0@Ii`MiN-5uGt}G% zR#D5RLulm7?9KY46!&C4Pj{hlXjYz@y{4KrxBQI8y;yOSb&ELonuGrU{zPT(kF@!l zM*4Skn%<|e;#i7%@&Pa!(5U(@P3`@?lHTmUOhp8+M`AI{<;8jthX;&CGK_!gz3FHjWFwLlmY& zH&R@1*+NplXqSdpH|in`kBK36R|~O%aUjwdf>@yV#5ez;M32Mjfr}QB3I_Zd0VjkE z!1JT!5>%oasZbBbC@>C6w6+E2F$qY;cxq;X9*uEBG|i&-4$!G8gu&6cqM literal 0 HcmV?d00001 diff --git a/system/maps/xb-v3/map_lobby_07o.dat b/system/maps/xb-v3/map_lobby_07o.dat new file mode 100644 index 0000000000000000000000000000000000000000..325bffc999b412e0ee0c9abeb161af817a3522b2 GIT binary patch literal 3536 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 A-~a#s literal 0 HcmV?d00001 diff --git a/system/maps/xb-v3/map_lobby_09o.dat b/system/maps/xb-v3/map_lobby_09o.dat new file mode 100644 index 0000000000000000000000000000000000000000..3bbd16cd8e8e86b92c54a604a8fbd6907b5a798c GIT binary patch literal 3740 zcma*qYitx%6ae7M#=dreF2w%Q)QPA8)5x+diiEPWGmx!RY^_mf+8_H16BFW^ikcX7 z#9$jGvLIrm54NsyGSg5M5CeDhbw9=D?+s$P>JHX=gi#~o$TDCy|Z`b zesj*bb7$Kf^B61ISIRb=Weg6PXN5b?SXlO#IH1pLnujs^DaaVsW)Dg`xbX%UBV_cs zTxi7f1{E)D6%$MheYu9lUNFv)(fm~f%ni#aBaqK3U=vt0Xkq z!5AlFcTA5kHtP+H?}2zSo0)OH^A(;;4;T}|*cMsV{F?Xqn_oYkDTsBYK7B^hS2HvY zf$;+wv6Wje7x%5#tQrY4dcjDLQGI#~*3`POhKxQiek7yelWwfXsj(L=)}uQ5GOx!w zV4Npoz||ZN+T2Ryo9|+nbx7o%t|?5xeZhN8UmHT>Fc?3jjjLbQr44^R!xKc~T`+zo zWBlmdYR&B)rLp!7%0!Q~0;s$>QO_9;Qm%oD~ zrKj>5t&1p!T(V9)tA#Me^Wja?*SXN(d;bEB*PXgYef;oZWmqf8j>FVgA4Y@k{UjNi z7S*YhEyujK)OS!l=ytG`&EoJ;9Qc?}=tSdlFfNnvbVH*$XunsPoR}g*&KJi(CpOHrXu#i@PE4dH0|BSAC{fN_<^%hy+-@yuPt&}TL?<54FX-C+DhM&RESupW}) zJHOPT@fgL?3C7=KR6bd&t~}P}O$_ezW=3J2%VvtB3ygorINKZcRLzWfD~1Xnp3G*J zOJndQC=UNy%D0aUnkCDO1#*l4#3lBB`daP6b3u(8@ILi@EXETspSLwR>ymBIHJ~OJ z`q6;*sc%piA)^kGMWcWWc%S-)gfV3p38NQxG>fB9f-7w7CNSO>2A{)YDWZC4{Ih83 zdZb2@g$X#eu>vp-2qScYj72$yn9uuk(~?CRe6q1ZFgj8O#K7aoHJF^aE<(|g#S$7t zU~~$DpXJ7#IdRCci4lbfHdYKqmoWNaJ-AUr>%y~C4M+ ziD3r<3_BPHbB$?;1zHq;^8nny}B%LW8ByG~{QdEfFcML4p{-J=7rz50hBJi59x#pygYOsKtnU3%2@Uvv&iA1( QMhs&F?wi@n;wVl04>Gn>fdBvi literal 0 HcmV?d00001 diff --git a/system/maps/xb-v3/map_lobby_10o.dat b/system/maps/xb-v3/map_lobby_10o.dat new file mode 100644 index 0000000000000000000000000000000000000000..1d21d43b6dcc8d9ff9a897c8abaca01d1b61f887 GIT binary patch literal 4760 zcmb8ydu&rx7y$4?W$PZm#$*D5rSg)E$;vhmk*x`?L*CBSLjDCSH28dS{n?EgE~k_>T<# zxFrf>l2kCbJ26AcXWZBe#yv8MFDwZ>q!Hvs6Bzf&s5sTw%Ge!O`?U|iiVRT)9`#T) zhwo#oWgi$1$T;Mv3e;K(0>2RvW9?vLLx$zYk7BX(1pRQ#8vr;blF;vT?2T&!3SuI5# zZX5vP5i;s8WGnMWt(F^pUMcgg-gw41cMTL^tplSc8L-ACGv;;`FKbM2UdESiL}M!$ zNn~u_QUHDJ^6tWJnirl7yh*83L_NuHierbNYR@>h@i`c90o%*k$0$qpXUQFEYIGi^ z#soVzwt-*ka~H|jfs>;Tw^lrx$nT}MaEkd3zU|$@p9*ln`B7w@^CiuJkEg8n+)5vBqeZ2 zm9vN06yDnt&yZ-}wt~@zjO-2%H!2I($<#Z%n&7!X&x%uSgR^R@VV)Jq$)B8Fy>e!}^pYTlFv(&qJbYL=Jcqnc)>xQ#{-_2u5Er(%!9s z&yO&CvG;9Q)~2|*aR`hoGB)`&{yg;zg55{9;6s{;$#vQA11zW0VUPLL(ERPwKM*|rB$+*0?*;#b^sw?kI666yZX2wkE z6Brz;AB+KHP_H|X!wRZJ5{^DEq6LqtHjDOL0E~fTw0BEwbE`MVo&C!U&rkww23h%-gp-L1S(gH@*O42pP$5PIRU(I_f&T*p{F%&+`!!X2tztC&M`w z$Dvtrr=~|65%YrIl_FH_#V&5(zI~F6CWnI?eyu{`_pJ-x9iH20V}Z&I+%H4PsQMuf z`Zh~pBgQj1+NjFp2F}YcVdQh8I4#jy7JAp?c$@%ZI2laEXQBNpV_v_gf{yw+jcix7 zmmSA-2WpQnIzvPlJYgN9oV_?9QJ9-e*6dC%S!&aD19;&v4_8hK{(bWFi z`}xW#Tfp__oP5KWni)%J&*6T_Bg0lbGw^W6Ym^7>m#2j>h8xwRvl6UjS=WcSPT_Z9 z$yU8a{LW^~1M4+1JTCD(#n$k6{PA9`iU#~nE;%XMgA(=cIgEE#dFrbAS zBMf;+l8NDi4i=UIMuRX8!hB#J(`a7s4j!r$+emf8WeZCMqfr>GA!DP#@R}I#&jK20 zVC*s)U62cekH6y|QtUj^yl~ON(!qegdcX-|o$&dwY6(iQjdW-SqZb&vg>ldyW#AnY zke8TW(F85G(t~hjVZFiFBaGIN5voNJ_h*_Iy;N@W0b{Sx2#smju$vgY?cB%!qe&Q@ zCbc-s3?JXO`2097jGzx(hzT+s#kEx=f)N=z81!nkZ}b* LH!{rf$O!%qmbu}{ literal 0 HcmV?d00001 diff --git a/system/maps/xb-v3/map_lobby_green_be00o.dat b/system/maps/xb-v3/map_lobby_green_be00o.dat new file mode 100644 index 0000000000000000000000000000000000000000..80ca30510c5848ec96cc2dac6d8a5f09b6a910cd GIT binary patch literal 1564 zcmb8vPe@cj90%~L=pK+^ea!~C1owI;!@R4B-(KCIPMd3KjZjqUzf(nq9J4d!}z{29fgsWM%Ea` zbIWIEVL`XFxvs17AgUp9xmEn}*tjZKs z$ny+KHL`-pqLp?Hb=+iQV&@TMcn2=FD$7xKed9eXY4Hnb7^`61Vq>O$Oc}F7ms`|W zha)WgPWasfitxWS!&nVt$gG9?_v|{#`yz}%j(NA-!gobW4P2f{9&}js3IrC zNF9Q)2F7hR66bq3)=Va6L6K{5D(BJTp?56|{U6IVjVPn@`Cs0ToCIXC$a5+i$7H)j z>tKwQuI1Udn@6l^wJ7I=7(R@87-MEM;)oizWXcTRscg6c#(Eg~%+0n|tJv7?ZZ;AS zmA|jDaXb!V1B^SI$KV-`{e3A`X4HlmIm}_>ygX*3WmznVHh-o|)g;dmmw1SAB87e% z=j90-U-ovZ*vzA7nb90#^wNb0(N?TwoQ;95H+i_;!MAMShbrc*pbm;C^m-y<(KZ}cW#}r0ygmq57k}*LEH~Qi*5-{}l9yKRQyV8dkJG7t D+e6&b literal 0 HcmV?d00001 diff --git a/system/maps/xb-v3/map_lobby_red_be00o.dat b/system/maps/xb-v3/map_lobby_red_be00o.dat new file mode 100644 index 0000000000000000000000000000000000000000..80ca30510c5848ec96cc2dac6d8a5f09b6a910cd GIT binary patch literal 1564 zcmb8vPe@cj90%~L=pK+^ea!~C1owI;!@R4B-(KCIPMd3KjZjqUzf(nq9J4d!}z{29fgsWM%Ea` zbIWIEVL`XFxvs17AgUp9xmEn}*tjZKs z$ny+KHL`-pqLp?Hb=+iQV&@TMcn2=FD$7xKed9eXY4Hnb7^`61Vq>O$Oc}F7ms`|W zha)WgPWasfitxWS!&nVt$gG9?_v|{#`yz}%j(NA-!gobW4P2f{9&}js3IrC zNF9Q)2F7hR66bq3)=Va6L6K{5D(BJTp?56|{U6IVjVPn@`Cs0ToCIXC$a5+i$7H)j z>tKwQuI1Udn@6l^wJ7I=7(R@87-MEM;)oizWXcTRscg6c#(Eg~%+0n|tJv7?ZZ;AS zmA|jDaXb!V1B^SI$KV-`{e3A`X4HlmIm}_>ygX*3WmznVHh-o|)g;dmmw1SAB87e% z=j90-U-ovZ*vzA7nb90#^wNb0(N?TwoQ;95H+i_;!MAMShbrc*pbm;C^m-y<(KZ}cW#}r0ygmq57k}*LEH~Qi*5-{}l9yKRQyV8dkJG7t D+e6&b literal 0 HcmV?d00001 diff --git a/system/maps/xb-v3/map_lobby_soccer01o.dat b/system/maps/xb-v3/map_lobby_soccer01o.dat new file mode 100644 index 0000000000000000000000000000000000000000..9d6f55f289c56233c5a48fd84d4662be6973c183 GIT binary patch literal 1700 zcmbW$OHWfl6bJCrq84L}{QxZb35*NYG6kbsLc&H}G%mX41GpG$;sYP4mLiJKt0=Dk zRsj=54U`RP+!@!6dvE#;>iN%^JEgaGLgFO1bMHKUbLPyHi0Dh^99@|vO7Z(iN{?{G z^`NOq;|qO-JdqxfN80eK|F%a_e}z#M<21DzXzMj5d`3(2;;S%b#8|vhHS1seedz#J zR5Ii-LMp>pgYi_1KX)p|*m{(gy;#I=oX=s%dl<7~*eSf1>oyKv#Fd16gg5KxUWf5a zjDBkIzLAfyE+g&o38zzZI9b5g28`#<*hgEhK`QZF!dn|xq%!{$`tA;%6?3S)}ol9qaJRhYdj1?F)G3sK_^7u8I zQ$&Rlok`rdokedQ#!E3y(RN}!(iEtUgIQ8^cvs==9gJ7bXrQe(AA8DUG%S58(QRdZj{D=$}N0;G`ViN%^JEgaGLgFO1bMHKUbLPyHi0Dh^99@|vO7Z(iN{?{G z^`NOq;|qO-JdqxfN80eK|F%a_e}z#M<21DzXzMj5d`3(2;;S%b#8|vhHS1seedz#J zR5Ii-LMp>pgYi_1KX)p|*m{(gy;#I=oX=s%dl<7~*eSf1>oyKv#Fd16gg5KxUWf5a zjDBkIzLAfyE+g&o38zzZI9b5g28`#<*hgEhK`QZF!dn|xq%!{$`tA;%6?3S)}ol9qaJRhYdj1?F)G3sK_^7u8I zQ$&Rlok`rdokedQ#!E3y(RN}!(iEtUgIQ8^cvs==9gJ7bXrQe(AA8DUG%S58(QRdZj{D=$}N0;G`VL=pK+^ea!~C1owI;!@R4B-(KCIPMd3KjZjqUzf(nq9J4d!}z{29fgsWM%Ea` zbIWIEVL`XFxvs17AgUp9xmEn}*tjZKs z$ny+KHL`-pqLp?Hb=+iQV&@TMcn2=FD$7xKed9eXY4Hnb7^`61Vq>O$Oc}F7ms`|W zha)WgPWasfitxWS!&nVt$gG9?_v|{#`yz}%j(NA-!gobW4P2f{9&}js3IrC zNF9Q)2F7hR66bq3)=Va6L6K{5D(BJTp?56|{U6IVjVPn@`Cs0ToCIXC$a5+i$7H)j z>tKwQuI1Udn@6l^wJ7I=7(R@87-MEM;)oizWXcTRscg6c#(Eg~%+0n|tJv7?ZZ;AS zmA|jDaXb!V1B^SI$KV-`{e3A`X4HlmIm}_>ygX*3WmznVHh-o|)g;dmmw1SAB87e% z=j90-U-ovZ*vzA7nb90#^wNb0(N?TwoQ;95H+i_;!MAMShbrc*pbm;C^m-y<(KZ}cW#}r0ygmq57k}*LEH~Qi*5-{}l9yKRQyV8dkJG7t D+e6&b literal 0 HcmV?d00001