From 0f45ced3e9363c443b6fc05c58d89a98bd3aba02 Mon Sep 17 00:00:00 2001 From: Martin Michelsen Date: Sat, 25 Nov 2023 19:23:25 -0800 Subject: [PATCH] add DC NTE map variations --- src/Map.cc | 10 ++++++++++ src/Map.hh | 3 +++ src/ReceiveCommands.cc | 6 +++--- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/Map.cc b/src/Map.cc index 0e9c2bb3..3c70a05a 100644 --- a/src/Map.cc +++ b/src/Map.cc @@ -1252,6 +1252,16 @@ void generate_variations( } } +void generate_variations_dc_nte( + parray& variations, + shared_ptr random_crypt) { + static const std::array maxes( + {1, 1, 1, 2, 1, 2, 2, 2, 2, 2, 2, 2, 1, 2, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}); + for (size_t z = 0; z < 0x20; z++) { + variations[z] = (maxes[z] < 2) ? 0 : (random_crypt->next() % maxes[z]); + } +} + vector map_filenames_for_variation( Episode episode, bool is_solo, uint8_t floor, uint32_t var1, uint32_t var2, bool is_enemies) { // Map filenames are like map_[_VV][_VV][_off][_s].dat diff --git a/src/Map.hh b/src/Map.hh index 3df1979f..a97bd649 100644 --- a/src/Map.hh +++ b/src/Map.hh @@ -325,6 +325,9 @@ void generate_variations( std::shared_ptr random, Episode episode, bool is_solo); +void generate_variations_dc_nte( + parray& variations, + std::shared_ptr random); std::vector map_filenames_for_variation( Episode episode, bool is_solo, uint8_t floor, uint32_t var1, uint32_t var2, bool is_enemies); void load_map_files(); diff --git a/src/ReceiveCommands.cc b/src/ReceiveCommands.cc index 6b4e6930..c4610ba4 100644 --- a/src/ReceiveCommands.cc +++ b/src/ReceiveCommands.cc @@ -3795,10 +3795,10 @@ shared_ptr create_game_generic( bool is_solo = (game->mode == GameMode::SOLO); // Generate the map variations - if (game->is_ep3() || - (c->version() == Version::DC_NTE) || - (c->version() == Version::DC_V1_12_2000_PROTOTYPE)) { + if (game->is_ep3()) { game->variations.clear(0); + } else if ((c->version() == Version::DC_NTE) || (c->version() == Version::DC_V1_12_2000_PROTOTYPE)) { + generate_variations_dc_nte(game->variations, game->random_crypt); } else { generate_variations(game->variations, game->random_crypt, game->episode, is_solo); }