support non-BB rare enemy generation logic
This commit is contained in:
@@ -5,6 +5,7 @@
|
|||||||
- Make UI strings localizable (e.g. entries in menus, welcome message, etc.)
|
- Make UI strings localizable (e.g. entries in menus, welcome message, etc.)
|
||||||
- Add an idle connection timeout for proxy sessions
|
- Add an idle connection timeout for proxy sessions
|
||||||
- Look into JP heart symbol bug on Linux
|
- Look into JP heart symbol bug on Linux
|
||||||
|
- Check server's rare enemy logic against GC's logic
|
||||||
|
|
||||||
## Episode 3
|
## Episode 3
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -262,7 +262,7 @@ void Lobby::create_item_creator() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Lobby::load_maps() {
|
void Lobby::load_maps() {
|
||||||
this->map = make_shared<Map>(this->lobby_id, this->random_crypt);
|
this->map = make_shared<Map>(this->base_version, this->lobby_id, this->random_crypt);
|
||||||
|
|
||||||
auto rare_rates = ((this->base_version == Version::BB_V4) && this->rare_enemy_rates)
|
auto rare_rates = ((this->base_version == Version::BB_V4) && this->rare_enemy_rates)
|
||||||
? this->rare_enemy_rates
|
? this->rare_enemy_rates
|
||||||
|
|||||||
+22
-4
@@ -683,8 +683,9 @@ string Map::Object::str() const {
|
|||||||
this->item_drop_checked ? "true" : "false");
|
this->item_drop_checked ? "true" : "false");
|
||||||
}
|
}
|
||||||
|
|
||||||
Map::Map(uint32_t lobby_id, std::shared_ptr<PSOLFGEncryption> random_crypt)
|
Map::Map(Version version, uint32_t lobby_id, std::shared_ptr<PSOLFGEncryption> random_crypt)
|
||||||
: log(string_printf("[Lobby:%08" PRIX32 ":map] ", lobby_id), lobby_log.min_level),
|
: log(string_printf("[Lobby:%08" PRIX32 ":map] ", lobby_id), lobby_log.min_level),
|
||||||
|
version(version),
|
||||||
random_crypt(random_crypt) {}
|
random_crypt(random_crypt) {}
|
||||||
|
|
||||||
void Map::clear() {
|
void Map::clear() {
|
||||||
@@ -722,10 +723,27 @@ bool Map::check_and_log_rare_enemy(bool default_is_rare, uint32_t rare_rate) {
|
|||||||
if (default_is_rare) {
|
if (default_is_rare) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if ((this->rare_enemy_indexes.size() < 0x10) && (this->random_crypt->next() < rare_rate)) {
|
|
||||||
this->rare_enemy_indexes.emplace_back(this->enemies.size());
|
// On BB, rare enemy indexes are generated by the server and sent to the
|
||||||
return true;
|
// client, so we can use any method we want to choose rares. On other
|
||||||
|
// versions, we must match the client's logic, even though it's more
|
||||||
|
// computationally expensive.
|
||||||
|
if (this->version == Version::BB_V4) {
|
||||||
|
if ((this->rare_enemy_indexes.size() < 0x10) && (this->random_crypt->next() < rare_rate)) {
|
||||||
|
this->rare_enemy_indexes.emplace_back(this->enemies.size());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// TODO: We only need the first value from this crypt, so it's unfortunate
|
||||||
|
// that we have to initialize the entire thing. Find a way to make this
|
||||||
|
// faster.
|
||||||
|
PSOV2Encryption crypt(this->random_crypt->seed());
|
||||||
|
if ((static_cast<float>((crypt.next() >> 16) & 0xFFFF) / 65536.0f) < 0.002f) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-1
@@ -256,7 +256,7 @@ struct Map {
|
|||||||
void generate_shuffled_location_table(const Map::RandomEnemyLocationsHeader& header, StringReader r, uint16_t section);
|
void generate_shuffled_location_table(const Map::RandomEnemyLocationsHeader& header, StringReader r, uint16_t section);
|
||||||
};
|
};
|
||||||
|
|
||||||
Map(uint32_t lobby_id, std::shared_ptr<PSOLFGEncryption> random_crypt);
|
Map(Version version, uint32_t lobby_id, std::shared_ptr<PSOLFGEncryption> random_crypt);
|
||||||
~Map() = default;
|
~Map() = default;
|
||||||
|
|
||||||
void clear();
|
void clear();
|
||||||
@@ -315,6 +315,7 @@ struct Map {
|
|||||||
static std::string disassemble_quest_data(const void* data, size_t size);
|
static std::string disassemble_quest_data(const void* data, size_t size);
|
||||||
|
|
||||||
PrefixedLogger log;
|
PrefixedLogger log;
|
||||||
|
Version version;
|
||||||
std::shared_ptr<PSOLFGEncryption> random_crypt;
|
std::shared_ptr<PSOLFGEncryption> random_crypt;
|
||||||
std::vector<Object> objects;
|
std::vector<Object> objects;
|
||||||
std::vector<Enemy> enemies;
|
std::vector<Enemy> enemies;
|
||||||
|
|||||||
Reference in New Issue
Block a user