bool Game_Map::PrepareEncounter() { if (GetEncounterRate() <= 0) { return false; } int x = Main_Data::game_player->GetX(); int y = Main_Data::game_player->GetY(); std::vector<int> encounters; GetEncountersAt(x, y, encounters); if (encounters.empty()) { // No enemies on this map :( return false; } Game_Temp::battle_terrain_id = Game_Map::GetTerrainTag(Main_Data::game_player->GetX(), Main_Data::game_player->GetY()); Game_Temp::battle_troop_id = encounters[rand() / (RAND_MAX / encounters.size() + 1)]; Game_Temp::battle_escape_mode = -1; int current_index = GetMapIndex(location.map_id); while (Data::treemap.maps[current_index].background_type == 0 && GetMapIndex(Data::treemap.maps[current_index].parent_map) != current_index) { current_index = GetMapIndex(Data::treemap.maps[current_index].parent_map); } if (Data::treemap.maps[current_index].background_type == 2) { Game_Temp::battle_background = Data::treemap.maps[current_index].background_name; } else { Game_Temp::battle_background = Data::terrains[Game_Temp::battle_terrain_id - 1].background_name; } Game_Temp::battle_calling = true; return true; }
bool Game_Map::PrepareEncounter() { if (GetEncounterRate() <= 0) { return false; } int x = Main_Data::game_player->GetX(); int y = Main_Data::game_player->GetY(); std::vector<int> encounters = GetEncountersAt(x, y); if (encounters.empty()) { // No enemies on this map :( return false; } Game_Temp::battle_troop_id = encounters[Utils::GetRandomNumber(0, encounters.size() - 1)]; Game_Temp::battle_calling = true; if (Utils::GetRandomNumber(1, 32) == 1) { Game_Temp::battle_first_strike = true; } SetupBattle(); return true; }
void Game_Map::ResetEncounterSteps() { int rate = GetEncounterRate(); if (rate > 0) { int throw_one = rand() / (RAND_MAX / rate + 1); int throw_two = rand() / (RAND_MAX / rate + 1); // *100 to handle terrain rate better location.encounter_steps = (throw_one + throw_two + 1) * 100; } }
bool Game_Map::PrepareEncounter() { if (GetEncounterRate() <= 0) { return false; } int x = Main_Data::game_player->GetX(); int y = Main_Data::game_player->GetY(); std::vector<int> encounters; GetEncountersAt(x, y, encounters); if (encounters.empty()) { // No enemies on this map :( return false; } Game_Temp::battle_terrain_id = Game_Map::GetTerrainTag(Main_Data::game_player->GetX(), Main_Data::game_player->GetY()); Game_Temp::battle_background = ""; Game_Temp::battle_troop_id = encounters[rand() / (RAND_MAX / encounters.size() + 1)]; Game_Temp::battle_escape_mode = -1; Game_Temp::battle_calling = true; return true; }
void Game_Map::UpdateEncounterSteps() { if (Player::debug_flag && Input::IsPressed(Input::DEBUG_THROUGH)) { return; } if(Main_Data::game_player->InAirship()) { return; } if (GetEncounterRate() <= 0) { location.encounter_steps = 0; return; } int x = Main_Data::game_player->GetX(); int y = Main_Data::game_player->GetY(); const RPG::Terrain* terrain = ReaderUtil::GetElement(Data::terrains, GetTerrainTag(x,y)); if (!terrain) { Output::Warning("UpdateEncounterSteps: Invalid terrain at (%d, %d)", x, y); return; } location.encounter_steps += terrain->encounter_rate; struct Row { int ratio; float pmod; }; #if 1 static constexpr Row enc_table[] = { { 0, 0.0625}, { 20, 0.125 }, { 40, 0.25 }, { 60, 0.5 }, { 100, 2.0 }, { 140, 4.0 }, { 160, 8.0 }, { 180, 16.0 }, { INT_MAX, 16.0 } }; #else //Old versions of RM2k used this table. //Left here for posterity. static constexpr Row enc_table[] = { { 0, 0.5 }, { 20, 2.0 / 3.0 }, { 50, 5.0 / 6.0 }, { 100, 6.0 / 5.0 }, { 200, 3.0 / 2.0 }, { INT_MAX, 3.0 / 2.0 } }; #endif const auto encounter_rate = GetEncounterRate(); const auto ratio = location.encounter_steps / encounter_rate; auto& idx = last_encounter_idx; while (ratio > enc_table[idx+1].ratio) { ++idx; } const auto& row = enc_table[idx]; const auto pmod = row.pmod; const auto p = (1.0f / float(encounter_rate)) * pmod * (float(terrain->encounter_rate) / 100.0f); if (Utils::PercentChance(p)) { SetEncounterSteps(0); PrepareEncounter(); } }