diff --git a/src/game_interpreter_map.cpp b/src/game_interpreter_map.cpp index 74e301f96de..5bf55e43537 100644 --- a/src/game_interpreter_map.cpp +++ b/src/game_interpreter_map.cpp @@ -90,14 +90,16 @@ void Game_Interpreter_Map::OnMapChange() { } bool Game_Interpreter_Map::RequestMainMenuScene(int subscreen_id, int actor_index, bool is_db_actor) { - if (Player::game_config.patch_direct_menu.Get() && subscreen_id == -1) { subscreen_id = Main_Data::game_variables->Get(Player::game_config.patch_direct_menu.Get()); actor_index = Main_Data::game_variables->Get(Player::game_config.patch_direct_menu.Get() + 1); + // When true refers to the index of an actor, instead of a party index is_db_actor = (actor_index < 0); actor_index = std::abs(actor_index); } + std::vector actors; + switch (subscreen_id) { case 1: // Inventory @@ -106,33 +108,36 @@ bool Game_Interpreter_Map::RequestMainMenuScene(int subscreen_id, int actor_inde case 2: // Skills case 3: // Equipment case 4: // Status - if (!is_db_actor) { + if (is_db_actor) { + Game_Actor* actor = Main_Data::game_actors->GetActor(actor_index); + if (!actor) { + Output::Warning("RequestMainMenu: Invalid actor ID {}", actor_index); + return false; + } + actors = std::vector{actor}; + actor_index = 0; + } else { + // 0, 1 and 5+ refer to the first actor if (actor_index == 0 || actor_index > 4) { actor_index = 1; } actor_index--; - } + actors = Main_Data::game_party->GetActors(); - if (is_db_actor && !Main_Data::game_actors->GetActor(actor_index)) { - Output::Warning("Invalid actor ID {}", actor_index); - return false; + if (actor_index < 0 || actor_index >= actors.size()) { + Output::Warning("RequestMainMenu: Invalid actor party member {}", actor_index); + return false; + } } if (subscreen_id == 2) { - Scene::instance->SetRequestedScene(std::make_shared(actor_index, 0, is_db_actor)); + Scene::instance->SetRequestedScene(std::make_shared(actors, actor_index)); } else if (subscreen_id == 3) { - Game_Actor* actor; - if (!is_db_actor) { - actor = Main_Data::game_party->GetActors()[actor_index]; - } - else { - actor = Main_Data::game_actors->GetActor(actor_index); - } - Scene::instance->SetRequestedScene(std::make_shared(*actor)); + Scene::instance->SetRequestedScene(std::make_shared(actors, actor_index)); } else if (subscreen_id == 4) { - Scene::instance->SetRequestedScene(std::make_shared(actor_index, is_db_actor)); + Scene::instance->SetRequestedScene(std::make_shared(actors, actor_index)); } return true; case 5: // Order diff --git a/src/scene_equip.cpp b/src/scene_equip.cpp index e258207615c..a945fb651be 100644 --- a/src/scene_equip.cpp +++ b/src/scene_equip.cpp @@ -27,10 +27,11 @@ #include "scene_menu.h" #include -Scene_Equip::Scene_Equip(Game_Actor& actor, int equip_index) : - actor(actor), - equip_index(equip_index) { +Scene_Equip::Scene_Equip(std::vector actors, int actor_index, int equip_index) : + actors(actors), actor_index(actor_index), equip_index(equip_index) { type = Scene::Equip; + + assert(!actors.empty()); } void Scene_Equip::Start() { @@ -40,9 +41,11 @@ void Scene_Equip::Start() { int menu_equip_status_height = 96; int menu_equip_height = 96; + const auto& actor = *actors[actor_index]; + help_window.reset(new Window_Help(Player::menu_offset_x, Player::menu_offset_y, MENU_WIDTH, menu_help_height)); - equipstatus_window.reset(new Window_EquipStatus(Player::menu_offset_x, Player::menu_offset_y + menu_help_height, menu_equip_status_width, menu_equip_status_height, actor.GetId())); - equip_window.reset(new Window_Equip(Player::menu_offset_x + menu_equip_status_width, Player::menu_offset_y + menu_help_height, (MENU_WIDTH - menu_equip_status_width), menu_equip_height, actor.GetId())); + equipstatus_window.reset(new Window_EquipStatus(Player::menu_offset_x, Player::menu_offset_y + menu_help_height, menu_equip_status_width, menu_equip_status_height, actor)); + equip_window.reset(new Window_Equip(Player::menu_offset_x + menu_equip_status_width, Player::menu_offset_y + menu_help_height, (MENU_WIDTH - menu_equip_status_width), menu_equip_height, actor)); equip_window->SetIndex(equip_index); @@ -94,6 +97,7 @@ void Scene_Equip::UpdateStatusWindow() { const lcf::rpg::Item* current_item = item_window->GetItem(); const auto eidx = equip_window->GetIndex(); + const auto& actor = *actors[actor_index]; auto atk = actor.GetBaseAtk(Game_Battler::WeaponAll, true, false); auto def = actor.GetBaseDef(Game_Battler::WeaponAll, true, false); @@ -167,6 +171,7 @@ void Scene_Equip::UpdateEquipSelection() { Main_Data::game_system->SePlay(Main_Data::game_system->GetSystemSE(Main_Data::game_system->SFX_Cancel)); Scene::Pop(); } else if (Input::IsTriggered(Input::DECISION)) { + const auto& actor = *actors[actor_index]; if (!CanRemoveEquipment(actor, equip_window->GetIndex())) { Main_Data::game_system->SePlay(Main_Data::game_system->GetSystemSE(Main_Data::game_system->SFX_Buzzer)); return; @@ -176,20 +181,18 @@ void Scene_Equip::UpdateEquipSelection() { equip_window->SetActive(false); item_window->SetActive(true); item_window->SetIndex(0); - } else if (Main_Data::game_party->GetActors().size() > 1 && Input::IsTriggered(Input::RIGHT)) { + } else if (actors.size() > 1 && Input::IsTriggered(Input::RIGHT)) { Main_Data::game_system->SePlay(Main_Data::game_system->GetSystemSE(Main_Data::game_system->SFX_Cursor)); - int actor_index = Main_Data::game_party->GetActorPositionInParty(actor.GetId()); - if (actor_index != -1) { - actor_index = (actor_index + 1) % Main_Data::game_party->GetActors().size(); - Scene::Push(std::make_shared((*Main_Data::game_party)[actor_index], equip_window->GetIndex()), true); - } - } else if (Main_Data::game_party->GetActors().size() > 1 && Input::IsTriggered(Input::LEFT)) { + const auto& actor = actors[actor_index]; + actor_index = (actor_index + 1) % actors.size(); + Scene::Push(std::make_shared(actors, actor_index, equip_window->GetIndex()), true); + } else if (actors.size() > 1 && Input::IsTriggered(Input::LEFT)) { Main_Data::game_system->SePlay(Main_Data::game_system->GetSystemSE(Main_Data::game_system->SFX_Cursor)); - int actor_index = Main_Data::game_party->GetActorPositionInParty(actor.GetId()); - if (actor_index != -1) { - actor_index = (actor_index + Main_Data::game_party->GetActors().size() - 1) % Main_Data::game_party->GetActors().size(); - Scene::Push(std::make_shared((*Main_Data::game_party)[actor_index], equip_window->GetIndex()), true); + actor_index = actor_index - 1; + if (actor_index < 0) { + actor_index = actors.size() - 1; } + Scene::Push(std::make_shared(actors, actor_index, equip_window->GetIndex()), true); } } @@ -204,6 +207,7 @@ void Scene_Equip::UpdateItemSelection() { const lcf::rpg::Item* current_item = item_window->GetItem(); int current_item_id = current_item ? current_item->ID : 0; + auto& actor = *actors[actor_index]; actor.ChangeEquipment( equip_window->GetIndex() + 1, current_item_id); diff --git a/src/scene_equip.h b/src/scene_equip.h index f96018d2c97..0fae6e8c94d 100644 --- a/src/scene_equip.h +++ b/src/scene_equip.h @@ -36,10 +36,11 @@ class Scene_Equip : public Scene { /** * Constructor. * - * @param actor actor in the party. + * @param actors Vector containing all the actors + * @param actor_index actor whose equipment is shown. * @param equip_index selected equipment. */ - Scene_Equip(Game_Actor& actor, int equip_index = 0); + Scene_Equip(std::vector actors, int actor_index, int equip_index = 0); void Start() override; void vUpdate() override; @@ -70,8 +71,9 @@ class Scene_Equip : public Scene { void UpdateItemSelection(); private: - /** Actor in the party whose equipment is displayed. */ - Game_Actor& actor; + std::vector actors; + /** Index of the actor in the party whose equipment is displayed. */ + int actor_index; /** Selected equipment on startup. */ int equip_index; diff --git a/src/scene_menu.cpp b/src/scene_menu.cpp index 9ab35a34e75..98c3b811280 100644 --- a/src/scene_menu.cpp +++ b/src/scene_menu.cpp @@ -271,15 +271,15 @@ void Scene_Menu::UpdateActorSelection() { return; } Main_Data::game_system->SePlay(Main_Data::game_system->GetSystemSE(Main_Data::game_system->SFX_Decision)); - Scene::Push(std::make_shared(menustatus_window->GetIndex())); + Scene::Push(std::make_shared(Main_Data::game_party->GetActors(), menustatus_window->GetIndex())); break; case Equipment: Main_Data::game_system->SePlay(Main_Data::game_system->GetSystemSE(Main_Data::game_system->SFX_Decision)); - Scene::Push(std::make_shared(*menustatus_window->GetActor())); + Scene::Push(std::make_shared(Main_Data::game_party->GetActors(), menustatus_window->GetIndex())); break; case Status: Main_Data::game_system->SePlay(Main_Data::game_system->GetSystemSE(Main_Data::game_system->SFX_Decision)); - Scene::Push(std::make_shared(menustatus_window->GetIndex())); + Scene::Push(std::make_shared(Main_Data::game_party->GetActors(), menustatus_window->GetIndex())); break; case Row: { diff --git a/src/scene_skill.cpp b/src/scene_skill.cpp index 1066fcb19ec..6824c278c99 100644 --- a/src/scene_skill.cpp +++ b/src/scene_skill.cpp @@ -29,9 +29,11 @@ #include "scene_teleport.h" #include "transition.h" -Scene_Skill::Scene_Skill(int actor_index, int skill_index, bool is_db_actor) : - actor_index(actor_index), skill_index(skill_index), is_db_actor(is_db_actor) { +Scene_Skill::Scene_Skill(std::vector actors, int actor_index, int skill_index) : + actors(actors), actor_index(actor_index), skill_index(skill_index) { Scene::type = Scene::Skill; + + assert(!actors.empty()); } void Scene_Skill::Start() { @@ -42,16 +44,11 @@ void Scene_Skill::Start() { skillstatus_window.reset(new Window_SkillStatus(Player::menu_offset_x, Player::menu_offset_y + window_help_height, MENU_WIDTH, window_skillstatus_height)); skill_window.reset(new Window_Skill(Player::menu_offset_x, Player::menu_offset_y + window_help_height + window_skillstatus_height, MENU_WIDTH, MENU_HEIGHT - (window_help_height + window_skillstatus_height))); - Game_Actor* actor; - if (!is_db_actor) { - actor = Main_Data::game_party->GetActors()[actor_index]; - } - else { - actor = Main_Data::game_actors->GetActor(actor_index); - } + const auto& actor = *actors[actor_index]; + // Assign actors and help to windows - skill_window->SetActor(actor->GetId()); - skillstatus_window->SetActor(actor->GetId()); + skill_window->SetActor(actor); + skillstatus_window->SetActor(actor); skill_window->SetIndex(skill_index); skill_window->SetHelpWindow(help_window.get()); } @@ -73,34 +70,25 @@ void Scene_Skill::vUpdate() { const lcf::rpg::Skill* skill = skill_window->GetSkill(); int skill_id = skill ? skill->ID : 0; - Game_Actor* actor; - if (!is_db_actor) { - actor = Main_Data::game_party->GetActors()[actor_index]; - } - else { - actor = Main_Data::game_actors->GetActor(actor_index); - } + auto& actor = *actors[actor_index]; if (skill && skill_window->CheckEnable(skill_id)) { if (skill->type == lcf::rpg::Skill::Type_switch) { Main_Data::game_system->SePlay(skill->sound_effect); - Main_Data::game_party->UseSkill(skill_id, actor, actor); + Main_Data::game_party->UseSkill(skill_id, &actor, &actor); Scene::PopUntil(Scene::Map); Game_Map::SetNeedRefresh(true); } else if (Algo::IsNormalOrSubskill(*skill)) { int actor_target_index = actor_index; - if (is_db_actor) { - actor_index = 0; - } Main_Data::game_system->SePlay(Main_Data::game_system->GetSystemSE(Main_Data::game_system->SFX_Decision)); Scene::Push(std::make_shared(skill_id, actor_index)); skill_index = skill_window->GetIndex(); } else if (skill->type == lcf::rpg::Skill::Type_teleport) { Main_Data::game_system->SePlay(Main_Data::game_system->GetSystemSE(Main_Data::game_system->SFX_Decision)); - Scene::Push(std::make_shared(*actor, *skill)); + Scene::Push(std::make_shared(actor, *skill)); } else if (skill->type == lcf::rpg::Skill::Type_escape) { Main_Data::game_system->SePlay(skill->sound_effect); - Main_Data::game_party->UseSkill(skill_id, actor, actor); + Main_Data::game_party->UseSkill(skill_id, &actor, &actor); Main_Data::game_player->ForceGetOffVehicle(); Main_Data::game_player->ReserveTeleport(Main_Data::game_targets->GetEscapeTarget()); diff --git a/src/scene_skill.h b/src/scene_skill.h index 81ce93ba5b6..23c1f7b5747 100644 --- a/src/scene_skill.h +++ b/src/scene_skill.h @@ -19,6 +19,7 @@ #define EP_SCENE_SKILL_H // Headers +#include #include "scene.h" #include "window_help.h" #include "window_skill.h" @@ -33,7 +34,8 @@ class Scene_Skill : public Scene { /** * Constructor. */ - Scene_Skill(int actor_index, int skill_index = 0, bool is_db_actor = false); + + Scene_Skill(std::vector actors, int actor_index, int skill_index = 0); void Start() override; void Continue(SceneType prev_scene) override; @@ -41,12 +43,11 @@ class Scene_Skill : public Scene { void TransitionOut(SceneType next_scene) override; private: - /** Actor in the party whose skills are displayed. */ + std::vector actors; + /** Actor in the span whose skills are displayed. */ int actor_index; /** Skill to select at startup. */ int skill_index; - /** Given actor index refers to a database actor instead of a party member index. */ - bool is_db_actor; /** Displays available skills. */ std::unique_ptr skill_window; /** Displays information about the actor. */ diff --git a/src/scene_status.cpp b/src/scene_status.cpp index 2bcfdac0dc7..4a41a98fc35 100644 --- a/src/scene_status.cpp +++ b/src/scene_status.cpp @@ -23,11 +23,13 @@ #include "game_party.h" #include "game_system.h" #include "input.h" -#include +#include "player.h" -Scene_Status::Scene_Status(int actor_index, bool is_db_actor) : - actor_index(actor_index), is_db_actor(is_db_actor) { +Scene_Status::Scene_Status(std::vector actors, int actor_index) : + actors(actors), actor_index(actor_index) { type = Scene::Status; + + assert(!actors.empty()); } void Scene_Status::Start() { @@ -42,14 +44,7 @@ void Scene_Status::Start() { int window_equip_width = 196; int window_equip_height = 96; - int actor; - - if (!is_db_actor) { - actor = Main_Data::game_party->GetActors()[actor_index]->GetId(); - } - else { - actor = Main_Data::game_actors->GetActor(actor_index)->GetId(); - } + const auto& actor = *actors[actor_index]; actorinfo_window.reset(new Window_ActorInfo(Player::menu_offset_x, Player::menu_offset_y, window_actor_info_width, window_actor_info_height, actor)); gold_window.reset(new Window_Gold(Player::menu_offset_x, Player::menu_offset_y + window_actor_info_height, window_gold_width, window_gold_height)); actorstatus_window.reset(new Window_ActorStatus(Player::menu_offset_x + window_actor_info_width, Player::menu_offset_y, window_actor_status_width, window_actor_status_height, actor)); @@ -70,13 +65,17 @@ void Scene_Status::vUpdate() { if (Input::IsTriggered(Input::CANCEL)) { Main_Data::game_system->SePlay(Main_Data::game_system->GetSystemSE(Main_Data::game_system->SFX_Cancel)); Scene::Pop(); - } else if (!is_db_actor && Main_Data::game_party->GetActors().size() > 1 && Input::IsTriggered(Input::RIGHT)) { + } else if (actors.size() > 1 && Input::IsTriggered(Input::RIGHT)) { Main_Data::game_system->SePlay(Main_Data::game_system->GetSystemSE(Main_Data::game_system->SFX_Cursor)); - actor_index = (actor_index + 1) % Main_Data::game_party->GetActors().size(); - Scene::Push(std::make_shared(actor_index), true); - } else if (!is_db_actor && Main_Data::game_party->GetActors().size() > 1 && Input::IsTriggered(Input::LEFT)) { + const auto& actor = actors[actor_index]; + actor_index = (actor_index + 1) % actors.size(); + Scene::Push(std::make_shared(actors, actor_index), true); + } else if (actors.size() > 1 && Input::IsTriggered(Input::LEFT)) { Main_Data::game_system->SePlay(Main_Data::game_system->GetSystemSE(Main_Data::game_system->SFX_Cursor)); - actor_index = (actor_index + Main_Data::game_party->GetActors().size() - 1) % Main_Data::game_party->GetActors().size(); - Scene::Push(std::make_shared(actor_index), true); + actor_index = actor_index - 1; + if (actor_index < 0) { + actor_index = actors.size() - 1; + } + Scene::Push(std::make_shared(actors, actor_index), true); } } diff --git a/src/scene_status.h b/src/scene_status.h index 2f9260d4b6b..1a2504631fc 100644 --- a/src/scene_status.h +++ b/src/scene_status.h @@ -19,6 +19,7 @@ #define EP_SCENE_STATUS_H // Headers +#include #include "scene.h" #include "window_actorinfo.h" #include "window_actorstatus.h" @@ -35,17 +36,17 @@ class Scene_Status : public Scene { /** * Constructor. * - * @param actor_index party index of the actor. + * @param actors list of actors + * @param index index in the span to show */ - Scene_Status(int actor_index, bool is_db_actor = false); + Scene_Status(std::vector actors, int actor_index); void Start() override; void vUpdate() override; private: + std::vector actors; int actor_index; - /** Given actor index refers to a database actor instead of a party member index. */ - bool is_db_actor; std::unique_ptr actorinfo_window; std::unique_ptr actorstatus_window; diff --git a/src/window_actorinfo.cpp b/src/window_actorinfo.cpp index 81acb8f4200..5d81663dd5c 100644 --- a/src/window_actorinfo.cpp +++ b/src/window_actorinfo.cpp @@ -25,9 +25,9 @@ #include "font.h" #include "feature.h" -Window_ActorInfo::Window_ActorInfo(int ix, int iy, int iwidth, int iheight, int actor_id) : +Window_ActorInfo::Window_ActorInfo(int ix, int iy, int iwidth, int iheight, const Game_Actor& actor) : Window_Base(ix, iy, iwidth, iheight), - actor_id(actor_id) { + actor(actor) { SetContents(Bitmap::Create(width - 16, height - 16)); @@ -43,12 +43,10 @@ void Window_ActorInfo::Refresh() { void Window_ActorInfo::DrawInfo() { if (Feature::HasRow()) { // Draw Row formation. - std::string battle_row = Main_Data::game_actors->GetActor(actor_id)->GetBattleRow() == Game_Actor::RowType::RowType_back ? lcf::rpg::Terms::TermOrDefault(lcf::Data::terms.easyrpg_status_scene_back, "Back") : lcf::rpg::Terms::TermOrDefault(lcf::Data::terms.easyrpg_status_scene_front, "Front"); + std::string battle_row = actor.GetBattleRow() == Game_Actor::RowType::RowType_back ? lcf::rpg::Terms::TermOrDefault(lcf::Data::terms.easyrpg_status_scene_back, "Back") : lcf::rpg::Terms::TermOrDefault(lcf::Data::terms.easyrpg_status_scene_front, "Front"); contents->TextDraw(contents->GetWidth(), 2, Font::ColorDefault, battle_row, Text::AlignRight); } - const Game_Actor& actor = *Main_Data::game_actors->GetActor(actor_id); - // Draw Face DrawActorFace(actor, 0, 0); diff --git a/src/window_actorinfo.h b/src/window_actorinfo.h index 11cd9d64062..8578c5b029d 100644 --- a/src/window_actorinfo.h +++ b/src/window_actorinfo.h @@ -31,7 +31,7 @@ class Window_ActorInfo : public Window_Base { /** * Constructor. */ - Window_ActorInfo(int ix, int iy, int iwidth, int iheight, int actor_id); + Window_ActorInfo(int ix, int iy, int iwidth, int iheight, const Game_Actor& actor); /** * Renders the stats on the window. @@ -43,7 +43,7 @@ class Window_ActorInfo : public Window_Base { */ void DrawInfo(); private: - int actor_id; + const Game_Actor& actor; }; #endif diff --git a/src/window_actorstatus.cpp b/src/window_actorstatus.cpp index 634ef2d4b40..17424c27287 100644 --- a/src/window_actorstatus.cpp +++ b/src/window_actorstatus.cpp @@ -24,9 +24,9 @@ #include "bitmap.h" #include "font.h" -Window_ActorStatus::Window_ActorStatus(int ix, int iy, int iwidth, int iheight, int actor_id) : +Window_ActorStatus::Window_ActorStatus(int ix, int iy, int iwidth, int iheight, const Game_Actor& actor) : Window_Base(ix, iy, iwidth, iheight), - actor_id(actor_id) { + actor(actor) { SetContents(Bitmap::Create(width - 16, height - 16)); @@ -40,9 +40,6 @@ void Window_ActorStatus::Refresh() { } void Window_ActorStatus::DrawStatus() { - - Game_Actor* actor = Main_Data::game_actors->GetActor(actor_id); - int have, max; auto fontcolor = [&have, &max](bool can_knockout) { if (can_knockout && have == 0) return Font::ColorKnockout; @@ -52,14 +49,14 @@ void Window_ActorStatus::DrawStatus() { // Draw Hp contents->TextDraw(1, 2, 1, lcf::Data::terms.health_points); - have = actor->GetHp(); - max = actor->GetMaxHp(); + have = actor.GetHp(); + max = actor.GetMaxHp(); DrawMinMax(90, 2, have, max, fontcolor(true)); // Draw Sp contents->TextDraw(1, 18, 1, lcf::Data::terms.spirit_points); - have = actor->GetSp(); - max = actor->GetMaxSp(); + have = actor.GetSp(); + max = actor.GetMaxSp(); DrawMinMax(90, 18, have, max, fontcolor(false)); // Draw Exp @@ -69,16 +66,18 @@ void Window_ActorStatus::DrawStatus() { void Window_ActorStatus::DrawMinMax(int cx, int cy, int min, int max, int color) { std::stringstream ss; - if (max >= 0) + if (max >= 0) { ss << min; - else - ss << Main_Data::game_actors->GetActor(actor_id)->GetExpString(true); + } else { + ss << actor.GetExpString(true); + } contents->TextDraw(cx, cy, color, ss.str(), Text::AlignRight); contents->TextDraw(cx, cy, Font::ColorDefault, "/"); ss.str(""); - if (max >= 0) + if (max >= 0) { ss << max; - else - ss << Main_Data::game_actors->GetActor(actor_id)->GetNextExpString(true); + } else { + ss << actor.GetNextExpString(true); + } contents->TextDraw(cx + 48, cy, Font::ColorDefault, ss.str(), Text::AlignRight); } diff --git a/src/window_actorstatus.h b/src/window_actorstatus.h index f8c3f333776..d44d0461351 100644 --- a/src/window_actorstatus.h +++ b/src/window_actorstatus.h @@ -32,7 +32,7 @@ class Window_ActorStatus : public Window_Base { /** * Constructor. */ - Window_ActorStatus(int ix, int iy, int iwidth, int iheight, int actor_id); + Window_ActorStatus(int ix, int iy, int iwidth, int iheight, const Game_Actor& actor); /** * Renders the stats on the window. @@ -50,7 +50,7 @@ class Window_ActorStatus : public Window_Base { void DrawMinMax(int cx, int cy, int min, int max, int color = Font::ColorDefault); private: - int actor_id; + const Game_Actor& actor; }; #endif diff --git a/src/window_battlecommand.cpp b/src/window_battlecommand.cpp index 9dcf370ddff..cbf76ae28c4 100644 --- a/src/window_battlecommand.cpp +++ b/src/window_battlecommand.cpp @@ -30,8 +30,6 @@ Window_BattleCommand::Window_BattleCommand(int x, int y, int width, int height) : Window_Base(x, y, width, height) { - SetActor(0); - disabled.resize(commands.size()); index = -1; top_row = 0; @@ -133,18 +131,17 @@ void Window_BattleCommand::SetIndex(int _index) { index = _index; } -void Window_BattleCommand::SetActor(int _actor_id) { - actor_id = Feature::HasRpg2kBattleSystem() ? 0 : _actor_id; +void Window_BattleCommand::SetActor(const Game_Actor* actor) { + this->actor = Feature::HasRpg2kBattleSystem() ? nullptr : actor; commands.clear(); - if (actor_id == 0) { + if (actor == nullptr) { commands.push_back(!lcf::Data::terms.command_attack.empty() ? ToString(lcf::Data::terms.command_attack) : "Attack"); commands.push_back(!lcf::Data::terms.command_defend.empty() ? ToString(lcf::Data::terms.command_defend) : "Defend"); commands.push_back(!lcf::Data::terms.command_item.empty() ? ToString(lcf::Data::terms.command_item) : "Item"); commands.push_back(!lcf::Data::terms.command_skill.empty() ? ToString(lcf::Data::terms.command_skill) : "Skill"); } else { - Game_Actor* actor = Main_Data::game_actors->GetActor(actor_id); const std::vector bcmds = actor->GetBattleCommands(); for (const lcf::rpg::BattleCommand* command : bcmds) { commands.push_back(ToString(command->name)); @@ -156,10 +153,10 @@ void Window_BattleCommand::SetActor(int _actor_id) { } int Window_BattleCommand::GetSkillSubset() { - if (actor_id == 0) + if (actor == nullptr) { return lcf::rpg::Skill::Type_normal; + } - Game_Actor* actor = Main_Data::game_actors->GetActor(actor_id); const std::vector bcmds = actor->GetBattleCommands(); int bcmd = bcmds[index]->ID; diff --git a/src/window_battlecommand.h b/src/window_battlecommand.h index dae98b09d88..6bf7eeffe1c 100644 --- a/src/window_battlecommand.h +++ b/src/window_battlecommand.h @@ -53,7 +53,7 @@ class Window_BattleCommand: public Window_Base { */ void SetEnabled(int index, bool enabled); - void SetActor(int actor_id); + void SetActor(const Game_Actor* actor); int GetIndex(); void SetIndex(int index); @@ -62,7 +62,7 @@ class Window_BattleCommand: public Window_Base { int GetSkillSubset(); protected: - int actor_id; + const Game_Actor* actor = nullptr; std::vector commands; int index; int num_rows; diff --git a/src/window_equip.cpp b/src/window_equip.cpp index 0cff3b8ec64..eb47ceca93c 100644 --- a/src/window_equip.cpp +++ b/src/window_equip.cpp @@ -22,9 +22,9 @@ #include #include "output.h" -Window_Equip::Window_Equip(int ix, int iy, int iwidth, int iheight, int actor_id) : +Window_Equip::Window_Equip(int ix, int iy, int iwidth, int iheight, const Game_Actor& actor) : Window_Selectable(ix, iy, iwidth, iheight), - actor_id(actor_id) { + actor(actor) { SetContents(Bitmap::Create(width - 16, height - 16)); @@ -42,16 +42,15 @@ void Window_Equip::Refresh() { // Add the equipment of the actor to data data.clear(); - Game_Actor* actor = Main_Data::game_actors->GetActor(actor_id); for (int i = 1; i <= 5; ++i) { - const lcf::rpg::Item* item = actor->GetEquipment(i); + const lcf::rpg::Item* item = actor.GetEquipment(i); data.push_back(item ? item->ID : 0); } item_max = data.size(); // Draw equipment text for (int i = 0; i < 5; ++i) { - DrawEquipmentType(*actor, 0, (12 + 4) * i + 2, i); + DrawEquipmentType(actor, 0, (12 + 4) * i + 2, i); if (data[i] > 0) { // Equipment and items are guaranteed to be valid DrawItemName(*lcf::ReaderUtil::GetElement(lcf::Data::items, data[i]), 60, (12 + 4) * i + 2); diff --git a/src/window_equip.h b/src/window_equip.h index 33938010b90..c416ae6b175 100644 --- a/src/window_equip.h +++ b/src/window_equip.h @@ -34,9 +34,9 @@ class Window_Equip : public Window_Selectable { * @param iy window y position. * @param iwidth window width. * @param iheight window height. - * @param actor_id actor whose inventory is displayed. + * @param actor actor whose inventory is displayed. */ - Window_Equip(int ix, int iy, int iwidth, int iheight, int actor_id); + Window_Equip(int ix, int iy, int iwidth, int iheight, const Game_Actor& actor); /** * Refreshes. @@ -56,8 +56,7 @@ class Window_Equip : public Window_Selectable { void UpdateHelp() override; private: - int actor_id; - + const Game_Actor& actor; std::vector data; }; diff --git a/src/window_equipitem.cpp b/src/window_equipitem.cpp index 57e2b62e088..457341c95f9 100644 --- a/src/window_equipitem.cpp +++ b/src/window_equipitem.cpp @@ -22,16 +22,16 @@ #include #include "output.h" -Window_EquipItem::Window_EquipItem(int ix, int iy, int iwidth, int iheight, int actor_id, int equip_type) : +Window_EquipItem::Window_EquipItem(int ix, int iy, int iwidth, int iheight, const Game_Actor& actor, int equip_type) : Window_Item(ix, iy, iwidth, iheight), - actor_id(actor_id) { + actor(actor) { this->equip_type = equip_type; if (equip_type > 4 || equip_type < 0) { this->equip_type = Window_EquipItem::other; } if (this->equip_type == Window_EquipItem::shield && - Main_Data::game_actors->GetActor(actor_id)->HasTwoWeapons()) { + actor.HasTwoWeapons()) { this->equip_type = Window_EquipItem::weapon; } @@ -39,7 +39,7 @@ Window_EquipItem::Window_EquipItem(int ix, int iy, int iwidth, int iheight, int bool Window_EquipItem::CheckInclude(int item_id) { // Do not show equippable items if the actor has its equipment fixed - if (Main_Data::game_actors->GetActor(actor_id)->IsEquipmentFixed(false)) { + if (actor.IsEquipmentFixed(false)) { return false; } @@ -78,7 +78,7 @@ bool Window_EquipItem::CheckInclude(int item_id) { if (Main_Data::game_party->GetItemCount(item_id) == 0) { return false; } else { - return Main_Data::game_actors->GetActor(actor_id)->IsEquippable(item_id); + return actor.IsEquippable(item_id); } } else { return false; diff --git a/src/window_equipitem.h b/src/window_equipitem.h index c427b3c5eec..4a6da1c58d9 100644 --- a/src/window_equipitem.h +++ b/src/window_equipitem.h @@ -40,10 +40,10 @@ class Window_EquipItem : public Window_Item { /** * Constructor. * - * @param actor_id actor whos equipment is displayed. + * @param actor actor whos equipment is displayed. * @param equip_type type of equipment to show. */ - Window_EquipItem(int ix, int iy, int iwidth, int iheight, int actor_id, int equip_type); + Window_EquipItem(int ix, int iy, int iwidth, int iheight, const Game_Actor& actor, int equip_type); /** * Checks if the item should be in the list based on @@ -61,8 +61,8 @@ class Window_EquipItem : public Window_Item { bool CheckEnable(int item_id) override; private: - int actor_id; - int equip_type; + const Game_Actor& actor; + int equip_type; }; #endif diff --git a/src/window_equipstatus.cpp b/src/window_equipstatus.cpp index ce379c74e70..719fced2952 100644 --- a/src/window_equipstatus.cpp +++ b/src/window_equipstatus.cpp @@ -24,9 +24,9 @@ #include "font.h" #include "player.h" -Window_EquipStatus::Window_EquipStatus(int ix, int iy, int iwidth, int iheight, int actor_id) : +Window_EquipStatus::Window_EquipStatus(int ix, int iy, int iwidth, int iheight, const Game_Actor& actor) : Window_Base(ix, iy, iwidth, iheight), - actor_id(actor_id), + actor(actor), draw_params(false), dirty(true) { @@ -43,7 +43,7 @@ void Window_EquipStatus::Refresh() { y_offset = 18; // Actor data is guaranteed to be valid - DrawActorName(*Main_Data::game_actors->GetActor(actor_id), 0, 2); + DrawActorName(actor, 0, 2); for (int i = 0; i < 4; ++i) { DrawParameter(0, y_offset + ((12 + 4) * i), i); @@ -87,27 +87,26 @@ void Window_EquipStatus::DrawParameter(int cx, int cy, int type) { StringView name; int value; int new_value; - Game_Actor* actor = Main_Data::game_actors->GetActor(actor_id); switch (type) { case 0: name = lcf::Data::terms.attack; - value = actor->GetAtk(); + value = actor.GetAtk(); new_value = atk; break; case 1: name = lcf::Data::terms.defense; - value = actor->GetDef(); + value = actor.GetDef(); new_value = def; break; case 2: name = lcf::Data::terms.spirit; - value = actor->GetSpi(); + value = actor.GetSpi(); new_value = spi; break; case 3: name = lcf::Data::terms.agility; - value = actor->GetAgi(); + value = actor.GetAgi(); new_value = agi; break; default: @@ -115,7 +114,7 @@ void Window_EquipStatus::DrawParameter(int cx, int cy, int type) { } // Check if 4 digits are needed instead of 3 - int limit = actor->MaxStatBaseValue(); + int limit = actor.MaxStatBaseValue(); bool more_space_needed = (Player::IsRPG2k3() && limit >= 500) || limit >= 1000; // Draw Term diff --git a/src/window_equipstatus.h b/src/window_equipstatus.h index 1c4094e68b0..a4eb5d8cab1 100644 --- a/src/window_equipstatus.h +++ b/src/window_equipstatus.h @@ -22,7 +22,7 @@ #include "window_base.h" /** - * Window_EquipLeft class. + * Window_EquipStatus class. * Displays stats of the hero/item. */ class Window_EquipStatus : public Window_Base { @@ -35,9 +35,9 @@ class Window_EquipStatus : public Window_Base { * @param iy window y position. * @param iwidth window width. * @param iheight window height. - * @param actor_id actor whose stats are displayed. + * @param actor actor whose stats are displayed. */ - Window_EquipStatus(int ix, int iy, int iwidth, int iheight, int actor_id); + Window_EquipStatus(int ix, int iy, int iwidth, int iheight, const Game_Actor& actor); /** * Refreshes screen. @@ -78,7 +78,8 @@ class Window_EquipStatus : public Window_Base { void DrawParameter(int cx, int cy, int type); private: - int actor_id; + const Game_Actor& actor; + /** Draws the params if true. */ bool draw_params; diff --git a/src/window_face.cpp b/src/window_face.cpp index 77f3c861d69..914829ae3d9 100644 --- a/src/window_face.cpp +++ b/src/window_face.cpp @@ -21,7 +21,7 @@ #include "window_face.h" Window_Face::Window_Face(int ix, int iy, int iwidth, int iheight) : - Window_Base(ix, iy, iwidth, iheight), actor_id(1) { + Window_Base(ix, iy, iwidth, iheight) { SetContents(Bitmap::Create(width - 16, height - 16)); } @@ -29,10 +29,10 @@ Window_Face::Window_Face(int ix, int iy, int iwidth, int iheight) : void Window_Face::Refresh() { contents->Clear(); // Actor data is guaranteed to be valid - DrawActorFace(*Main_Data::game_actors->GetActor(actor_id), 0, 0); + DrawActorFace(*actor, 0, 0); } -void Window_Face::Set(int id) { - actor_id = id; +void Window_Face::Set(const Game_Actor& actor) { + this->actor = &actor; Refresh(); } diff --git a/src/window_face.h b/src/window_face.h index 475a22eef73..1e780079b56 100644 --- a/src/window_face.h +++ b/src/window_face.h @@ -37,10 +37,10 @@ class Window_Face : public Window_Base { */ void Refresh(); - void Set(int actor_id); + void Set(const Game_Actor& actor); protected: - int actor_id; + const Game_Actor* actor = nullptr; }; #endif diff --git a/src/window_paramstatus.cpp b/src/window_paramstatus.cpp index 21087d98aff..87d75bcd769 100644 --- a/src/window_paramstatus.cpp +++ b/src/window_paramstatus.cpp @@ -23,9 +23,9 @@ #include "bitmap.h" #include "font.h" -Window_ParamStatus::Window_ParamStatus(int ix, int iy, int iwidth, int iheight, int actor_id) : +Window_ParamStatus::Window_ParamStatus(int ix, int iy, int iwidth, int iheight, const Game_Actor& actor) : Window_Base(ix, iy, iwidth, iheight), - actor_id(actor_id) + actor(actor) { SetContents(Bitmap::Create(width - 16, height - 16)); @@ -36,8 +36,6 @@ Window_ParamStatus::Window_ParamStatus(int ix, int iy, int iwidth, int iheight, void Window_ParamStatus::Refresh() { contents->Clear(); - auto* actor = Main_Data::game_actors->GetActor(actor_id); - auto draw = [this](int y, StringView name, int value) { // Draw Term contents->TextDraw(0, y, 1, name); @@ -48,9 +46,9 @@ void Window_ParamStatus::Refresh() { }; int y = 2; - y = draw(y, lcf::Data::terms.attack, actor->GetAtk()); - y = draw(y, lcf::Data::terms.defense, actor->GetDef()); - y = draw(y, lcf::Data::terms.spirit, actor->GetSpi()); - y = draw(y, lcf::Data::terms.agility, actor->GetAgi()); + y = draw(y, lcf::Data::terms.attack, actor.GetAtk()); + y = draw(y, lcf::Data::terms.defense, actor.GetDef()); + y = draw(y, lcf::Data::terms.spirit, actor.GetSpi()); + y = draw(y, lcf::Data::terms.agility, actor.GetAgi()); } diff --git a/src/window_paramstatus.h b/src/window_paramstatus.h index ac585e59c04..2de7122210d 100644 --- a/src/window_paramstatus.h +++ b/src/window_paramstatus.h @@ -35,9 +35,9 @@ class Window_ParamStatus : public Window_Base { * @param iy window y position. * @param iwidth window width. * @param iheight window height. - * @param actor_id actor whose stats are displayed. + * @param actor actor whose stats are displayed. */ - Window_ParamStatus(int ix, int iy, int iwidth, int iheight, int actor_id); + Window_ParamStatus(int ix, int iy, int iwidth, int iheight, const Game_Actor& actor); /** * Refreshes screen. @@ -45,7 +45,7 @@ class Window_ParamStatus : public Window_Base { void Refresh(); private: - int actor_id = 0; + const Game_Actor& actor; }; #endif diff --git a/src/window_skill.cpp b/src/window_skill.cpp index 625e1cca11c..b237f9c7e0b 100644 --- a/src/window_skill.cpp +++ b/src/window_skill.cpp @@ -30,12 +30,12 @@ #include "game_battle.h" Window_Skill::Window_Skill(int ix, int iy, int iwidth, int iheight) : - Window_Selectable(ix, iy, iwidth, iheight), actor_id(-1), subset(0) { + Window_Selectable(ix, iy, iwidth, iheight), subset(0) { column_max = 2; } -void Window_Skill::SetActor(int actor_id) { - this->actor_id = actor_id; +void Window_Skill::SetActor(const Game_Actor& actor) { + this->actor = &actor; Refresh(); } @@ -50,7 +50,7 @@ const lcf::rpg::Skill* Window_Skill::GetSkill() const { void Window_Skill::Refresh() { data.clear(); - const std::vector& skills = Main_Data::game_actors->GetActor(actor_id)->GetSkills(); + const std::vector& skills = actor->GetSkills(); for (size_t i = 0; i < skills.size(); ++i) { if (CheckInclude(skills[i])) data.push_back(skills[i]); @@ -78,7 +78,6 @@ void Window_Skill::DrawItem(int index) { int skill_id = data[index]; if (skill_id > 0) { - const Game_Actor* actor = Main_Data::game_actors->GetActor(actor_id); int costs = actor->CalculateSkillCost(skill_id); bool enabled = CheckEnable(skill_id); @@ -119,8 +118,6 @@ bool Window_Skill::CheckInclude(int skill_id) { } bool Window_Skill::CheckEnable(int skill_id) { - const Game_Actor* actor = Main_Data::game_actors->GetActor(actor_id); - return actor->IsSkillLearned(skill_id) && actor->IsSkillUsable(skill_id); } diff --git a/src/window_skill.h b/src/window_skill.h index f79938dc5d7..12ac75d2ea0 100644 --- a/src/window_skill.h +++ b/src/window_skill.h @@ -36,9 +36,9 @@ class Window_Skill : public Window_Selectable { /** * Sets the actor whose skills are displayed. * - * @param actor_id ID of the actor. + * @param actor actor. */ - void SetActor(int actor_id); + void SetActor(const Game_Actor& actor); /** * Gets skill. @@ -88,7 +88,7 @@ class Window_Skill : public Window_Selectable { protected: std::vector data; - int actor_id; + const Game_Actor* actor; int subset; }; diff --git a/src/window_skillstatus.cpp b/src/window_skillstatus.cpp index d0629ee192d..d8b9984f7c8 100644 --- a/src/window_skillstatus.cpp +++ b/src/window_skillstatus.cpp @@ -24,13 +24,13 @@ #include "player.h" Window_SkillStatus::Window_SkillStatus(int ix, int iy, int iwidth, int iheight) : - Window_Base(ix, iy, iwidth, iheight), actor_id(-1) { + Window_Base(ix, iy, iwidth, iheight) { SetContents(Bitmap::Create(width - 16, height - 16)); } -void Window_SkillStatus::SetActor(int actor_id) { - this->actor_id = actor_id; +void Window_SkillStatus::SetActor(const Game_Actor& actor) { + this->actor = &actor; Refresh(); } @@ -38,19 +38,17 @@ void Window_SkillStatus::Refresh() { contents->ClearRect(Rect(0, 0, contents->GetWidth(), 16)); // Actors are guaranteed to be valid - const Game_Actor& actor = *Main_Data::game_actors->GetActor(actor_id); - int x = 0; int y = 2; - DrawActorName(actor, x, y); + DrawActorName(*actor, x, y); x += 80; - DrawActorLevel(actor, x, y); + DrawActorLevel(*actor, x, y); x += 44; - DrawActorState(actor, x, y); - int hpdigits = (actor.MaxHpValue() >= 1000) ? 4 : 3; - int spdigits = (actor.MaxSpValue() >= 1000) ? 4 : 3; + DrawActorState(*actor, x, y); + int hpdigits = (actor->MaxHpValue() >= 1000) ? 4 : 3; + int spdigits = (actor->MaxSpValue() >= 1000) ? 4 : 3; x += (96 - hpdigits * 6 - spdigits * 6); - DrawActorHp(actor, x, y, hpdigits); + DrawActorHp(*actor, x, y, hpdigits); x += (66 + hpdigits * 6 - spdigits * 6); - DrawActorSp(actor, x, y, spdigits); + DrawActorSp(*actor, x, y, spdigits); } diff --git a/src/window_skillstatus.h b/src/window_skillstatus.h index 313ade82340..193e10b9862 100644 --- a/src/window_skillstatus.h +++ b/src/window_skillstatus.h @@ -34,9 +34,9 @@ class Window_SkillStatus : public Window_Base { /** * Sets the actor whose stats are displayed. - * @param actor_id ID of the actor. + * @param actor actor. */ - void SetActor(int actor_id); + void SetActor(const Game_Actor& actor); /** * Renders the stats of the actor. @@ -44,7 +44,7 @@ class Window_SkillStatus : public Window_Base { void Refresh(); private: - int actor_id; + const Game_Actor* actor = nullptr; }; #endif