Implement more parts of aocManager

This commit is contained in:
Léo Lam
2021-03-26 21:07:12 +01:00
parent 1bd2f03de8
commit aa766a1977
7 changed files with 117 additions and 14 deletions
+45
View File
@@ -1 +1,46 @@
#include "Game/DLC/aocManager.h"
#include <filedevice/seadFileDeviceMgr.h>
#include "KingSystem/Utils/SafeDelete.h"
#ifdef NNSDK
#include <nn/fs.h>
#endif
namespace uking::aoc {
SEAD_SINGLETON_DISPOSER_IMPL(Manager)
Manager::Manager() : mGdtReinitSlot{this, &Manager::onGdtReinit} {
resetFlags();
}
Manager::~Manager() {
if (auto* gdm = ksys::gdt::Manager::instance())
gdm->removeReinitCallback(mGdtReinitSlot);
mFileDevicePrefix.deregister();
mFileDevicePrefix2.deregister();
mVersionFileDevPrefix.deregister();
if (mFileDevice) {
sead::FileDeviceMgr::instance()->unmount("aoc");
ksys::util::safeDelete(mFileDevice);
}
#ifdef NNSDK
if (mAocFsCache) {
nn::fs::Unmount("aoc");
ksys::util::safeDelete(mAocFsCache);
}
#endif
}
void Manager::resetFlags() {
mFlagAocVerAtLastPlay = ksys::gdt::InvalidHandle;
mFlagLatestAocVerPlayed = ksys::gdt::InvalidHandle;
mFlagHasAocVer1 = ksys::gdt::InvalidHandle;
mFlagHasAocVer2 = ksys::gdt::InvalidHandle;
mFlagHasAocVer3 = ksys::gdt::InvalidHandle;
}
} // namespace uking::aoc
+51 -5
View File
@@ -1,9 +1,15 @@
#pragma once
#include <container/seadSafeArray.h>
#include <heap/seadDisposer.h>
#include <math/seadVector.h>
#include <prim/seadSafeString.h>
#include <prim/seadStorageFor.h>
#include <prim/seadTypedBitFlag.h>
#include "KingSystem/GameData/gdtManager.h"
#include "KingSystem/Resource/resHandle.h"
#include "KingSystem/Resource/resResourceMgrTask.h"
#include "KingSystem/Utils/Types.h"
namespace sead {
class FileDevice;
@@ -27,13 +33,53 @@ public:
bool hasAoc3() const { return mVersion >= 0x300; }
private:
sead::FileDevice* mFileDevice{};
ksys::res::FileDevicePrefix mFileDevicePrefix;
enum class Flag : u8 {
ksys::res::Handle mVersionResHandle;
sead::FixedSafeString<16> mVersionString;
};
struct DLCPosition {
sead::Vector3f translate = sead::Vector3f::zero;
sead::Vector3f rotate = sead::Vector3f::zero;
sead::Vector3f translate2 = sead::Vector3f::zero;
float scale = 0.0;
ksys::gdt::FlagHandle flag_handle = ksys::gdt::InvalidHandle;
};
KSYS_CHECK_SIZE_NX150(DLCPosition, 0x2c);
struct VersionFile {
ksys::res::Handle file_handle;
sead::FixedSafeString<16> string;
};
KSYS_CHECK_SIZE_NX150(VersionFile, 0x78);
void resetFlags();
void onGdtReinit(ksys::gdt::Manager::ReinitEvent* event);
sead::FileDevice* mFileDevice{};
ksys::res::FileDevicePrefix mVersionFileDevPrefix;
sead::StorageFor<VersionFile, true> mVersionFile{sead::ZeroInitializeTag{}};
u32 mVersion{};
// TODO: more fields
ksys::res::Handle mAocMapMainFieldPack;
ksys::res::FileDevicePrefix mFileDevicePrefix;
ksys::res::Handle* mAocArchive{};
ksys::res::FileDevicePrefix mFileDevicePrefix2;
sead::SafeArray<DLCPosition, 20> mDLCPositions;
ksys::gdt::FlagHandle mFlagAocVerAtLastPlay{};
ksys::gdt::FlagHandle mFlagLatestAocVerPlayed{};
ksys::gdt::FlagHandle mFlagHasAocVer1{};
ksys::gdt::FlagHandle mFlagHasAocVer2{};
ksys::gdt::FlagHandle mFlagHasAocVer3{};
ksys::gdt::Manager::ReinitSignal::Slot mGdtReinitSlot;
sead::TypedBitFlag<Flag> mFlags{};
#ifdef NNSDK
u8* mAocFsCache{};
#endif
};
KSYS_CHECK_SIZE_NX150(Manager, 0x598);
} // namespace uking::aoc
+4
View File
@@ -137,6 +137,10 @@ void Manager::addReinitCallback(sead::DelegateEvent<ReinitEvent*>::Slot&) {
// Stubbed in release builds.
}
void Manager::removeReinitCallback(sead::DelegateEvent<Manager::ReinitEvent*>::Slot& slot) {
// Stubbed in release builds.
}
void Manager::IncreaseLogger::addRecord(s32 value, const sead::SafeString& name, s32 sub_idx,
bool debug) {
const u32 name_hash = sead::HashCRC32::calcStringHash(name);
+1
View File
@@ -478,6 +478,7 @@ public:
void init(sead::Heap* heap, sead::Framework* framework);
void addReinitCallback(ReinitSignal::Slot& slot);
void removeReinitCallback(ReinitSignal::Slot& slot);
private:
enum class BitFlag {
@@ -66,6 +66,8 @@ public:
bool getField28() const { return _28; }
void setField28(bool value) { _28 = value; }
void deregister();
static constexpr size_t getListNodeOffset() { return offsetof(FileDevicePrefix, mListNode); }
private:
@@ -404,4 +406,9 @@ KSYS_CHECK_SIZE_NX150(sead::TaskBase, 0xd0);
KSYS_CHECK_SIZE_NX150(sead::MethodTreeNode, 0x98);
KSYS_CHECK_SIZE_NX150(ResourceMgrTask, 0x9c0eb8);
inline void FileDevicePrefix::deregister() {
if (mListNode.isLinked())
ResourceMgrTask::instance()->deregisterFileDevicePrefix(*this);
}
} // namespace ksys::res