mirror of https://github.com/zeldaret/botw.git
ksys/gdt: Start adding GameDataMgr
This commit is contained in:
parent
213d9fb00d
commit
e70c1c37cd
|
@ -74235,20 +74235,20 @@
|
||||||
0x0000007100dce7e8,sub_7100DCE7E8,48,
|
0x0000007100dce7e8,sub_7100DCE7E8,48,
|
||||||
0x0000007100dce818,sub_7100DCE818,92,
|
0x0000007100dce818,sub_7100DCE818,92,
|
||||||
0x0000007100dce874,sub_7100DCE874,32,
|
0x0000007100dce874,sub_7100DCE874,32,
|
||||||
0x0000007100dce894,sub_7100DCE894,100,
|
0x0000007100dce894,sub_7100DCE894,100,_ZN4ksys3gdt7Manager18SingletonDisposer_D2Ev
|
||||||
0x0000007100dce8f8,sub_7100DCE8F8,108,
|
0x0000007100dce8f8,sub_7100DCE8F8,108,_ZN4ksys3gdt7Manager18SingletonDisposer_D0Ev
|
||||||
0x0000007100dce964,GameDataMgr::createInstance,136,
|
0x0000007100dce964,GameDataMgr::createInstance,136,_ZN4ksys3gdt7Manager14createInstanceEPN4sead4HeapE
|
||||||
0x0000007100dce9ec,GameDataMgr::ctor,572,
|
0x0000007100dce9ec,GameDataMgr::ctor,572,_ZN4ksys3gdt7ManagerC1Ev?
|
||||||
0x0000007100dcec28,gdm::ResArray::ctor,276,
|
0x0000007100dcec28,gdm::ResArray::ctor,276,_ZN4sead9SafeArrayIN4ksys3res6HandleELi32EEC2Ev
|
||||||
0x0000007100dced3c,GameDataMgr::dtor,504,
|
0x0000007100dced3c,GameDataMgr::dtor,504,_ZN4ksys3gdt7ManagerD1Ev
|
||||||
0x0000007100dcef34,sub_7100DCEF34,72,
|
0x0000007100dcef34,sub_7100DCEF34,72,_ZN4ksys3gdt7Manager14MethodTreeNodeD2Ev
|
||||||
0x0000007100dcef7c,sub_7100DCEF7C,132,
|
0x0000007100dcef7c,sub_7100DCEF7C,132,_ZN4sead13DelegateEventIPN4ksys3gdt7Manager10ResetEventEED2Ev
|
||||||
0x0000007100dcf000,sub_7100DCF000,132,
|
0x0000007100dcf000,sub_7100DCF000,132,_ZN4sead13DelegateEventIPN4ksys3gdt7Manager11ReinitEventEED2Ev
|
||||||
0x0000007100dcf084,nullsub_3855,4,
|
0x0000007100dcf084,nullsub_3855,4,_ZN4ksys3gdt7Manager15TriggerParamRefD2Ev
|
||||||
0x0000007100dcf088,Res2Array::dtor,280,
|
0x0000007100dcf088,Res2Array::dtor,280,_ZN4sead9SafeArrayIN4ksys3res6HandleELi32EED2Ev
|
||||||
0x0000007100dcf1a0,GameDataMgr::dtorDelete,36,
|
0x0000007100dcf1a0,GameDataMgr::dtorDelete,36,_ZN4ksys3gdt7ManagerD0Ev
|
||||||
0x0000007100dcf1c4,GameDataMgr::init,1264,
|
0x0000007100dcf1c4,GameDataMgr::init,1264,_ZN4ksys3gdt7Manager4initEPN4sead4HeapEPNS2_9FrameworkE?
|
||||||
0x0000007100dcf6b4,sub_7100DCF6B4,704,
|
0x0000007100dcf6b4,sub_7100DCF6B4,704,_ZN4ksys3gdt7Manager15IncrementLoggerC2Ev
|
||||||
0x0000007100dcf974,EntryFactoryBgdata::dtor,68,
|
0x0000007100dcf974,EntryFactoryBgdata::dtor,68,
|
||||||
0x0000007100dcf9b8,GameDataMgr::loadGameDataFromArc,1692,
|
0x0000007100dcf9b8,GameDataMgr::loadGameDataFromArc,1692,
|
||||||
0x0000007100dd0054,GameDataMgr::loadShopGameDataInfo,600,
|
0x0000007100dd0054,GameDataMgr::loadShopGameDataInfo,600,
|
||||||
|
@ -74320,13 +74320,13 @@
|
||||||
0x0000007100dd7880,GameDataMgr::doSyncDataVec2fArray,528,
|
0x0000007100dd7880,GameDataMgr::doSyncDataVec2fArray,528,
|
||||||
0x0000007100dd7a90,GameDataMgr::doSyncDataVec3fArray,528,
|
0x0000007100dd7a90,GameDataMgr::doSyncDataVec3fArray,528,
|
||||||
0x0000007100dd7ca0,GameDataMgr::doSyncDataVec4fArray,528,
|
0x0000007100dd7ca0,GameDataMgr::doSyncDataVec4fArray,528,
|
||||||
0x0000007100dd7eb0,GameDataMgr::getName,12,
|
0x0000007100dd7eb0,GameDataMgr::getName,12,_ZNK4ksys3gdt7Manager7getNameEv
|
||||||
0x0000007100dd7ebc,sub_7100DD7EBC,12,
|
0x0000007100dd7ebc,sub_7100DD7EBC,12,_ZThn8_NK4ksys3gdt7Manager7getNameEv
|
||||||
0x0000007100dd7ec8,j__ZdlPv_893,4,
|
0x0000007100dd7ec8,j__ZdlPv_893,4,_ZN4ksys3gdt7Manager15TriggerParamRefD0Ev
|
||||||
0x0000007100dd7ecc,j__ZdlPv_894,4,
|
0x0000007100dd7ecc,j__ZdlPv_894,4,
|
||||||
0x0000007100dd7ed0,sub_7100DD7ED0,148,
|
0x0000007100dd7ed0,sub_7100DD7ED0,148,_ZN4sead13DelegateEventIPN4ksys3gdt7Manager11ReinitEventEED0Ev
|
||||||
0x0000007100dd7f64,sub_7100DD7F64,148,
|
0x0000007100dd7f64,sub_7100DD7F64,148,_ZN4sead13DelegateEventIPN4ksys3gdt7Manager10ResetEventEED0Ev
|
||||||
0x0000007100dd7ff8,sub_7100DD7FF8,84,
|
0x0000007100dd7ff8,sub_7100DD7FF8,84,_ZN4ksys3gdt7Manager14MethodTreeNodeD0Ev
|
||||||
0x0000007100dd804c,EntryFactoryBgdata::m1,76,
|
0x0000007100dd804c,EntryFactoryBgdata::m1,76,
|
||||||
0x0000007100dd8098,EntryFactoryBgdata::rtti1,132,
|
0x0000007100dd8098,EntryFactoryBgdata::rtti1,132,
|
||||||
0x0000007100dd811c,EntryFactoryBgdata::rtti2,92,
|
0x0000007100dd811c,EntryFactoryBgdata::rtti2,92,
|
||||||
|
|
Can't render this file because it is too large.
|
Binary file not shown.
|
@ -1,7 +1,130 @@
|
||||||
#include "KingSystem/GameData/gdtManager.h"
|
#include "KingSystem/GameData/gdtManager.h"
|
||||||
|
#include <devenv/seadEnvUtil.h>
|
||||||
|
#include <framework/seadFramework.h>
|
||||||
|
#include <thread/seadThreadUtil.h>
|
||||||
|
#include <time/seadTickTime.h>
|
||||||
|
#include "KingSystem/GameData/gdtSaveMgr.h"
|
||||||
|
#include "KingSystem/GameData/gdtTriggerParam.h"
|
||||||
|
#include "KingSystem/Resource/resEntryFactory.h"
|
||||||
|
#include "KingSystem/Resource/resResourceGameData.h"
|
||||||
|
#include "KingSystem/Resource/resSystem.h"
|
||||||
|
#include "KingSystem/Utils/HeapUtil.h"
|
||||||
|
#include "KingSystem/Utils/InitTimeInfo.h"
|
||||||
|
|
||||||
namespace ksys::gdt {
|
namespace ksys::gdt {
|
||||||
|
|
||||||
SEAD_SINGLETON_DISPOSER_IMPL(Manager)
|
SEAD_SINGLETON_DISPOSER_IMPL(Manager)
|
||||||
|
|
||||||
|
static util::InitTimeInfoEx sInitTimeInfo;
|
||||||
|
|
||||||
|
Manager::Manager() {
|
||||||
|
mRetryBuffer = nullptr;
|
||||||
|
mGimmickResetBuffer = nullptr;
|
||||||
|
mFlagBuffer1 = nullptr;
|
||||||
|
mFlagBuffer = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Manager::~Manager() {
|
||||||
|
mShopGameDataInfoHandle.requestUnload();
|
||||||
|
|
||||||
|
if (mGameDataHeap) {
|
||||||
|
if (mFlagBuffer1) {
|
||||||
|
mFlagBuffer1->destroyHeap();
|
||||||
|
mFlagBuffer1 = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mFlagBuffer) {
|
||||||
|
mFlagBuffer->destroyHeap();
|
||||||
|
mFlagBuffer = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mRetryBuffer) {
|
||||||
|
mRetryBuffer->destroyHeap();
|
||||||
|
mRetryBuffer = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mGimmickResetBuffer) {
|
||||||
|
mGimmickResetBuffer->destroyHeap();
|
||||||
|
mGimmickResetBuffer = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mSaveAreaHeap) {
|
||||||
|
mSaveAreaHeap->destroy();
|
||||||
|
mSaveAreaHeap = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
mGameDataHeap->destroy();
|
||||||
|
mGameDataHeap = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mGameDataComHeap) {
|
||||||
|
mGameDataComHeap->destroy();
|
||||||
|
mGameDataComHeap = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NON_MATCHING: address differences for the static bgdata_factory that causes different regalloc
|
||||||
|
void Manager::init(sead::Heap* heap, sead::Framework* framework) {
|
||||||
|
sead::TickTime a;
|
||||||
|
sead::TickTime b;
|
||||||
|
|
||||||
|
mGameDataHeap = util::DualHeap::create(0xf00000, "GameDataHeap", heap, nullptr, sizeof(void*),
|
||||||
|
sead::Heap::cHeapDirection_Forward, true);
|
||||||
|
mIncrementLogger = new (mGameDataHeap) IncrementLogger;
|
||||||
|
SaveMgr::createInstance(mGameDataHeap);
|
||||||
|
|
||||||
|
SaveMgr::InitArg arg;
|
||||||
|
arg.heap = mGameDataHeap;
|
||||||
|
arg._8 = 0x300000;
|
||||||
|
arg.buf_size = 0x100000;
|
||||||
|
arg.buf_alignment = 0x200;
|
||||||
|
arg.size2 = 0x10000;
|
||||||
|
arg.thread_priority = sead::ThreadUtil::ConvertPrioritySeadToPlatform(18);
|
||||||
|
arg.thread_affinity = sead::CoreIdMask(sead::CoreId::cSub1);
|
||||||
|
arg._1c = 0x7000;
|
||||||
|
arg.is_demo = sead::EnvUtil::getRomType() == "Show_2017_1st";
|
||||||
|
if (sead::EnvUtil::getRomType() == "RID_Demo") {
|
||||||
|
arg.is_demo = true;
|
||||||
|
arg.save_rid_demo_dir = "Save/RID_Demo/";
|
||||||
|
}
|
||||||
|
|
||||||
|
arg._60 = nullptr;
|
||||||
|
if (util::getDebugHeap2())
|
||||||
|
arg._68 = 0x80000;
|
||||||
|
|
||||||
|
SaveMgr::instance()->init(arg);
|
||||||
|
|
||||||
|
static res::EntryFactory<res::GameData> bgdata_factory{5.0, 0xc0000};
|
||||||
|
res::registerEntryFactory(&bgdata_factory, "bgdata");
|
||||||
|
|
||||||
|
mSaveAreaHeap =
|
||||||
|
util::DualHeap::create(0x500000, "SaveAreaHeap", mGameDataHeap, nullptr, sizeof(void*),
|
||||||
|
sead::Heap::cHeapDirection_Reverse, false);
|
||||||
|
|
||||||
|
SaveMgr::instance()->loadGameSaveData();
|
||||||
|
|
||||||
|
KingEditor::instance()->registerComponent(this);
|
||||||
|
|
||||||
|
sead::FixedSafeString<1024> gamedata_sarc_path;
|
||||||
|
gamedata_sarc_path.format("%s/%s.%s", "GameData", "gamedata", "sarc");
|
||||||
|
loadGameData(gamedata_sarc_path);
|
||||||
|
|
||||||
|
sead::FixedSafeString<1024> shop_gamedata_info_path;
|
||||||
|
shop_gamedata_info_path.format("%s/%s.byml", "GameData", "ShopGameDataInfo");
|
||||||
|
loadShopGameDataInfo(shop_gamedata_info_path);
|
||||||
|
|
||||||
|
mParam.param1 = &mFlagBuffer1;
|
||||||
|
mParam.param = &mFlagBuffer;
|
||||||
|
mParamBypassPerm.param1 = &mFlagBuffer1;
|
||||||
|
mParamBypassPerm.param = &mFlagBuffer;
|
||||||
|
|
||||||
|
mMethodTreeNode.method_tree_mgr = framework->getMethodTreeMgr();
|
||||||
|
mMethodTreeNode.node.setPauseFlag(sead::MethodTreeNode::cPause_None);
|
||||||
|
|
||||||
|
mBitFlags.reset(BitFlag::_1);
|
||||||
|
unloadResources();
|
||||||
|
mBitFlags.set(BitFlag::_1000);
|
||||||
|
mNumFlagsToReset = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace ksys::gdt
|
||||||
|
|
|
@ -1,12 +1,26 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <container/seadRingBuffer.h>
|
||||||
#include <container/seadSafeArray.h>
|
#include <container/seadSafeArray.h>
|
||||||
|
#include <filedevice/seadArchiveFileDevice.h>
|
||||||
|
#include <framework/seadMethodTree.h>
|
||||||
#include <heap/seadDisposer.h>
|
#include <heap/seadDisposer.h>
|
||||||
|
#include <prim/seadDelegateEventSlot.h>
|
||||||
|
#include <prim/seadTypedBitFlag.h>
|
||||||
#include "KingSystem/Resource/resHandle.h"
|
#include "KingSystem/Resource/resHandle.h"
|
||||||
|
#include "KingSystem/System/KingEditor.h"
|
||||||
|
#include "KingSystem/Utils/Byaml.h"
|
||||||
#include "KingSystem/Utils/Types.h"
|
#include "KingSystem/Utils/Types.h"
|
||||||
|
|
||||||
|
namespace sead {
|
||||||
|
class Framework;
|
||||||
|
class MethodTreeMgr;
|
||||||
|
} // namespace sead
|
||||||
|
|
||||||
namespace ksys::gdt {
|
namespace ksys::gdt {
|
||||||
|
|
||||||
|
class TriggerParam;
|
||||||
|
|
||||||
class IManager {
|
class IManager {
|
||||||
public:
|
public:
|
||||||
virtual ~IManager() = 0;
|
virtual ~IManager() = 0;
|
||||||
|
@ -15,17 +29,13 @@ public:
|
||||||
inline IManager::~IManager() = default;
|
inline IManager::~IManager() = default;
|
||||||
|
|
||||||
/// GameDataMgr communication.
|
/// GameDataMgr communication.
|
||||||
class ManagerCom {
|
class ManagerCom : public KingEditorComponent {
|
||||||
public:
|
public:
|
||||||
virtual const char* getName() const = 0;
|
|
||||||
virtual void syncData() = 0;
|
|
||||||
|
|
||||||
void* _8 = nullptr;
|
void* _8 = nullptr;
|
||||||
void* _10 = nullptr;
|
void* _10 = nullptr;
|
||||||
};
|
};
|
||||||
KSYS_CHECK_SIZE_NX150(ManagerCom, 0x18);
|
KSYS_CHECK_SIZE_NX150(ManagerCom, 0x18);
|
||||||
|
|
||||||
// FIXME: very incomplete. This is only here because res::GameData needs to use the Manager's heaps
|
|
||||||
class Manager : public IManager, public ManagerCom {
|
class Manager : public IManager, public ManagerCom {
|
||||||
SEAD_SINGLETON_DISPOSER(Manager)
|
SEAD_SINGLETON_DISPOSER(Manager)
|
||||||
Manager();
|
Manager();
|
||||||
|
@ -34,18 +44,125 @@ class Manager : public IManager, public ManagerCom {
|
||||||
void syncData() override;
|
void syncData() override;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
struct ResetEvent {
|
||||||
|
virtual ~ResetEvent() = default;
|
||||||
|
TriggerParam* param = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ReinitEvent {
|
||||||
|
virtual ~ReinitEvent() = default;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct TriggerParamRef {
|
||||||
|
TriggerParamRef(TriggerParam** param_1, TriggerParam** param, bool check_permissions,
|
||||||
|
bool propagate_param_1_changes, bool change_only_once)
|
||||||
|
: param1(param_1), param(param), check_permissions(check_permissions),
|
||||||
|
propagate_param1_changes(propagate_param_1_changes),
|
||||||
|
change_only_once(change_only_once) {}
|
||||||
|
|
||||||
|
virtual ~TriggerParamRef() = default;
|
||||||
|
|
||||||
|
TriggerParam** param1;
|
||||||
|
TriggerParam** param;
|
||||||
|
bool check_permissions;
|
||||||
|
bool propagate_param1_changes;
|
||||||
|
bool change_only_once;
|
||||||
|
};
|
||||||
|
KSYS_CHECK_SIZE_NX150(TriggerParamRef, 0x20);
|
||||||
|
|
||||||
sead::Heap* getGameDataHeap() const { return mGameDataHeap; }
|
sead::Heap* getGameDataHeap() const { return mGameDataHeap; }
|
||||||
sead::Heap* getSaveAreaHeap() const { return mSaveAreaHeap; }
|
sead::Heap* getSaveAreaHeap() const { return mSaveAreaHeap; }
|
||||||
sead::Heap* getGameDataComHeap() const { return mGameDataComHeap; }
|
sead::Heap* getGameDataComHeap() const { return mGameDataComHeap; }
|
||||||
|
|
||||||
|
void init(sead::Heap* heap, sead::Framework* framework);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
enum class BitFlag {
|
||||||
|
_1 = 0x1,
|
||||||
|
_2 = 0x2,
|
||||||
|
_4 = 0x4,
|
||||||
|
_8 = 0x8,
|
||||||
|
_10 = 0x10,
|
||||||
|
_20 = 0x20,
|
||||||
|
_40 = 0x40,
|
||||||
|
_80 = 0x80,
|
||||||
|
_100 = 0x100,
|
||||||
|
_200 = 0x200,
|
||||||
|
_400 = 0x400,
|
||||||
|
_800 = 0x800,
|
||||||
|
_1000 = 0x1000,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum class ResetFlag {
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
struct MethodTreeNode {
|
||||||
|
virtual ~MethodTreeNode() = default;
|
||||||
|
sead::MethodTreeNode node{nullptr};
|
||||||
|
sead::MethodTreeMgr* method_tree_mgr = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct IncrementLogger {
|
||||||
|
struct Record {
|
||||||
|
u8 _0 = 0;
|
||||||
|
u32 _4 = 0;
|
||||||
|
s32 _8 = -1;
|
||||||
|
u32 _c = 0;
|
||||||
|
};
|
||||||
|
KSYS_CHECK_SIZE_NX150(Record, 0x10);
|
||||||
|
|
||||||
|
u64 _0 = 0;
|
||||||
|
sead::FixedRingBuffer<Record, 64> ring_buffers[6]{};
|
||||||
|
sead::SafeArray<Record, 0xc0> arrays[2]{};
|
||||||
|
};
|
||||||
|
|
||||||
|
void loadGameData(const sead::SafeString& path);
|
||||||
|
void loadShopGameDataInfo(const sead::SafeString& path);
|
||||||
|
void unloadResources();
|
||||||
|
|
||||||
sead::Heap* mGameDataHeap = nullptr;
|
sead::Heap* mGameDataHeap = nullptr;
|
||||||
sead::Heap* mSaveAreaHeap = nullptr;
|
sead::Heap* mSaveAreaHeap = nullptr;
|
||||||
sead::Heap* mGameDataComHeap = nullptr;
|
sead::Heap* mGameDataComHeap = nullptr;
|
||||||
res::Handle mGameDataArcHandle;
|
res::Handle mGameDataArcHandle;
|
||||||
sead::SafeArray<res::Handle, 31> mBgdataHandles;
|
sead::SafeArray<res::Handle, 32> mBgdataHandles;
|
||||||
|
sead::ArchiveFileDevice mGameDataArc{nullptr};
|
||||||
|
|
||||||
|
res::Handle mShopGameDataInfoHandle;
|
||||||
|
al::ByamlIter mShopAreaInfoValues;
|
||||||
|
const u8* mShopAreaInfoHashes = nullptr;
|
||||||
|
al::ByamlIter mShopSoldOutInfoValues;
|
||||||
|
const u8* mShopSoldOutInfoHashes = nullptr;
|
||||||
|
|
||||||
|
TriggerParamRef mParamBypassPerm{&mFlagBuffer1, &mFlagBuffer, false, false, false};
|
||||||
|
TriggerParamRef mParam{&mFlagBuffer1, &mFlagBuffer, true, false, false};
|
||||||
|
|
||||||
|
IncrementLogger* mIncrementLogger = nullptr;
|
||||||
|
|
||||||
|
TriggerParam* mFlagBuffer1;
|
||||||
|
TriggerParam* mFlagBuffer;
|
||||||
|
TriggerParam* mRetryBuffer;
|
||||||
|
TriggerParam* mGimmickResetBuffer;
|
||||||
|
|
||||||
|
sead::TypedBitFlag<BitFlag> mBitFlags;
|
||||||
|
sead::TypedBitFlag<ResetFlag> mResetFlags;
|
||||||
|
u32 _c20 = 0;
|
||||||
|
u32 mNumFlagsToReset = 0;
|
||||||
|
u32 mParam1Flag = 0;
|
||||||
|
|
||||||
|
sead::DelegateEvent<ReinitEvent*> mReinitEvent;
|
||||||
|
sead::DelegateEvent<ResetEvent*> mResetEvent;
|
||||||
|
|
||||||
|
MethodTreeNode mMethodTreeNode;
|
||||||
|
|
||||||
|
void* mDelegate1 = nullptr; // FIXME: figure out what this is
|
||||||
|
sead::IDelegateR<const sead::SafeString&>* mGetMapNameDelegate = nullptr;
|
||||||
|
|
||||||
|
sead::FixedSafeString<64> mStr; // TODO: rename
|
||||||
|
u32 mTrackerBlockSaveNumberFlagCrc32 = 0;
|
||||||
|
u32 mSyncStep = 0;
|
||||||
|
sead::CriticalSection mCriticalSection;
|
||||||
};
|
};
|
||||||
// FIXME: the size should be 0xDC8
|
KSYS_CHECK_SIZE_NX150(Manager, 0xdc8);
|
||||||
KSYS_CHECK_SIZE_NX150(Manager, 0xa58);
|
|
||||||
|
|
||||||
} // namespace ksys::gdt
|
} // namespace ksys::gdt
|
||||||
|
|
Loading…
Reference in New Issue