Skip to content

Commit 8380da8

Browse files
committed
PauseMenuDataMgr createPlayerEquipment
1 parent bfb94a3 commit 8380da8

File tree

7 files changed

+257
-13
lines changed

7 files changed

+257
-13
lines changed

data/data_symbols.csv

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
0x00000071024D8D58,_ZTVN4ksys3act2ai10ActionBaseE
2727
0x00000071025129E0,_ZTVN4ksys3act2ai6ActionE
2828
0x0000007102513268,_ZTVN4ksys3act2ai2AiE
29+
0x00000071025C5A20,_ZN5uking2ui25CreatePlayerEquipActorMgr9sInstanceE
2930
0x00000071025CDB60,_ZN4ksys3act10PlayerInfo9sInstanceE
3031
0x00000071025D0878,_ZN5uking10CookingMgr9sInstanceE
3132
0x00000071025D75B8,_ZN5uking2ui16PauseMenuDataMgr9sInstanceE

data/uking_functions.csv

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -39993,28 +39993,28 @@ Address,Quality,Size,Name
3999339993
0x0000007100665b20,U,000068,
3999439994
0x0000007100665b64,U,000488,
3999539995
0x0000007100665d4c,W,000100,_ZN4sead10GameConfig18SingletonDisposer_D1Ev
39996-
0x0000007100665db0,U,000108,
39996+
0x0000007100665db0,U,000108,CreatePlayerEquipActorMgr::deleteInstance
3999739997
0x0000007100665e1c,U,000136,CreatePlayerEquipActorMgr::createInstance
39998-
0x0000007100665ea4,U,000172,
39998+
0x0000007100665ea4,O,000172,_ZN5uking2ui15needsArmorHeadBERKN4sead14SafeStringBaseIcEES5_
3999939999
0x0000007100665f50,U,000088,
4000040000
0x0000007100665fa8,U,000088,
4000140001
0x0000007100666000,U,000556,CreatePlayerEquipActorMgr::ctor
40002-
0x000000710066622c,U,000152,
40002+
0x000000710066622c,U,000152,CreatePlayerEquipActorMgr::dtor
4000340003
0x00000071006662c4,U,000004,nullsub_2163
4000440004
0x00000071006662c8,U,000036,
4000540005
0x00000071006662ec,U,000296,
4000640006
0x0000007100666414,U,000412,CreatePlayerEquipActorMgr::postCalc
40007-
0x00000071006665b0,U,000172,CreatePlayerEquipActorMgr::__auto1
40008-
0x000000710066665c,U,000140,
40007+
0x00000071006665b0,U,000172,CreatePlayerEquipActorMgr::resetAllEquipmentLoading
40008+
0x000000710066665c,U,000140,CreatePlayerEquipActorMgr::resetEquipmentLoading
4000940009
0x00000071006666e8,U,000272,CreatePlayerEquipActorMgr::playerEquipmentActorsReady
40010-
0x00000071006667f8,U,000068,CreatePlayerEquipActorMgr::__auto2
40011-
0x000000710066683c,U,000444,
40010+
0x00000071006667f8,U,000068,CreatePlayerEquipActorMgr::isEquipmentProcReady
40011+
0x000000710066683c,U,000444,CreatePlayerEquipActorMgr::wakeEquipment
4001240012
0x00000071006669f8,U,000408,CreatePlayerEquipActorMgr::requestCreateWeapon
4001340013
0x0000007100666b90,U,000360,CreatePlayerEquipActorMgr::requestCreateWeaponCaller
4001440014
0x0000007100666cf8,U,000688,CreatePlayerEquipActorMgr::requestCreateArmor
4001540015
0x0000007100666fa8,U,000352,CreatePlayerEquipActorMgr::requestCreateArmorWrap
40016-
0x0000007100667108,U,000180,PauseMenuDataMgr::switchPlayerArmorToDefault
40017-
0x00000071006671bc,U,000192,CreatePlayerEquipActorMgr::x
40016+
0x0000007100667108,O,000180,_ZN5uking2ui25CreatePlayerEquipActorMgr25requestCreateDefaultArmorEiRKN4sead14SafeStringBaseIcEE
40017+
0x00000071006671bc,O,000192,_ZN5uking2ui25CreatePlayerEquipActorMgr23requestCreateArmorHeadBERKN4sead14SafeStringBaseIcEEiS6_
4001840018
0x000000710066727c,U,000004,j__ZdlPv_287
4001940019
0x0000007100667280,U,000324,
4002040020
0x00000071006673c4,U,000100,_ZN4sead17PrimitiveRenderer18SingletonDisposer_D1Ev
@@ -56396,7 +56396,7 @@ Address,Quality,Size,Name
5639656396
0x0000007100970d84,O,000512,_ZN5uking2ui16PauseMenuDataMgr11removeArrowERKN4sead14SafeStringBaseIcEEi
5639756397
0x0000007100970f84,M,001204,_ZNK5uking2ui16PauseMenuDataMgr12getItemCountERKN4sead14SafeStringBaseIcEEb
5639856398
0x0000007100971438,O,000204,_ZN5uking2ui16PauseMenuDataMgr26setEquippedWeaponItemValueEiNS0_13PouchItemTypeE
56399-
0x0000007100971504,U,000716,PauseMenuDataMgr::fromSaveDataMaybe
56399+
0x0000007100971504,O,000716,_ZN5uking2ui16PauseMenuDataMgr21createPlayerEquipmentEv
5640056400
0x00000071009717d0,O,000040,_ZNK5uking2ui16PauseMenuDataMgr19getDefaultEquipmentENS0_13EquipmentSlotE
5640156401
0x00000071009717f8,O,000404,_ZNK5uking2ui16PauseMenuDataMgr7hasItemERKN4sead14SafeStringBaseIcEE
5640256402
0x000000710097198c,O,000372,_ZNK5uking2ui16PauseMenuDataMgr14getMasterSwordEv
@@ -61787,9 +61787,9 @@ Address,Quality,Size,Name
6178761787
0x0000007100aa814c,U,000008,setColorChangeMaterialIndex
6178861788
0x0000007100aa8154,U,000012,
6178961789
0x0000007100aa8160,U,000008,
61790-
0x0000007100aa8168,U,000048,
61791-
0x0000007100aa8198,U,000040,
61792-
0x0000007100aa81c0,U,000212,
61790+
0x0000007100aa8168,O,000048,_ZN5uking2ui22getCreateEquipmentSlotENS0_13PouchItemTypeE
61791+
0x0000007100aa8198,O,000040,_ZN5uking2ui16getEquipmentSlotENS0_19CreateEquipmentSlotE
61792+
0x0000007100aa81c0,O,000212,_ZN5uking2ui23createEquipmentFromItemEPKNS0_9PouchItemERKN4sead14SafeStringBaseIcEE
6179361793
0x0000007100aa8294,U,000028,
6179461794
0x0000007100aa82b0,U,000132,trashPouchItem
6179561795
0x0000007100aa8334,U,000028,

