mirror of
https://github.com/zeldaret/botw
synced 2026-08-13 20:15:08 -04:00
Implement more parts of aocManager
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user