bool Game_Interpreter_Map::ContinuationShowInnStart(RPG::EventCommand const& /* com */) { if (Game_Message::visible) { return false; } continuation = NULL; bool inn_stay = Game_Message::choice_result == 0; Game_Temp::inn_calling = false; if (inn_stay) { Main_Data::game_party->GainGold(-Game_Temp::inn_price); // Full heal std::vector<Game_Actor*> actors = Main_Data::game_party->GetActors(); for (Game_Actor* actor : actors) { actor->RemoveAllStates(); actor->ChangeHp(actor->GetMaxHp()); actor->SetSp(actor->GetMaxSp()); } Graphics::GetTransition().Init(Transition::TransitionFadeOut, Scene::instance.get(), 36, true); Game_System::BgmFade(800); SetContinuation(static_cast<ContinuationFunction>(&Game_Interpreter_Map::ContinuationShowInnContinue)); return false; } if (Game_Temp::inn_handlers) SkipTo(Cmd::NoStay, Cmd::EndInn); index++; return true; }
bool Game_Interpreter_Map::CommandOpenShop(RPG::EventCommand const& com) { // code 10720 if (Game_Message::visible) { return false; } switch (com.parameters[0]) { case 0: Game_Temp::shop_buys = true; Game_Temp::shop_sells = true; break; case 1: Game_Temp::shop_buys = true; Game_Temp::shop_sells = false; break; case 2: Game_Temp::shop_buys = false; Game_Temp::shop_sells = true; break; default: return false; } Game_Temp::shop_type = com.parameters[1]; Game_Temp::shop_handlers = com.parameters[2] != 0; Game_Temp::shop_goods.clear(); std::vector<int32_t>::const_iterator it; for (it = com.parameters.begin() + 4; it < com.parameters.end(); ++it) Game_Temp::shop_goods.push_back(*it); Game_Temp::shop_transaction = false; scene_call = Scene::Shop; SetContinuation(static_cast<ContinuationFunction>(&Game_Interpreter_Map::ContinuationOpenShop)); return false; }
// Setup Choices void Game_Interpreter::SetupChoices(const std::vector<std::string>& choices) { Game_Message::choice_start = Game_Message::texts.size(); Game_Message::choice_max = choices.size(); Game_Message::choice_disabled.reset(); // Set choices to message text unsigned int i; for (i = 0; i < choices.size(); i++) { Game_Message::texts.push_back(choices[i]); } SetContinuation(&Game_Interpreter::ContinuationChoices); }
bool Game_Interpreter_Map::ContinuationShowInnContinue(RPG::EventCommand const& /* com */) { if (Graphics::IsTransitionPending()) return false; const RPG::Music& bgm_inn = Game_System::GetSystemBGM(Game_System::BGM_Inn); // FIXME: Abusing before_battle_music (Which is unused when calling an Inn) // Is there also before_inn_music in the savegame? Main_Data::game_data.system.before_battle_music = Game_System::GetCurrentBGM(); Game_System::BgmPlay(bgm_inn); SetContinuation(static_cast<ContinuationFunction>(&Game_Interpreter_Map::ContinuationShowInnFinish)); return false; }
bool Game_Interpreter_Map::CommandEnemyEncounter(RPG::EventCommand const& com) { // code 10710 if (Game_Message::visible) { return false; } Game_Temp::battle_troop_id = ValueOrVariable(com.parameters[0], com.parameters[1]); Game_Character *player = Main_Data::game_player.get(); Game_Battle::SetTerrainId(Game_Map::GetTerrainTag(player->GetX(), player->GetY())); switch (com.parameters[2]) { case 0: Game_Map::SetupBattle(); break; case 1: Game_Temp::battle_background = com.string; if (Player::IsRPG2k()) Game_Temp::battle_formation = 0; else Game_Temp::battle_formation = com.parameters[7]; break; case 2: Game_Battle::SetTerrainId(com.parameters[8]); break; default: return false; } Game_Temp::battle_escape_mode = com.parameters[3]; // 0 disallow, 1 end event processing, 2 victory/escape custom handler Game_Temp::battle_defeat_mode = com.parameters[4]; // 0 game over, 1 victory/defeat custom handler Game_Temp::battle_first_strike = com.parameters[5] != 0; if (Player::IsRPG2k()) Game_Battle::SetBattleMode(0); else Game_Battle::SetBattleMode(com.parameters[6]); // 0 normal, 1 initiative, 2 surround, 3 back attack, 4 pincer Game_Temp::battle_result = Game_Temp::BattleVictory; scene_call = Scene::Battle; SetContinuation(static_cast<ContinuationFunction>(&Game_Interpreter_Map::ContinuationEnemyEncounter)); return false; }
bool Game_Interpreter::CommandGameOver(RPG::EventCommand const& /* com */) { // code 12420 CloseMessageWindow(); Game_Temp::gameover = true; SetContinuation(&Game_Interpreter::DefaultContinuation); return false; }
bool Game_Interpreter_Map::CommandShowInn(RPG::EventCommand const& com) { // code 10730 int inn_type = com.parameters[0]; Game_Temp::inn_price = com.parameters[1]; Game_Temp::inn_handlers = com.parameters[2] != 0; if (Game_Temp::inn_price == 0) { // Skip prompt. Game_Message::choice_result = 0; SetContinuation(static_cast<ContinuationFunction>(&Game_Interpreter_Map::ContinuationShowInnStart)); return false; } Game_Message::message_waiting = true; Game_Message::texts.clear(); std::ostringstream out; switch (inn_type) { case 0: if (Player::IsRPG2kE()) { out << Game_Temp::inn_price; Game_Message::texts.push_back( Utils::ReplacePlaceholders( Data::terms.inn_a_greeting_1, {'V', 'U'}, {out.str(), Data::terms.gold} ) ); Game_Message::texts.push_back( Utils::ReplacePlaceholders( Data::terms.inn_a_greeting_3, {'V', 'U'}, {out.str(), Data::terms.gold} ) ); } else { out << Data::terms.inn_a_greeting_1 << " " << Game_Temp::inn_price << " " << Data::terms.gold << Data::terms.inn_a_greeting_2; Game_Message::texts.push_back(out.str()); Game_Message::texts.push_back(Data::terms.inn_a_greeting_3); } break; case 1: if (Player::IsRPG2kE()) { out << Game_Temp::inn_price; Game_Message::texts.push_back( Utils::ReplacePlaceholders( Data::terms.inn_b_greeting_1, {'V', 'U'}, {out.str(), Data::terms.gold} ) ); Game_Message::texts.push_back( Utils::ReplacePlaceholders( Data::terms.inn_b_greeting_3, {'V', 'U'}, {out.str(), Data::terms.gold} ) ); } else { out << Data::terms.inn_b_greeting_1 << " " << Game_Temp::inn_price << " " << Data::terms.gold << Data::terms.inn_b_greeting_2; Game_Message::texts.push_back(out.str()); Game_Message::texts.push_back(Data::terms.inn_b_greeting_3); } break; default: return false; } Game_Message::choice_start = Game_Message::texts.size(); switch (inn_type) { case 0: Game_Message::texts.push_back(Data::terms.inn_a_accept); Game_Message::texts.push_back(Data::terms.inn_a_cancel); break; case 1: Game_Message::texts.push_back(Data::terms.inn_b_accept); Game_Message::texts.push_back(Data::terms.inn_b_cancel); break; default: return false; } Game_Message::choice_max = 2; Game_Message::choice_disabled.reset(); if (Main_Data::game_party->GetGold() < Game_Temp::inn_price) Game_Message::choice_disabled.set(0); Game_Temp::inn_calling = true; Game_Message::choice_result = 4; SetContinuation(static_cast<ContinuationFunction>(&Game_Interpreter_Map::ContinuationShowInnStart)); return false; }