1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
|
#pragma once
#include <container/seadSafeArray.h>
#include <gfx/seadColor.h>
#include <heap/seadDisposer.h>
#include <math/seadMatrix.h>
#include <prim/seadBitFlag.h>
#include <prim/seadSafeString.h>
#include <prim/seadStringBuilder.h>
#include "Game/Actor/actPlayerCreateTrace.h"
#include "KingSystem/ActorSystem/actBaseProcHandle.h"
#include "KingSystem/ActorSystem/actBaseProcLink.h"
#include "KingSystem/System/StringBoard.h"
#include "KingSystem/Utils/Types.h"
namespace ksys::act {
class InstParamPack;
class Actor;
} // namespace ksys::act
namespace uking::ui {
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,
};
inline bool isArmorCreateEquipmentSlot(s32 slot) {
return slot == (s32)CreateEquipmentSlot::ArmorHead ||
slot == (s32)CreateEquipmentSlot::ArmorUpper ||
slot == (s32)CreateEquipmentSlot::ArmorLower;
}
// Used in both CreatePlayerEquipActorMgr and CreatePlayerTrashActorMgr,
// but stubbed out other than constructor and init
class PlayerCreateDebugStub {
public:
void init();
private:
s32 _0 = 3;
sead::SafeString mDebugStatus;
f32 _18 = 1;
u32 _1c = 0;
sead::Color4f mColor20 = sead::Color4f::cBlack;
sead::Color4f mColor30 = sead::Color4f::cBlack;
sead::Vector2f _40{0, 0};
sead::Vector2f _48{1, 1};
sead::Color4f mColor50 = sead::Color4f::cBlue;
u64 _60 = 0;
u64 _68 = 0;
u64 _70 = 0;
sead::Vector3f _78{0, 0, 0};
sead::Color4f mColor84 = sead::Color4f::cBlack;
};
KSYS_CHECK_SIZE_NX150(PlayerCreateDebugStub, 0x98);
class CreatePlayerEquipActorMgr {
SEAD_SINGLETON_DISPOSER(CreatePlayerEquipActorMgr)
CreatePlayerEquipActorMgr();
virtual ~CreatePlayerEquipActorMgr();
public:
void init();
void postCalc();
void resetAll();
void reset(s32 slot_idx);
bool areAllWeaponActorsReady() const;
bool isEquipmentProcReady(s32 slot_idx) const;
ksys::act::Actor* tryGetEquipmentActor(s32 slot_idx);
void requestCreateWeapon(s32 slot_idx, const sead::SafeString& name, int value,
const WeaponModifierInfo* modifier, const sead::SafeString& caller);
void requestCreateWeapon(const sead::SafeString& name, int value,
const WeaponModifierInfo* modifier, const sead::SafeString& caller);
void requestCreateArmor(s32 slot_idx, const sead::SafeString& name, int dye_color,
const sead::SafeString& caller);
void requestCreateArmor(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);
private:
enum class EntryStatus : s32 { Idle = 0, Loading = 1, Ready = 2 };
template <typename T>
class Slots {
private:
sead::SafeArray<T, (s32)CreateEquipmentSlot::Length> mArray;
public:
T& operator[](s32 idx) { return mArray[idx]; }
const T& operator[](s32 idx) const { return mArray[idx]; }
s32 size() const { return mArray.size(); }
};
class Entry {
friend class CreatePlayerEquipActorMgr;
sead::FixedStringBuilder<64> mActorName;
EntryStatus mStatus = EntryStatus::Idle;
ksys::act::BaseProcLink mProcLink;
void reset() {
mActorName.clear();
mStatus = EntryStatus::Idle;
mProcLink.reset();
}
};
KSYS_CHECK_SIZE_NX150(Entry, 0x68);
// inlined helpers
bool isSlotLoading(s32 slot_idx) const;
void deleteLoadingProc(s32 slot_idx);
void onSlotLoadingRequested(s32 slot_idx, const sead::SafeString& name);
Slots<ksys::act::BaseProcHandle> mProcHandles{};
sead::BitFlag8 mIsLoading;
PlayerCreateTracer mTracer;
Slots<Entry> mEntries{};
// stubbed in release builds
ksys::StringBoard mStringBoard;
u64 _310 = 0;
PlayerCreateDebugStub mDebugStub;
};
KSYS_CHECK_SIZE_NX150(CreatePlayerEquipActorMgr, 0x3B0);
// TODO
class CreatePlayerTrachActorMgr {};
bool needsArmorHeadB(const sead::SafeString& armor_head_name,
const sead::SafeString& armor_upper_name);
bool isArmorHeadMantleType2(const sead::SafeString& armor_head_name);
bool isArmorUpperNotUseMantleType0(const sead::SafeString& armor_upper_name);
} // namespace uking::act
|