diff options
| author | Michael Zhao <44533763+Pistonight@users.noreply.github.com> | 2025-05-02 20:50:36 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-05-02 20:50:36 -0700 |
| commit | fd7acefdd8ec65a07c84dbf511de58626403d10d (patch) | |
| tree | 66cb9d94a92c4cca0830460d457b28be98344a1d /src/Game/Actor | |
| parent | 5bb38fb36b86fa878d8b26cfa08f6d6172e280f5 (diff) | |
| parent | cd19e8cd9618a610766f703dfb2436fc94760912 (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.txt | 2 | ||||
| -rw-r--r-- | src/Game/Actor/actCreatePlayerEquipActorMgr.cpp | 121 | ||||
| -rw-r--r-- | src/Game/Actor/actCreatePlayerEquipActorMgr.h | 51 |
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 |
