Skip to content

Commit

Permalink
Scene/Window refactor: Instead of actor_id most scenes accept now an …
Browse files Browse the repository at this point in the history
…instance of Game_Actor

Scenes that can handle multiple actors expect now an vector of actors.
Makes it more flexible.
  • Loading branch information
Ghabry committed May 10, 2024
1 parent 78dd60a commit 532bae9
Show file tree
Hide file tree
Showing 28 changed files with 177 additions and 197 deletions.
36 changes: 18 additions & 18 deletions src/game_interpreter_map.cpp
Expand Up @@ -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<Game_Actor*> actors;

switch (subscreen_id)
{
case 1: // Inventory
Expand All @@ -106,33 +108,31 @@ 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--;
}

if (is_db_actor && !Main_Data::game_actors->GetActor(actor_index)) {
Output::Warning("Invalid actor ID {}", actor_index);
return false;
actors = Main_Data::game_party->GetActors();
}

if (subscreen_id == 2) {
Scene::instance->SetRequestedScene(std::make_shared<Scene_Skill>(actor_index, 0, is_db_actor));
Scene::instance->SetRequestedScene(std::make_shared<Scene_Skill>(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<Scene_Equip>(*actor));
Scene::instance->SetRequestedScene(std::make_shared<Scene_Equip>(actors, actor_index));
}
else if (subscreen_id == 4) {
Scene::instance->SetRequestedScene(std::make_shared<Scene_Status>(actor_index, is_db_actor));
Scene::instance->SetRequestedScene(std::make_shared<Scene_Status>(actors, actor_index));
}
return true;
case 5: // Order
Expand Down Expand Up @@ -731,7 +731,7 @@ bool Game_Interpreter_Map::CommandOpenMainMenu(lcf::rpg::EventCommand const& com
int subscreen_id = -1, actor_index = 0;
bool is_db_actor = false;

if (com.parameters.size() > 0) {
if (/* Player::HasEasyRpgExtension() && */ com.parameters.size() > 0) {
subscreen_id = com.parameters[0];

if (com.parameters.size() > 1) {
Expand Down
36 changes: 20 additions & 16 deletions src/scene_equip.cpp
Expand Up @@ -27,10 +27,11 @@
#include "scene_menu.h"
#include <lcf/rpg/item.h>

Scene_Equip::Scene_Equip(Game_Actor& actor, int equip_index) :
actor(actor),
equip_index(equip_index) {
Scene_Equip::Scene_Equip(std::vector<Game_Actor*> 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() {
Expand All @@ -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);

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;
Expand All @@ -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<Scene_Equip>((*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<Scene_Equip>(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<Scene_Equip>((*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<Scene_Equip>(actors, actor_index, equip_window->GetIndex()), true);
}
}

Expand All @@ -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);
Expand Down
10 changes: 6 additions & 4 deletions src/scene_equip.h
Expand Up @@ -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<Game_Actor*> actors, int actor_index, int equip_index = 0);

void Start() override;
void vUpdate() override;
Expand Down Expand Up @@ -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<Game_Actor*> actors;
/** Index of the actor in the party whose equipment is displayed. */
int actor_index;
/** Selected equipment on startup. */
int equip_index;

Expand Down
6 changes: 3 additions & 3 deletions src/scene_menu.cpp
Expand Up @@ -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<Scene_Skill>(menustatus_window->GetIndex()));
Scene::Push(std::make_shared<Scene_Skill>(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<Scene_Equip>(*menustatus_window->GetActor()));
Scene::Push(std::make_shared<Scene_Equip>(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<Scene_Status>(menustatus_window->GetIndex()));
Scene::Push(std::make_shared<Scene_Status>(Main_Data::game_party->GetActors(), menustatus_window->GetIndex()));
break;
case Row:
{
Expand Down
36 changes: 12 additions & 24 deletions src/scene_skill.cpp
Expand Up @@ -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<Game_Actor*> 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() {
Expand All @@ -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());
}
Expand All @@ -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<Scene_ActorTarget>(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<Scene_Teleport>(*actor, *skill));
Scene::Push(std::make_shared<Scene_Teleport>(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());

Expand Down
9 changes: 5 additions & 4 deletions src/scene_skill.h
Expand Up @@ -19,6 +19,7 @@
#define EP_SCENE_SKILL_H

// Headers
#include <vector>
#include "scene.h"
#include "window_help.h"
#include "window_skill.h"
Expand All @@ -33,20 +34,20 @@ class Scene_Skill : public Scene {
/**
* Constructor.
*/
Scene_Skill(int actor_index, int skill_index = 0, bool is_db_actor = false);

Scene_Skill(std::vector<Game_Actor*> actors, int actor_index, int skill_index = 0);

void Start() override;
void Continue(SceneType prev_scene) override;
void vUpdate() override;
void TransitionOut(SceneType next_scene) override;

private:
/** Actor in the party whose skills are displayed. */
std::vector<Game_Actor*> 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<Window_Skill> skill_window;
/** Displays information about the actor. */
Expand Down
33 changes: 16 additions & 17 deletions src/scene_status.cpp
Expand Up @@ -23,11 +23,13 @@
#include "game_party.h"
#include "game_system.h"
#include "input.h"
#include <player.h>
#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<Game_Actor*> actors, int actor_index) :
actors(actors), actor_index(actor_index) {
type = Scene::Status;

assert(!actors.empty());
}

void Scene_Status::Start() {
Expand All @@ -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));
Expand All @@ -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<Scene_Status>(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<Scene_Status>(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<Scene_Status>(actor_index), true);
actor_index = actor_index - 1;
if (actor_index < 0) {
actor_index = actors.size() - 1;
}
Scene::Push(std::make_shared<Scene_Status>(actors, actor_index), true);
}
}
9 changes: 5 additions & 4 deletions src/scene_status.h
Expand Up @@ -19,6 +19,7 @@
#define EP_SCENE_STATUS_H

// Headers
#include <vector>
#include "scene.h"
#include "window_actorinfo.h"
#include "window_actorstatus.h"
Expand All @@ -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<Game_Actor*> actors, int actor_index);

void Start() override;
void vUpdate() override;

private:
std::vector<Game_Actor*> 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<Window_ActorInfo> actorinfo_window;
std::unique_ptr<Window_ActorStatus> actorstatus_window;
Expand Down

0 comments on commit 532bae9

Please sign in to comment.