From 50469a43fcae66a614ddc67903438561c973b22c Mon Sep 17 00:00:00 2001 From: Tonycons-dev <70544875+Tonycons-dev@users.noreply.github.com> Date: Sun, 22 Jan 2023 12:17:04 -0500 Subject: [PATCH] Add uking::PlayReport (#112) --- data/uking_functions.csv | 50 +++++++-------- src/Game/CMakeLists.txt | 2 + src/Game/gamePlayReport.cpp | 82 +++++++++++++++++++++++++ src/Game/gamePlayReport.h | 20 ++++++ src/KingSystem/System/PlayReportMgr.cpp | 68 ++++++++++++++++++-- src/KingSystem/System/PlayReportMgr.h | 30 ++++++--- src/KingSystem/System/ProductReporter.h | 17 ++++- 7 files changed, 231 insertions(+), 38 deletions(-) create mode 100644 src/Game/gamePlayReport.cpp create mode 100644 src/Game/gamePlayReport.h diff --git a/data/uking_functions.csv b/data/uking_functions.csv index e7e27031..91127cae 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -61178,17 +61178,17 @@ Address,Quality,Size,Name 0x0000007100a86950,U,000016, 0x0000007100a86960,U,000480, 0x0000007100a86b40,U,000288,trackerLoadFileStuff -0x0000007100a86c60,U,000616,playReportKorok -0x0000007100a86ec8,U,000360,PlayReport::Report::ctor -0x0000007100a87030,U,001116,PlayReport::Report::addMapType -0x0000007100a8748c,U,000908,playReportDungeon -0x0000007100a87818,U,001256,playReportQuestEvent +0x0000007100a86c60,O,000616,_ZN5uking11reportKorokERKN4sead7Vector3IfEE +0x0000007100a86ec8,O,000360,_ZN5uking10PlayReportC1ERKN4sead15FixedSafeStringILi32EEEiPNS1_4HeapE +0x0000007100a87030,O,001116,_ZN5uking10PlayReport10addMapTypeEv +0x0000007100a8748c,O,000908,_ZN5uking13reportDungeonERKN4sead14SafeStringBaseIcEES4_ +0x0000007100a87818,U,001256,uking::reportQuestEvent 0x0000007100a87d00,U,002908,getQuestId -0x0000007100a8885c,U,000528,reportGanonQuestFinished -0x0000007100a88a6c,U,001740,playReportGameOver -0x0000007100a89138,U,001384,playReportBloodMoon -0x0000007100a896a0,U,000852,playReportGetItem -0x0000007100a899f4,U,008496,playReportOptionsFromTitleStage +0x0000007100a8885c,U,000528,uking::reportGanonQuestFinished +0x0000007100a88a6c,U,001740,uking::reportGameOver +0x0000007100a89138,U,001384,uking::reportBloodMoon +0x0000007100a896a0,U,000852,uking::reportGetItem +0x0000007100a899f4,U,008496,uking::reportOptionsFromTitleStage 0x0000007100a8bb24,U,000176,PosTrackerUploader::dtor 0x0000007100a8bbd4,U,000184,PosTrackerUploader::dtorDelete 0x0000007100a8bc8c,U,000220,PosTrackerUploader::createInstance @@ -84470,10 +84470,10 @@ Address,Quality,Size,Name 0x0000007100fd1184,U,000236, 0x0000007100fd1270,U,000032, 0x0000007100fd1290,O,000432,_ZN4ksys10PlayReport10setEventIdERN4sead22BufferedSafeStringBaseIcEE -0x0000007100fd1440,O,000100,_ZN4ksys10PlayReport3addERKN4sead14SafeStringBaseIcEEj -0x0000007100fd14a4,O,000100,_ZN4ksys10PlayReport3addERKN4sead14SafeStringBaseIcEEi -0x0000007100fd1508,O,000100,_ZN4ksys10PlayReport3addERKN4sead14SafeStringBaseIcEEf -0x0000007100fd156c,O,000120,_ZN4ksys10PlayReport3addERKN4sead14SafeStringBaseIcEES5_ +0x0000007100fd1440,O,000100,_ZN4ksys10PlayReport3addERKN4sead15FixedSafeStringILi48EEEj +0x0000007100fd14a4,O,000100,_ZN4ksys10PlayReport3addERKN4sead15FixedSafeStringILi48EEEi +0x0000007100fd1508,O,000100,_ZN4ksys10PlayReport3addERKN4sead15FixedSafeStringILi48EEEf +0x0000007100fd156c,O,000120,_ZN4ksys10PlayReport3addERKN4sead15FixedSafeStringILi48EEERKNS1_14SafeStringBaseIcEE 0x0000007100fd15e4,O,000140,_ZN4ksys10PlayReport4saveEv 0x0000007100fd1670,O,000164,_ZN4ksys10PlayReport4initEiPN4sead4HeapE 0x0000007100fd1714,O,000084,_ZN4ksys10PlayReportD1Ev @@ -84499,10 +84499,10 @@ Address,Quality,Size,Name 0x0000007100fd1e80,O,000280,_ZN4ksys15ProductReporter12updateTimersEv 0x0000007100fd1f98,O,001672,_ZN4ksys15ProductReporter28incrementSceneAndRomWorkTimeEv 0x0000007100fd2620,U,000076, -0x0000007100fd266c,U,000620,playReportEmergencyHeapUse -0x0000007100fd28d8,U,001436,PlayReport::Report::addRomVersions -0x0000007100fd2e74,U,000688,PlayReport::Report::addPlayTimes -0x0000007100fd3124,U,000476,PlayReport::Report::addPosition +0x0000007100fd266c,U,000620,ksys::reportEmergencyHeapUse +0x0000007100fd28d8,U,001436,ksys::PlayReport::addRomVersions +0x0000007100fd2e74,O,000688,_ZN4ksys10PlayReport12addPlayTimesEv +0x0000007100fd3124,O,000476,_ZN4ksys10PlayReport11addPositionERKN4sead7Vector2IfEE 0x0000007100fd3300,O,000028,_ZNK4ksys15ProductReporter10saveReportEPNS_10PlayReportE 0x0000007100fd331c,O,000112,_ZN4ksys15ProductReporter21initGameDataIteratorsEv 0x0000007100fd338c,O,000428,_ZN4ksys13PlayReportKey5text_Ei @@ -84517,15 +84517,15 @@ Address,Quality,Size,Name 0x0000007100fd38b8,O,000040,_ZN4ksys13PlayReportMgrD1Ev 0x0000007100fd38e0,O,000068,_ZN4ksys13PlayReportMgrD0Ev 0x0000007100fd3924,U,000264,PlayReportMgr::init -0x0000007100fd3a2c,U,000024,PlayReportMgr::calc -0x0000007100fd3a44,U,000008,PlayReportMgr::__auto0 +0x0000007100fd3a2c,O,000024,_ZN4ksys13PlayReportMgr4calcEv +0x0000007100fd3a44,O,000008,_ZNK4ksys13PlayReportMgr5auto0Ev 0x0000007100fd3a4c,U,000004,nullsub_6149 0x0000007100fd3a50,U,000004, -0x0000007100fd3a54,U,000004,PlayReportMgr::reportDebug -0x0000007100fd3a58,U,000024,PlayReportMgr::__auto2 -0x0000007100fd3a70,U,000028,PlayReportMgr::__auto1 -0x0000007100fd3a8c,U,000028,PlayReportMgr::__auto3 -0x0000007100fd3aa8,U,000028,PlayReportMgr::x +0x0000007100fd3a54,O,000004,_ZN4ksys13PlayReportMgr11reportDebugERKN4sead14SafeStringBaseIcEES5_ +0x0000007100fd3a58,O,000024,_ZNK4ksys13PlayReportMgr22getPlayerTrackReporterEv +0x0000007100fd3a70,O,000028,_ZN4ksys13PlayReportMgr24setPlayerTrackReporter28Ev +0x0000007100fd3a8c,O,000028,_ZN4ksys13PlayReportMgr24setPlayerTrackReporter29Ev +0x0000007100fd3aa8,O,000028,_ZN4ksys13PlayReportMgr24setPlayerTrackReporter30Ev 0x0000007100fd3ac4,U,000004,ProductReporter::jInitGameDataIterators 0x0000007100fd3ac8,O,000124,_ZN4ksys15ProductReporterD1Ev 0x0000007100fd3b44,O,000132,_ZN4ksys15ProductReporterD0Ev diff --git a/src/Game/CMakeLists.txt b/src/Game/CMakeLists.txt index 8b2a312e..183a945e 100644 --- a/src/Game/CMakeLists.txt +++ b/src/Game/CMakeLists.txt @@ -7,6 +7,8 @@ add_subdirectory(UI) target_sources(uking PRIVATE gameItemUtils.cpp gameItemUtils.h + gamePlayReport.cpp + gamePlayReport.h gameScene.cpp gameScene.h gameStageInfo.cpp diff --git a/src/Game/gamePlayReport.cpp b/src/Game/gamePlayReport.cpp new file mode 100644 index 00000000..86566847 --- /dev/null +++ b/src/Game/gamePlayReport.cpp @@ -0,0 +1,82 @@ +#include "Game/gamePlayReport.h" +#include +#include "KingSystem/GameData/gdtCommonFlagsUtils.h" +#include "KingSystem/GameData/gdtManager.h" +#include "KingSystem/GameData/gdtTriggerParam.h" +#include "KingSystem/System/ProductReporter.h" +#include "KingSystem/System/StageInfo.h" + +namespace uking { + +void reportKorok(const sead::Vector3f& position) { + ksys::ProductReporter::getSomeBool(); + s32 id = ksys::gdt::getFlag_HiddenKorok_Number(); + + PlayReport report(sead::SafeString("korok"), 7, + ksys::PlayReportMgr::instance()->getReporter()->getHeap()); + + report.addMapType(); + report.add(sead::SafeString("Id"), u32(id)); + + report.addPlayTimes(); + report.addPosition({position.x, position.z}); + + if (ksys::PlayReportMgr::instance()) { + auto* reporter = ksys::PlayReportMgr::instance()->getReporter(); + if (reporter && reporter->isEnabled()) + reporter->saveReport(&report); + } +} + +void reportDungeon(const sead::SafeString& name, const sead::SafeString& event) { + ksys::ProductReporter::getSomeBool(); + + if (name.findIndex("Remains") == -1 && name.findIndex("Dungeon") == -1 && + name.findIndex("FinalTrial") == -1) + return; + + PlayReport report(sead::SafeString("dungeon"), 6, + ksys::PlayReportMgr::instance()->getReporter()->getHeap()); + + report.addMapType(); + + report.add(sead::SafeString("Name"), name); + report.add(sead::SafeString("Event"), event); + + report.addPlayTimes(); + + if (ksys::PlayReportMgr::instance()) { + auto* reporter = ksys::PlayReportMgr::instance()->getReporter(); + if (reporter && reporter->isEnabled()) + reporter->saveReport(&report); + } +} + +PlayReport::PlayReport(const sead::FixedSafeString<32>& event_id, s32 num_entries, sead::Heap* heap) + : ksys::PlayReport(event_id, num_entries, heap) {} + +void PlayReport::addMapType() { + if (!ksys::gdt::Manager::instance()) + return; + + add(sead::SafeString("IsHardMode"), ksys::gdt::getFlag_AoC_HardMode_Enabled()); + + const sead::SafeString& current_map = ksys::StageInfo::getCurrentMapType(); + u32 type = 0; + + if (current_map == "MainField") + type = 1; + + if (current_map == "AocField") + type = 2; + + if (current_map == "CDungeon") + type = 3; + + if (current_map == "MainFieldDungeon") + type = 4; + + add(sead::SafeString("MapType"), type); +} + +} // namespace uking diff --git a/src/Game/gamePlayReport.h b/src/Game/gamePlayReport.h new file mode 100644 index 00000000..edce5191 --- /dev/null +++ b/src/Game/gamePlayReport.h @@ -0,0 +1,20 @@ +#pragma once + +#include +#include "KingSystem/System/PlayReportMgr.h" + +namespace uking { + +void reportKorok(const sead::Vector3f& position); +void reportDungeon(const sead::SafeString& name, const sead::SafeString& event); + +// TODO: More functions + +class PlayReport : public ksys::PlayReport { +public: + PlayReport(const sead::FixedSafeString<32>& event_id, s32 num_entries, sead::Heap* heap); + + void addMapType(); +}; + +} // namespace uking diff --git a/src/KingSystem/System/PlayReportMgr.cpp b/src/KingSystem/System/PlayReportMgr.cpp index 4ee834c0..29f34e53 100644 --- a/src/KingSystem/System/PlayReportMgr.cpp +++ b/src/KingSystem/System/PlayReportMgr.cpp @@ -13,6 +13,40 @@ PlayReportMgr::~PlayReportMgr() { delete mReporter; } +void PlayReportMgr::calc() { + if (!_30 && mReporter) + mReporter->updateTimers(); +} + +void PlayReportMgr::reportDebug(const sead::SafeString& message, const sead::SafeString& data) { + // Stubbed in release builds +} + +bool PlayReportMgr::auto0() const { + return true; +} + +PlayerTrackReporter* PlayReportMgr::getPlayerTrackReporter() const { + if (!mReporter) + return nullptr; + return mReporter->getPlayerTrackReporter(); +} + +void PlayReportMgr::setPlayerTrackReporter28() { + if (auto* reporter = getPlayerTrackReporter()) + reporter->_28 = true; +} + +void PlayReportMgr::setPlayerTrackReporter29() { + if (auto* reporter = getPlayerTrackReporter()) + reporter->_29 = true; +} + +void PlayReportMgr::setPlayerTrackReporter30() { + if (auto* reporter = getPlayerTrackReporter()) + reporter->_30 = true; +} + bool PlayReport::setEventId(sead::BufferedSafeString& event_id) { if (!mHasNinPrepoReport) return false; @@ -21,22 +55,48 @@ bool PlayReport::setEventId(sead::BufferedSafeString& event_id) { return mNinPlayReport->SetEventId(event_id.cstr()).IsSuccess(); } -bool PlayReport::add(const sead::SafeString& key, u32 value) { +[[gnu::noinline]] bool PlayReport::add(const sead::FixedSafeString<48>& key, u32 value) { return mHasNinPrepoReport && mNinPlayReport->Add(key.cstr(), s64(value)).IsSuccess(); } -bool PlayReport::add(const sead::SafeString& key, s32 value) { +[[gnu::noinline]] bool PlayReport::add(const sead::FixedSafeString<48>& key, s32 value) { return mHasNinPrepoReport && mNinPlayReport->Add(key.cstr(), s64(value)).IsSuccess(); } -bool PlayReport::add(const sead::SafeString& key, f32 value) { +[[gnu::noinline]] bool PlayReport::add(const sead::FixedSafeString<48>& key, f32 value) { return mHasNinPrepoReport && mNinPlayReport->Add(key.cstr(), value).IsSuccess(); } -bool PlayReport::add(const sead::SafeString& key, const sead::SafeString& value) { +[[gnu::noinline]] bool PlayReport::add(const sead::FixedSafeString<48>& key, + const sead::SafeString& value) { return mHasNinPrepoReport && mNinPlayReport->Add(key.cstr(), value.cstr()).IsSuccess(); } +void PlayReport::addPlayTimes() { + if (!gdt::Manager::instance()) + return; + + if (!PlayReportMgr::instance()) + return; + + if (!PlayReportMgr::instance()->getReporter()) + return; + + s32 playTime = + PlayReportMgr::instance()->getReporter()->getS32(PlayReportKey::PlayReport_PlayTime); + + s32 allPlayTime = + PlayReportMgr::instance()->getReporter()->getS32(PlayReportKey::PlayReport_AllPlayTime); + + add(sead::SafeString("PlayTime"), u32(playTime)); + add(sead::SafeString("AllPlayTime"), u32(allPlayTime)); +} + +void PlayReport::addPosition(const sead::Vector2f& position) { + add(sead::SafeString("PosX"), position.x); + add(sead::SafeString("PosZ"), position.y); +} + bool PlayReport::save() { if (!mHasNinPrepoReport) return false; diff --git a/src/KingSystem/System/PlayReportMgr.h b/src/KingSystem/System/PlayReportMgr.h index bfcca3aa..7c52e9b0 100644 --- a/src/KingSystem/System/PlayReportMgr.h +++ b/src/KingSystem/System/PlayReportMgr.h @@ -3,6 +3,7 @@ #include #include #include +#include "KingSystem/System/ProductReporter.h" #include "KingSystem/Utils/Types.h" namespace nn::prepo { @@ -29,6 +30,13 @@ public: void reportDebug(const sead::SafeString& message, const sead::SafeString& data); + bool auto0() const; + PlayerTrackReporter* getPlayerTrackReporter() const; + + void setPlayerTrackReporter28(); + void setPlayerTrackReporter29(); + void setPlayerTrackReporter30(); + ProductReporter* getReporter() const { return mReporter; } bool get30() const { return _30; } @@ -43,20 +51,28 @@ KSYS_CHECK_SIZE_NX150(PlayReportMgr, 0x40); class PlayReport { public: - PlayReport(const sead::SafeString& event_id, s32 num_entries, sead::Heap* heap) { + inline PlayReport(const sead::FixedSafeString<32>& event_id, s32 num_entries, + sead::Heap* heap) { init(num_entries, heap); - sead::FixedSafeString<32> event_id_; - event_id_.cutOffCopy(event_id); + sead::FixedSafeString<32> event_id_ = event_id; setEventId(event_id_); } ~PlayReport(); bool setEventId(sead::BufferedSafeString& event_id); - bool add(const sead::SafeString& key, u32 value); - bool add(const sead::SafeString& key, s32 value); - bool add(const sead::SafeString& key, f32 value); - bool add(const sead::SafeString& key, const sead::SafeString& value); + + bool add(const sead::FixedSafeString<48>& key, u32 value); + bool add(const sead::FixedSafeString<48>& key, s32 value); + bool add(const sead::FixedSafeString<48>& key, f32 value); + bool add(const sead::FixedSafeString<48>& key, const sead::SafeString& value); + + // TODO: requires LayoutResourceMgr + void addRomVersions(); + + void addPlayTimes(); + void addPosition(const sead::Vector2f& position); + bool save(); private: diff --git a/src/KingSystem/System/ProductReporter.h b/src/KingSystem/System/ProductReporter.h index 1ee42f6d..34b8b94d 100644 --- a/src/KingSystem/System/ProductReporter.h +++ b/src/KingSystem/System/ProductReporter.h @@ -29,8 +29,11 @@ public: void init(sead::Heap* heap); void setPosTrackEnd(); -private: - u8 _0[48]; + u8 _0[40]; + bool _28; + bool _29; + bool _30; + u8 _3a[5]; }; class ProductReporter { @@ -82,6 +85,16 @@ public: u32 mBufferLength; }; + sead::Heap* getHeap() const { return mHeap; } + + PlayerTrackReporter* getPlayerTrackReporter() const { return mPlayerTrackReporter; } + + inline s32 getS32(s32 key) { + s32 out = 0; + gdt::Manager::instance()->getS32(mGameDataHandles[key], &out); + return out; + } + private: u8 _0[8];