mirror of https://github.com/zeldaret/botw.git
153 lines
4.6 KiB
C++
153 lines
4.6 KiB
C++
#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 "KingSystem/ActorSystem/actBaseProcHandle.h"
|
|
#include "KingSystem/ActorSystem/actBaseProcLink.h"
|
|
#include "KingSystem/System/StringBoard.h"
|
|
#include "KingSystem/Utils/TrackerStub.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 doRequestCreateWeapon(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 doRequestCreateArmor(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;
|
|
ksys::util::TrackerStub mTrackerStub;
|
|
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
|