From 2f32363f459d11086b8ea5db67aab0df83fd4f62 Mon Sep 17 00:00:00 2001 From: nclok1405 <155463060+nclok1405@users.noreply.github.com> Date: Fri, 13 Jun 2025 23:42:08 +0900 Subject: [PATCH] Added/Restored the ability to render Hiragana characters using GFXP_HIRAGANA macro --- soh/soh/OTRGlobals.cpp | 23 ++++++++++++++++--- .../overlays/gamestates/ovl_select/z_select.c | 5 ++-- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 09b0ffe50..edd8a4df7 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1704,6 +1704,7 @@ extern "C" void Ctx_WriteSaveFile(uintptr_t addr, void* dramAddr, size_t size) { std::wstring StringToU16(const std::string& s) { std::vector result; size_t i = 0; + while (i < s.size()) { unsigned long uni; size_t nbytes = 0; @@ -1712,7 +1713,13 @@ std::wstring StringToU16(const std::string& s) { if (c < 0x80) { // ascii uni = c; nbytes = 0; - } else if (c <= 0xBF) { // assuming kata/hiragana delimiter + } else if (c == GFXP_HIRAGANA_CHAR) { // Start Hiragana Mode + uni = c; + nbytes = 0; + } else if (c == GFXP_KATAKANA_CHAR) { // Start Katakana Mode + uni = c; + nbytes = 0; + } else if (c <= 0xBF) { // Invalid Characters (Skipped) nbytes = 0; uni = '\1'; } else if (c <= 0xDF) { @@ -1769,13 +1776,23 @@ extern "C" void OTRGfxPrint(const char* str, void* printer, void (*printImpl)(vo }; std::wstring wstr = StringToU16(str); + bool hiraganaMode = false; for (const auto& c : wstr) { - unsigned char convt = ' '; if (c < 0x80) { printImpl(printer, c); + } else if (c == GFXP_HIRAGANA_CHAR) { + hiraganaMode = true; + } else if (c == GFXP_KATAKANA_CHAR) { + hiraganaMode = false; } else if (c >= u'。' && c <= u'゚') { // katakana (hankaku) - printImpl(printer, c - 0xFEC0); + if (hiraganaMode && c >= u'ヲ' && c <= u'ソ') { + printImpl(printer, c - 0xFEC0 - 0x20); // Hiragana Mode, Block 1 + } else if (hiraganaMode && c >= u'タ' && c <= u'ン') { + printImpl(printer, c - 0xFEC0 + 0x20); // Hiragana Mode, Block 2 + } else { + printImpl(printer, c - 0xFEC0); + } } else if (c == u' ') { // zenkaku space printImpl(printer, u' '); } else { diff --git a/soh/src/overlays/gamestates/ovl_select/z_select.c b/soh/src/overlays/gamestates/ovl_select/z_select.c index 86b0bf1fe..a057ebbd5 100644 --- a/soh/src/overlays/gamestates/ovl_select/z_select.c +++ b/soh/src/overlays/gamestates/ovl_select/z_select.c @@ -386,8 +386,9 @@ static SceneSelectEntry sScenes[] = { }; // Note about Japanese scene names: -// * SoH currently lacks the ability to render Hiragana characters using GFXP_HIRAGANA macro. -// So instead Hiragana characters are written directly. +// * SoH originally lacked the ability to render Hiragana characters using GFXP_HIRAGANA macro. +// This is not the case anymore, but Hiragana characters are still written directly here +// for the sake of readability and editability. // * Dakuten (濁点) characters must be explicitly written using '゛' or '゜'. // Combined characters (such as 'が', 'げ', 'ば', etc) won't render. static BetterSceneSelectEntry sBetterScenes[] = {