src/Game/UI/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
target_sources(uking PRIVATE
2+
uiCreatePlayerEquipActorMgr.cpp
3+
uiCreatePlayerEquipActorMgr.h
24
uiFadeProgress.cpp
35
uiFadeProgress.h
46
uiPauseMenuDataMgr.cpp
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
#include "Game/UI/uiCreatePlayerEquipActorMgr.h"
2+
#include <prim/seadStringBuilder.h>
3+
#include "Game/Actor/actWeapon.h"
4+
#include "Game/UI/uiPauseMenuDataMgr.h"
5+
#include "KingSystem/ActorSystem/actInfoCommon.h"
6+
#include "KingSystem/ActorSystem/actInfoData.h"
7+
8+
namespace uking::ui {
9+
10+
SEAD_SINGLETON_DISPOSER_IMPL(CreatePlayerEquipActorMgr)
11+
12+
void CreatePlayerEquipActorMgr::requestCreateDefaultArmor(s32 slot,
13+
const sead::SafeString& caller) {
14+
switch (slot) {
15+
case (int)CreateEquipmentSlot::ArmorHead:
16+
doRequestCreateArmor(3, "Armor_Default_Head", -1, caller);
17+
break;
18+
case (int)CreateEquipmentSlot::ArmorUpper:
19+
doRequestCreateArmor(4, "Armor_Default_Upper", -1, caller);
20+
break;
21+
case (int)CreateEquipmentSlot::ArmorLower:
22+
doRequestCreateArmor(5, "Armor_Default_Lower", -1, caller);
23+
break;
24+
default:
25+
break;
26+
}
27+
}
28+
29+
void CreatePlayerEquipActorMgr::requestCreateArmorHeadB(const sead::SafeString& name, int dye_color,
30+
const sead::SafeString& caller) {
31+
sead::FixedStringBuilder<0x40> s;
32+
s.copy(name.cstr());
33+
s.append("_B", -1);
34+
doRequestCreateArmor((int)CreateEquipmentSlot::ArmorHead, s, dye_color, caller);
35+
}
36+
37+
bool needsArmorHeadB(const sead::SafeString& armor_head_name,
38+
const sead::SafeString& armor_upper_name) {
39+
if (armor_upper_name.isEmpty()) {
40+
return false;
41+
}
42+
if (!ksys::act::InfoData::instance() ||
43+
ksys::act::getArmorHeadMantleType(ksys::act::InfoData::instance(),
44+
armor_head_name.cstr()) != 2) {
45+
return false;
46+
}
47+
if (!ksys::act::InfoData::instance() ||
48+
ksys::act::getArmorUpperUseMantleType(ksys::act::InfoData::instance(),
49+
armor_upper_name.cstr()) == 0) {
50+
return false;
51+
}
52+
return true;
53+
}
54+
55+
CreateEquipmentSlot getCreateEquipmentSlot(PouchItemType type) {
56+
switch (type) {
57+
case PouchItemType::Sword:
58+
return CreateEquipmentSlot::WeaponSword;
59+
case PouchItemType::Bow:
60+
return CreateEquipmentSlot::WeaponBow;
61+
case PouchItemType::Shield:
62+
return CreateEquipmentSlot::WeaponShield;
63+
case PouchItemType::ArmorHead:
64+
return CreateEquipmentSlot::ArmorHead;
65+
case PouchItemType::ArmorUpper:
66+
return CreateEquipmentSlot::ArmorUpper;
67+
case PouchItemType::ArmorLower:
68+
return CreateEquipmentSlot::ArmorLower;
69+
default:
70+
return CreateEquipmentSlot::Length;
71+
}
72+
}
73+
74+
EquipmentSlot getEquipmentSlot(CreateEquipmentSlot slot) {
75+
switch (slot) {
76+
case CreateEquipmentSlot::WeaponSword:
77+
return EquipmentSlot::WeaponRight;
78+
case CreateEquipmentSlot::WeaponShield:
79+
return EquipmentSlot::WeaponLeft;
80+
case CreateEquipmentSlot::WeaponBow:
81+
return EquipmentSlot::WeaponBow;
82+
case CreateEquipmentSlot::ArmorHead:
83+
return EquipmentSlot::ArmorHead;
84+
case CreateEquipmentSlot::ArmorUpper:
85+
return EquipmentSlot::ArmorUpper;
86+
case CreateEquipmentSlot::ArmorLower:
87+
return EquipmentSlot::ArmorLower;
88+
default:
89+
return EquipmentSlot::Invalid;
90+
}
91+
}
92+
93+
bool createEquipmentFromItem(const PouchItem* item, const sead::SafeString& caller) {
94+
if (!item) {
95+
return false;
96+
}
97+
98+
auto* mgr = CreatePlayerEquipActorMgr::instance();
99+
if (!mgr) {
100+
return false;
101+
}
102+
103+
PouchItemType type = item->getType();
104+
auto slot = getCreateEquipmentSlot(type);
105+
int slot_idx = (int)slot;
106+
107+
if (slot <= CreateEquipmentSlot::WeaponBow) {
108+
act::WeaponModifierInfo modifier(*item);
109+
mgr->doRequestCreateWeapon(slot_idx, item->getName(), item->getValue(), &modifier, caller);
110+
return true;
111+
}
112+
113+
if (slot <= CreateEquipmentSlot::ArmorLower) {
114+
mgr->doRequestCreateArmor(slot_idx, item->getName(), item->getValue(), caller);
115+
return true;
116+
}
117+
118+
return false;
119+
}
120+
121+
} // namespace uking::ui
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
#pragma once
2+
3+
#include <heap/seadDisposer.h>
4+
#include <prim/seadSafeString.h>
5+
6+
namespace uking::act {
7+
struct WeaponModifierInfo;
8+
} // namespace uking::act
9+
10+
namespace uking::ui {
11+
12+
class PouchItem;
13+
enum class PouchItemType;
14+
enum class EquipmentSlot;
15+
16+
enum class CreateEquipmentSlot : u8 {
17+
WeaponSword = 0,
18+
WeaponShield = 1,
19+
WeaponBow = 2,
20+
ArmorHead = 3,
21+
ArmorUpper = 4,
22+
ArmorLower = 5,
23+
Length = 6,
24+
};
25+
26+
class CreatePlayerEquipActorMgr {
27+
SEAD_SINGLETON_DISPOSER(CreatePlayerEquipActorMgr)
28+
CreatePlayerEquipActorMgr();
29+
virtual ~CreatePlayerEquipActorMgr();
30+
31+
public:
32+
// TODO 0x71006669F8
33+
void doRequestCreateWeapon(int slot_idx, const sead::SafeString& name, int value,
34+
const act::WeaponModifierInfo* modifier,
35+
const sead::SafeString& caller);
36+
37+
// TODO 0x7100666CF8
38+
void doRequestCreateArmor(int slot_idx, const sead::SafeString& name, int dye_color,
39+
const sead::SafeString& caller);
40+
41+
void requestCreateDefaultArmor(s32 slot_idx, const sead::SafeString& caller);
42+
void requestCreateArmorHeadB(const sead::SafeString& name, int dye_color,
43+
const sead::SafeString& caller);
44+
};
45+
46+
bool needsArmorHeadB(const sead::SafeString& armor_head_name,
47+
const sead::SafeString& armor_upper_name);
48+
CreateEquipmentSlot getCreateEquipmentSlot(PouchItemType type);
49+
EquipmentSlot getEquipmentSlot(CreateEquipmentSlot slot);
50+
bool createEquipmentFromItem(const PouchItem* item, const sead::SafeString& caller);
51+
52+
} // namespace uking::ui

src/Game/UI/uiPauseMenuDataMgr.cpp

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include "Game/Actor/actWeapon.h"
88
#include "Game/Cooking/cookManager.h"
99
#include "Game/DLC/aocManager.h"
10+
#include "Game/UI/uiCreatePlayerEquipActorMgr.h"
1011
#include "Game/UI/uiUtils.h"
1112
#include "Game/gameItemUtils.h"
1213
#include "Game/gameScene.h"
@@ -1262,6 +1263,70 @@ int PauseMenuDataMgr::getItemCount(const sead::SafeString& name, bool count_equi
12621263
return count;
12631264
}
12641265

1266+
void PauseMenuDataMgr::createPlayerEquipment() {
1267+
constexpr const char* Caller = "PauseMenuDataMgr_FromSaveData";
1268+
auto lock = sead::makeScopedLock(mCritSection);
1269+
1270+
auto* create_mgr = CreatePlayerEquipActorMgr::instance();
1271+
if (!create_mgr) {
1272+
return;
1273+
}
1274+
1275+
std::array<PouchItem*, (u64)CreateEquipmentSlot::Length> equipment_items{};
1276+
1277+
auto& items = getItems();
1278+
PouchItem* first_item = items.isEmpty() ? nullptr : items.nth(0);
1279+
1280+
bool need_head_b = false;
1281+
if (first_item) {
1282+
for (PouchItem* item = first_item; item; item = items.next(item)) {
1283+
auto type = item->getType();
1284+
if (type > PouchItemType::Material) {
1285+
break;
1286+
}
1287+
if (item->isInInventory() && item->isEquipped()) {
1288+
u64 slot = (u64)getCreateEquipmentSlot(type);
1289+
if (slot < equipment_items.size()) {
1290+
equipment_items[slot] = item;
1291+
}
1292+
}
1293+
}
1294+
const auto* head = equipment_items[(u64)CreateEquipmentSlot::ArmorHead];
1295+
if (head && equipment_items[(u64)CreateEquipmentSlot::ArmorUpper]) {
1296+
need_head_b = needsArmorHeadB(
1297+
head->getName(), equipment_items[(u64)CreateEquipmentSlot::ArmorUpper]->getName());
1298+
}
1299+
}
1300+
1301+
auto* player = ksys::act::PlayerInfo::instance()->getPlayer();
1302+
1303+
s32 slot = 0; // <- this is required to match
1304+
for (u64 i = 0; i != equipment_items.size(); slot = s32(++i)) {
1305+
if (equipment_items[i]) {
1306+
if (!need_head_b || i != (u64)CreateEquipmentSlot::ArmorHead) {
1307+
createEquipmentFromItem(equipment_items[i], Caller);
1308+
} else {
1309+
create_mgr->requestCreateArmorHeadB(equipment_items[i]->getName(),
1310+
equipment_items[i]->getValue(), Caller);
1311+
}
1312+
continue;
1313+
}
1314+
if (i > (u64)CreateEquipmentSlot::WeaponBow) {
1315+
create_mgr->requestCreateDefaultArmor(slot, Caller);
1316+
continue;
1317+
}
1318+
1319+
if (player) {
1320+
player->switchEquipment(getDefaultEquipment(getEquipmentSlot((CreateEquipmentSlot)i)),
1321+
30);
1322+
}
1323+
1324+
#ifdef MATCHING_HACK_NX_CLANG
1325+
asm(""); // force no unroll
1326+
#endif
1327+
}
1328+
}
1329+
12651330
void PauseMenuDataMgr::setEquippedWeaponItemValue(s32 value, PouchItemType type) {
12661331
if (isPouchItemNotWeapon(type))
12671332
return;

src/Game/UI/uiPauseMenuDataMgr.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ struct CookItem;
3434

3535
namespace uking::ui {
3636

37+
enum class CreateEquipmentSlot : u8;
38+
3739
constexpr int NumSwordsMax = 20;
3840
constexpr int NumBowsMax = 14;
3941
constexpr int NumArrowItemsMax = 6;
@@ -118,6 +120,7 @@ enum class EquipmentSlot {
118120
ArmorHead = 4,
119121
ArmorUpper = 5,
120122
ArmorLower = 6,
123+
Invalid = -1,
121124
};
122125

123126
enum class ItemUse {

0 commit comments

Comments
 (0)