summaryrefslogtreecommitdiff
path: root/src/Game/Actor
diff options
context:
space:
mode:
authorMichael Zhao <44533763+Pistonight@users.noreply.github.com>2025-05-02 20:50:36 -0700
committerGitHub <noreply@github.com>2025-05-02 20:50:36 -0700
commitfd7acefdd8ec65a07c84dbf511de58626403d10d (patch)
tree66cb9d94a92c4cca0830460d457b28be98344a1d /src/Game/Actor
parent5bb38fb36b86fa878d8b26cfa08f6d6172e280f5 (diff)
parentcd19e8cd9618a610766f703dfb2436fc94760912 (diff)
Merge pull request #137 from Pistonight/pmdm_equipment_stuff
PauseMenuDataMgr createPlayerEquipment
Diffstat (limited to 'src/Game/Actor')
-rw-r--r--src/Game/Actor/CMakeLists.txt2
-rw-r--r--src/Game/Actor/actCreatePlayerEquipActorMgr.cpp121
-rw-r--r--src/Game/Actor/actCreatePlayerEquipActorMgr.h51
3 files changed, 174 insertions, 0 deletions
diff --git a/src/Game/Actor/CMakeLists.txt b/src/Game/Actor/CMakeLists.txt
index a1f3d648..34fec1a6 100644
--- a/src/Game/Actor/CMakeLists.txt
+++ b/src/Game/Actor/CMakeLists.txt
@@ -1,4 +1,6 @@
target_sources(uking PRIVATE
+ actCreatePlayerEquipActorMgr.cpp
+ actCreatePlayerEquipActorMgr.h
actDragon.cpp
actDragon.h
actWeapon.cpp
diff --git a/src/Game/Actor/actCreatePlayerEquipActorMgr.cpp b/src/Game/Actor/actCreatePlayerEquipActorMgr.cpp
new file mode 100644
index 00000000..b9cccf34
--- /dev/null
+++ b/src/Game/Actor/actCreatePlayerEquipActorMgr.cpp
@@ -0,0 +1,121 @@
+#include "Game/Actor/actCreatePlayerEquipActorMgr.h"
+#include <prim/seadStringBuilder.h>
+#include "Game/Actor/actWeapon.h"
+#include "Game/UI/uiPauseMenuDataMgr.h"
+#include "KingSystem/ActorSystem/actInfoCommon.h"
+#include "KingSystem/ActorSystem/actInfoData.h"
+
+namespace uking::act {
+
+SEAD_SINGLETON_DISPOSER_IMPL(CreatePlayerEquipActorMgr)
+
+void CreatePlayerEquipActorMgr::requestCreateDefaultArmor(s32 slot,
+ const sead::SafeString& caller) {
+ switch (slot) {
+ case (int)CreateEquipmentSlot::ArmorHead:
+ doRequestCreateArmor(3, "Armor_Default_Head", -1, caller);
+ break;
+ case (int)CreateEquipmentSlot::ArmorUpper:
+ doRequestCreateArmor(4, "Armor_Default_Upper", -1, caller);
+ break;
+ case (int)CreateEquipmentSlot::ArmorLower:
+ doRequestCreateArmor(5, "Armor_Default_Lower", -1, caller);
+ break;
+ default:
+ break;
+ }
+}
+
+void CreatePlayerEquipActorMgr::requestCreateArmorHeadB(const sead::SafeString& name, int dye_color,
+ const sead::SafeString& caller) {
+ sead::FixedStringBuilder<0x40> s;
+ s.copy(name.cstr());
+ s.append("_B", -1);
+ doRequestCreateArmor((int)CreateEquipmentSlot::ArmorHead, s, dye_color, caller);
+}
+
+bool needsArmorHeadB(const sead::SafeString& armor_head_name,
+ const sead::SafeString& armor_upper_name) {
+ if (armor_upper_name.isEmpty()) {
+ return false;
+ }
+ if (!ksys::act::InfoData::instance() ||
+ ksys::act::getArmorHeadMantleType(ksys::act::InfoData::instance(),
+ armor_head_name.cstr()) != 2) {
+ return false;
+ }
+ if (!ksys::act::InfoData::instance() ||
+ ksys::act::getArmorUpperUseMantleType(ksys::act::InfoData::instance(),
+ armor_upper_name.cstr()) == 0) {
+ return false;
+ }
+ return true;
+}
+
+CreateEquipmentSlot getCreateEquipmentSlot(ui::PouchItemType type) {
+ switch (type) {
+ case ui::PouchItemType::Sword:
+ return CreateEquipmentSlot::WeaponSword;
+ case ui::PouchItemType::Bow:
+ return CreateEquipmentSlot::WeaponBow;
+ case ui::PouchItemType::Shield:
+ return CreateEquipmentSlot::WeaponShield;
+ case ui::PouchItemType::ArmorHead:
+ return CreateEquipmentSlot::ArmorHead;
+ case ui::PouchItemType::ArmorUpper:
+ return CreateEquipmentSlot::ArmorUpper;
+ case ui::PouchItemType::ArmorLower:
+ return CreateEquipmentSlot::ArmorLower;
+ default:
+ return CreateEquipmentSlot::Length;
+ }
+}
+
+ui::EquipmentSlot getEquipmentSlot(CreateEquipmentSlot slot) {
+ switch (slot) {
+ case CreateEquipmentSlot::WeaponSword:
+ return ui::EquipmentSlot::WeaponRight;
+ case CreateEquipmentSlot::WeaponShield:
+ return ui::EquipmentSlot::WeaponLeft;
+ case CreateEquipmentSlot::WeaponBow:
+ return ui::EquipmentSlot::WeaponBow;
+ case CreateEquipmentSlot::ArmorHead:
+ return ui::EquipmentSlot::ArmorHead;
+ case CreateEquipmentSlot::ArmorUpper:
+ return ui::EquipmentSlot::ArmorUpper;
+ case CreateEquipmentSlot::ArmorLower:
+ return ui::EquipmentSlot::ArmorLower;
+ default:
+ return ui::EquipmentSlot::Invalid;
+ }
+}
+
+bool createEquipmentFromItem(const ui::PouchItem* item, const sead::SafeString& caller) {
+ if (!item) {
+ return false;
+ }
+
+ auto* mgr = CreatePlayerEquipActorMgr::instance();
+ if (!mgr) {
+ return false;
+ }
+
+ auto type = item->getType();
+ auto slot = getCreateEquipmentSlot(type);
+ int slot_idx = (int)slot;
+
+ if (slot <= CreateEquipmentSlot::WeaponBow) {
+ WeaponModifierInfo modifier(*item);
+ mgr->doRequestCreateWeapon(slot_idx, item->getName(), item->getValue(), &modifier, caller);
+ return true;
+ }
+
+ if (slot <= CreateEquipmentSlot::ArmorLower) {
+ mgr->doRequestCreateArmor(slot_idx, item->getName(), item->getValue(), caller);
+ return true;
+ }
+
+ return false;
+}
+
+} // namespace uking::act
diff --git a/src/Game/Actor/actCreatePlayerEquipActorMgr.h b/src/Game/Actor/actCreatePlayerEquipActorMgr.h
new file mode 100644
index 00000000..832de3cc
--- /dev/null
+++ b/src/Game/Actor/actCreatePlayerEquipActorMgr.h
@@ -0,0 +1,51 @@
+#pragma once
+
+#include <heap/seadDisposer.h>
+#include <prim/seadSafeString.h>
+namespace uking::ui {
+
+class PouchItem;
+enum class PouchItemType;
+enum class EquipmentSlot;
+
+} // namespace uking::ui
+
+namespace uking::act {
+struct WeaponModifierInfo;
+
+enum class CreateEquipmentSlot : u8 {
+ WeaponSword = 0,
+ WeaponShield = 1,
+ WeaponBow = 2,
+ ArmorHead = 3,
+ ArmorUpper = 4,
+ ArmorLower = 5,
+ Length = 6,
+};
+
+class CreatePlayerEquipActorMgr {
+ SEAD_SINGLETON_DISPOSER(CreatePlayerEquipActorMgr)
+ CreatePlayerEquipActorMgr();
+ virtual ~CreatePlayerEquipActorMgr();
+
+public:
+ // TODO 0x71006669F8
+ void doRequestCreateWeapon(int slot_idx, const sead::SafeString& name, int value,
+ const WeaponModifierInfo* modifier, const sead::SafeString& caller);
+
+ // TODO 0x7100666CF8
+ void doRequestCreateArmor(int slot_idx, const sead::SafeString& name, int dye_color,
+ const sead::SafeString& caller);
+
+ void requestCreateDefaultArmor(s32 slot_idx, const sead::SafeString& caller);
+ void requestCreateArmorHeadB(const sead::SafeString& name, int dye_color,
+ const sead::SafeString& caller);
+};
+
+bool needsArmorHeadB(const sead::SafeString& armor_head_name,
+ const sead::SafeString& armor_upper_name);
+CreateEquipmentSlot getCreateEquipmentSlot(ui::PouchItemType type);
+ui::EquipmentSlot getEquipmentSlot(CreateEquipmentSlot slot);
+bool createEquipmentFromItem(const ui::PouchItem* item, const sead::SafeString& caller);
+
+} // namespace uking::act