diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 5b2a5b70..1f2b0ab9 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -88334,9 +88334,9 @@ Address,Quality,Size,Name 0x00000071010a263c,O,000268,_ZN4ksys2ui17LayoutResourceMgr4initEPN4sead4HeapE 0x00000071010a2748,O,000424,_ZN4ksys2ui17LayoutResourceMgr11loadMsgPackEPj 0x00000071010a28f0,U,000384,LayoutResourceMgr::__auto2 -0x00000071010a2a70,U,000260,LayoutResourceMgr::loadLangFont +0x00000071010a2a70,W,000260,_ZN4ksys2ui17LayoutResourceMgr12loadLangFontEPN4sead4HeapE 0x00000071010a2b74,U,000388,LayoutResourceMgr::__auto0 -0x00000071010a2cf8,U,000680,LayoutResourceMgr::loadFonts +0x00000071010a2cf8,W,000680,_ZN4ksys2ui17LayoutResourceMgr18loadExtraLangFontsEPN4sead4HeapE 0x00000071010a2fa0,U,000188,LayoutResourceMgr::ready 0x00000071010a305c,U,000136,LayoutResourceMgr::ready_0 0x00000071010a30e4,U,000136,LayoutResourceMgr::loadVersion diff --git a/src/KingSystem/System/UI/LayoutResourceMgr.cpp b/src/KingSystem/System/UI/LayoutResourceMgr.cpp index 99d80651..43c968cd 100644 --- a/src/KingSystem/System/UI/LayoutResourceMgr.cpp +++ b/src/KingSystem/System/UI/LayoutResourceMgr.cpp @@ -1,4 +1,6 @@ #include + +#include #include "KingSystem/Resource/resLoadRequest.h" #include "KingSystem/System/StarterPackMgr.h" @@ -10,8 +12,8 @@ SEAD_SINGLETON_DISPOSER_IMPL(LayoutResourceMgr) void LayoutResourceMgr::init(sead::Heap* heap) { mMsgPackHandle = new (heap) res::Handle; - mLangFontTodo = new (heap) res::Handle; - mVersionRes = new (heap) res::Handle; + mLangFontHandle = new (heap) res::Handle; + mVersionHandle = new (heap) res::Handle; int count; // value() needed because operator int() is volatile switch (sead::EnvUtil::getRegionLanguage().value()) { @@ -25,10 +27,10 @@ void LayoutResourceMgr::init(sead::Heap* heap) { break; } for (int i = 0; i < count; i++) { - mArray.pushBack(new (heap) res::Handle); + mExtraLangFontHandles.pushBack(new (heap) res::Handle); } if (count > 0) { - mHandleAtx90 = new (heap) res::Handle; + mZeldaGlyphHandle = new (heap) res::Handle; } } @@ -56,4 +58,66 @@ u8* LayoutResourceMgr::loadMsgPack(u32* size) { return resource->getRawData(); } +void LayoutResourceMgr::loadLangFont(sead::Heap* heap) { + mLangFontHandle->resetUnitFlag20000IfSuccess(); + mLangFontHandle->unload(); + mLangFontHandle = nullptr; + + res::LoadRequest req; + req.mRequester = "LayoutResourceMgr"; + req._22 = true; + req.mLoadDataAlignment = 0x1000; + req._26 = false; + + sead::FixedSafeString<0x20> path; + // TODO: needs sead::EnvUtil::getRegion() and sead::RegionID + /* path.format("Font/Font_%s.bfarc", sead::EnvUtil::getRegion()); */ + + mLangFontHandle->load(path, &req, nullptr); +} + +constexpr const char* cExtraFontFiles[12] = { + "AsiaKCUBE-R", + "AsiaKDREAM2R", + "AsiaKDREAM4R", + "AsiaKDREAM7R", + "DFP_GBZY9", + "DFP_GB_H3", + "DFP_GB_H5", + "DFHEI5A", + "DFT_ZY9", + "DFT_B3", + "DFT_B5", + "DFT_B9" +}; + +void LayoutResourceMgr::loadExtraLangFonts(sead::Heap* heap) { + sead::RegionLanguageID lang_id = sead::EnvUtil::getRegionLanguage(); + const char* const* fonts = cExtraFontFiles; + for (int i = 0; i <= 2; i++) { + if (lang_id.value() == sead::RegionLanguageID::KRko + i) { + break; + } + if (i == 2) { + return; + } + fonts += 4; + } + + res::LoadRequest req; + req.mRequester = "ui::LayoutResourceMgr"; + req._26 = false; + + // non-matching: reordering + res::Handle::Status status = res::Handle::Status::NoFile; + for (int i = 0; i < 4; ++i) { + auto* handle = mExtraLangFontHandles[i]; + sead::FixedSafeString<0x20> path; + path.format("Font/Font_%s.bfttf", fonts[i]); + handle->requestLoad(path, &req, &status); + } + mZeldaGlyphHandle->requestLoad("Font/ZeldaGlyphs-v2-Deco.bfotf", &req, &status); + nn::pl::RequestSharedFontLoad(0); +} + } // namespace ksys::ui diff --git a/src/KingSystem/System/UI/LayoutResourceMgr.h b/src/KingSystem/System/UI/LayoutResourceMgr.h index 85e1c407..bc8467f4 100644 --- a/src/KingSystem/System/UI/LayoutResourceMgr.h +++ b/src/KingSystem/System/UI/LayoutResourceMgr.h @@ -9,6 +9,10 @@ #include "ArcResourceMgr.h" +namespace nn::pl { +u64 RequestSharedFontLoad(int); +} + namespace ksys::ui { class LayoutResourceMgr { @@ -20,12 +24,15 @@ public: void init(sead::Heap* heap); u8* loadMsgPack(u32* size); + void loadLangFont(sead::Heap* heap); + void loadExtraLangFonts(sead::Heap* heap); + private: res::Handle* mMsgPackHandle = nullptr; - res::Handle* mLangFontTodo = nullptr; - res::Handle* mVersionRes = nullptr; - sead::FixedPtrArray mArray; - res::Handle* mHandleAtx90 = 0; + res::Handle* mLangFontHandle = nullptr; + res::Handle* mVersionHandle = nullptr; + sead::FixedPtrArray mExtraLangFontHandles; + res::Handle* mZeldaGlyphHandle = nullptr; ArcResourceMgr* mArcResourceMgr = nullptr; res::Handle* mLangFontRes = nullptr; void* _a8 = nullptr; @@ -37,7 +44,8 @@ private: res::Handle* mHorseLayoutResu = nullptr; u64 _e0 = 0; u64 _e8 = 0; - u32 _f0 = 0; + u16 mMaxDefArtLen = 0; + u16 mMaxIndefArtLen = 0; sead::FixedSafeString<16> mVersionString; int _120 = 0; sead::CriticalSection mCriticalSection;