#include "yuzu.h" #include "mages/mages.h" namespace { auto isFastMem = true; auto isVirtual = true; // Process.arch === 'x64' && Process.platform === 'windows'; auto idxDescriptor = isVirtual == true ? 2 : 1; auto idxEntrypoint = idxDescriptor + 1; uintptr_t getDoJitAddress() { auto RegisterBlockSig1 = "E8 ?? ?? ?? ?? 4? 8B ?? 4? 8B ?? 4? 8B ?? E8 ?? ?? ?? ?? 4? 89?? 4? 8B???? ???????? 4? 89?? ?? 4? 8B?? 4? 89"; auto RegisterBlock = find_pattern(RegisterBlockSig1, processStartAddress, processStopAddress); if (RegisterBlock) { auto beginSubSig1 = "CC 40 5? 5? 5?"; auto lookbackSize = 0x400; auto address = RegisterBlock - lookbackSize; auto subs = find_pattern(beginSubSig1, address, address + lookbackSize); if (subs) { return subs + 1; } } auto PatchSig1 = "4????? 4????? 4????? FF?? ?? 4????? ?? 4????? 75 ?? 4????? ?? 4????? ?? 4?"; auto Patch = find_pattern(PatchSig1, processStartAddress, processStopAddress); if (Patch) { auto beginSubSig1 = "4883EC ?? 48"; auto lookbackSize = 0x80; auto address = Patch - lookbackSize; auto subs = find_pattern(beginSubSig1, address, address + lookbackSize); if (subs) { idxDescriptor = 1; idxEntrypoint = 2; return subs; } } return 0; /* 这块不知道怎么实现。 // DebugSymbol: RegisterBlock // ?RegisterBlock@EmitX64@X64@Backend@Dynarmic@@IEAA?AUBlockDescriptor@1234@AEBVLocationDescriptor@IR@4@PEBX_K@Z <- new // ?RegisterBlock@EmitX64@X64@Backend@Dynarmic@@IEAA?AUBlockDescriptor@1234@AEBVLocationDescriptor@IR@4@PEBX1_K@Z const symbols = DebugSymbol.findFunctionsMatching('Dynarmic::Backend::X64::EmitX64::RegisterBlock'); if (symbols.length !== 0) { return symbols[0]; } // DebugSymbol: Patch // ?Patch@EmitX64@X64@Backend@Dynarmic@@IEAAXAEBVLocationDescriptor@IR@4@PEBX@Z const patchs = DebugSymbol.findFunctionsMatching('Dynarmic::Backend::X64::EmitX64::Patch'); if (patchs.length !== 0) { idxDescriptor = 1; idxEntrypoint = 2; return patchs[0]; } */ } struct emfuncinfo { uint64_t type; int argidx; int padding; void *hookfunc; void *filterfun; const char *_id; const char *_version; }; std::unordered_map emfunctionhooks; struct GameInfo { std::string name{""}; uint64_t id{0}; std::string version{""}; } game_info; bool checkiscurrentgame(const emfuncinfo &em) { auto wininfos = get_proc_windows(); for (auto &&info : wininfos) { if ((game_info.version.size()) && game_info.name.size() && (game_info.id != 0)) { // 判断是有效的info auto checkversion = (em._version == 0) || (std::string(em._version) == (game_info.version)); auto checkid = (std::stoll(em._id, 0, 16) == game_info.id); if (checkid && checkversion) return true; } else if ((em._version == 0) || (info.title.find(acastw(em._version)) != info.title.npos)) return true; } return false; } } bool Hook_Network_RoomMember_SendGameInfo() { // void RoomMember::SendGameInfo(const GameInfo& game_info) { // room_member_impl->current_game_info = game_info; // if (!IsConnected()) // return; // Packet packet; // packet.Write(static_cast(IdSetGameInfo)); // packet.Write(game_info.name); // packet.Write(game_info.id); // packet.Write(game_info.version); // room_member_impl->Send(std::move(packet)); // } BYTE pattern[] = { 0x49, 0x8B, XX, 0x0F, 0xB6, 0x81, 0x28, 0x01, 0x00, 0x00, 0x90, 0x3C, 0x02, 0x74, 0x1C, 0x0F, 0xB6, 0x81, 0x28, 0x01, 0x00, 0x00, 0x90, 0x3C, 0x03, 0x74, 0x10, 0x0F, 0xB6, 0x81, 0x28, 0x01, 0x00, 0x00, 0x90, 0x3C, 0x04, 0x0F, 0x85, XX4}; for (auto addr : Util::SearchMemory(pattern, sizeof(pattern), PAGE_EXECUTE, processStartAddress, processStopAddress)) { addr = MemDbg::findEnclosingAlignedFunction_strict(addr, 0x100); // 有两个,但另一个离起始很远 if (addr == 0) continue; HookParam hp; hp.address = addr; hp.text_fun = [](hook_stack *stack, HookParam *hp, uintptr_t *data, uintptr_t *split, size_t *len) { // void __fastcall Network::RoomMember::SendGameInfo( // Network::RoomMember *this, // const AnnounceMultiplayerRoom::GameInfo *game_info) game_info = *(GameInfo *)stack->rdx; std::stringstream num; num << std::uppercase << std::hex << std::setw(16) << std::setfill('0') << game_info.id; ConsoleOutput("%s %s %s", game_info.name.c_str(), num.str().c_str(), game_info.version.c_str()); }; return NewHook(hp, "yuzuGameInfo"); } return false; } bool yuzu::attach_function() { Hook_Network_RoomMember_SendGameInfo(); ConsoleOutput("[Compatibility] Yuzu 1616+"); auto DoJitPtr = getDoJitAddress(); if (DoJitPtr == 0) return false; spDefault.jittype = JITTYPE::YUZU; spDefault.minAddress = 0; spDefault.maxAddress = -1; ConsoleOutput("DoJitPtr %p", DoJitPtr); HookParam hp; hp.address = DoJitPtr; hp.text_fun = [](hook_stack *stack, HookParam *hp, uintptr_t *data, uintptr_t *split, size_t *len) { auto descriptor = *argidx(stack, idxDescriptor + 1); // r8 auto entrypoint = *argidx(stack, idxEntrypoint + 1); // r9 auto em_address = *(uintptr_t *)descriptor; if (!entrypoint) return; jitaddraddr(em_address, entrypoint, JITTYPE::YUZU); [&]() { if (emfunctionhooks.find(em_address) == emfunctionhooks.end()) return; auto op = emfunctionhooks.at(em_address); if (!(checkiscurrentgame(op))) return; HookParam hpinternal; hpinternal.address = entrypoint; hpinternal.emu_addr = em_address; // 用于生成hcode hpinternal.type = NO_CONTEXT | BREAK_POINT | op.type; if (!(op.type & USING_CHAR)) hpinternal.type |= USING_STRING; hpinternal.text_fun = (decltype(hpinternal.text_fun))op.hookfunc; hpinternal.filter_fun = (decltype(hpinternal.filter_fun))op.filterfun; hpinternal.argidx = op.argidx; hpinternal.padding = op.padding; hpinternal.jittype = JITTYPE::YUZU; NewHook(hpinternal, op._id); }(); delayinsertNewHook(em_address); }; return NewHook(hp, "YuzuDoJit"); } namespace { int readu8(BYTE *addr) { int numBytes = 0; auto firstByte = *addr; if (firstByte <= 0x7F) { numBytes = 1; } else if ((firstByte & 0xE0) == 0xC0) { numBytes = 2; } else if ((firstByte & 0xF0) == 0xE0) { numBytes = 3; } else if ((firstByte & 0xF8) == 0xF0) { numBytes = 4; } return numBytes; } void T010012A017F18000(hook_stack *stack, HookParam *hp, uintptr_t *data, uintptr_t *split, size_t *len) { auto address = YUZU::emu_arg(stack)[2]; std::string s, bottom; uint32_t c; while (true) { c = *(BYTE *)(address); if (c == 0) break; if (c >= 0x20) { auto l = readu8((BYTE *)address); s += std::string((char *)address, l); address += l; } else { address += 1; if (c == 1) { bottom = ""; while (true) { auto l = readu8((BYTE *)address); auto ss = std::string((char *)address, l); address += l; if (ss[0] < 0xa) break; bottom += ss; s += ss; } } else if (c == 3) { while (true) { auto l = readu8((BYTE *)address); auto ss = std::string((char *)address, l); address += l; if (ss[0] < 0xa) break; } } else if (c == 7) { address += 1; } else if (c == 0xa) { return; } else if (c == 0xd) { c = *(uint32_t *)address; auto count = c & 0xFF; c = c & 0xFFFFFF00; if (c == 0x0692c500) { for (int _ = 0; _ < count; _++) s += '-'; address += 4; } } } } write_string_new(data, len, s); } template void ReadTextAndLenDW(hook_stack *stack, HookParam *hp, uintptr_t *data, uintptr_t *split, size_t *len) { auto address = YUZU::emu_arg(stack)[index]; *len = (*(DWORD *)(address + 0x10)) * 2; *data = address + 0x14; } template void ReadTextAndLenW(hook_stack *stack, HookParam *hp, uintptr_t *data, uintptr_t *split, size_t *len) { auto address = YUZU::emu_arg(stack)[index]; *len = (*(WORD *)(address + 0x10)) * 2; *data = address + 0x14; } template void mages_readstring(hook_stack *stack, HookParam *hp, uintptr_t *data, uintptr_t *split, size_t *len) { auto s = mages::readString(YUZU::emu_arg(stack)[0], idx); write_string_new(data, len, s); } bool F0100A3A00CC7E000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); std::wregex pattern1(L"^`([^@]+)."); s = std::regex_replace(s, pattern1, L"$1: "); s = std::regex_replace(s, std::wregex(L"\\$[A-Z]\\d*(,\\d*)*"), L""); std::wregex pattern2(L"\\$\\[([^$]+)..([^$]+).."); s = std::regex_replace(s, pattern2, L"$1"); return write_string_overwrite(data, len, s); } bool F010045C0109F2000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); s = std::regex_replace(s, std::regex("#[^\\]]*\\]"), ""); s = std::regex_replace(s, std::regex("#[^\\n]*\\n"), ""); s = std::regex_replace(s, std::regex(u8" "), ""); s = std::regex_replace(s, std::regex(u8"Save[\\s\\S]*データ"), ""); return write_string_overwrite(data, len, s); } bool F0100A1E00BFEA000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); s = std::regex_replace(s, std::wregex(L"[\\s]"), L""); s = std::regex_replace(s, std::wregex(L"(.+? \")"), L""); s = std::regex_replace(s, std::wregex(L"(\",.*)"), L""); s = std::regex_replace(s, std::wregex(L"(\" .*)"), L""); return write_string_overwrite(data, len, s); } bool F0100A1200CA3C000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); s = std::regex_replace(s, std::wregex(L"\\$d"), L"\n"); s = std::regex_replace(s, std::wregex(L"_"), L" "); s = std::regex_replace(s, std::wregex(L"@"), L" "); s = std::regex_replace(s, std::wregex(L"\\[([^\\/\\]]+)\\/[^\\/\\]]+\\]"), L"$1"); s = std::regex_replace(s, std::wregex(L"[~^$❝.❞'?,(-)!—:;-❛ ❜]"), L""); s = std::regex_replace(s, std::wregex(L"[A-Za-z0-9]"), L""); s = std::regex_replace(s, std::wregex(L"^\\s+"), L""); while (std::regex_search(s, std::wregex(L"^\\s*$"))) { s = std::regex_replace(s, std::wregex(L"^\\s*$"), L""); } return write_string_overwrite(data, len, s); } bool F0100F6A00A684000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); std::regex regex("(?=@.)"); std::sregex_token_iterator it(s.begin(), s.end(), regex, -1); std::sregex_token_iterator end; std::vector parts(it, end); s = ""; for (auto part : parts) { if (startWith(part, "@") == false) { s += part; continue; } std::string tag = part.substr(0, 2); std::string content = part.substr(2); if (tag == "@r") { if (s == "") s = content; else s += '\n' + content; } else if (tag == "@u" || tag == "@v" || tag == "@w" || tag == "@o" || tag == "@a" || tag == "@z" || tag == "@c" || tag == "@s") { auto splited = strSplit(content, "."); if (splited.size() == 2) s += splited[1]; } else if (tag == "@b") { } else { s += content; } } static auto katakanaMap = std::map{ {L"「", L"「"}, {L"」", L"」"}, {L"ァ", L"ぁ"}, {L"ィ", L"ぃ"}, {L"ゥ", L"ぅ"}, {L"ェ", L"ぇ"}, {L"ォ", L"ぉ"}, {L"ャ", L"ゃ"}, {L"ュ", L"ゅ"}, {L"ョ", L"ょ"}, {L"ア", L"あ"}, {L"イ", L"い"}, {L"ウ", L"う"}, {L"エ", L"え"}, {L"オ", L"お"}, {L"カ", L"か"}, {L"キ", L"き"}, {L"ク", L"く"}, {L"ケ", L"け"}, {L"コ", L"こ"}, {L"サ", L"さ"}, {L"シ", L"し"}, {L"ス", L"す"}, {L"セ", L"せ"}, {L"ソ", L"そ"}, {L"タ", L"た"}, {L"チ", L"ち"}, {L"ツ", L"つ"}, {L"テ", L"て"}, {L"ト", L"と"}, {L"ナ", L"な"}, {L"ニ", L"に"}, {L"ヌ", L"ぬ"}, {L"ネ", L"ね"}, {L"ノ", L"の"}, {L"ハ", L"は"}, {L"ヒ", L"ひ"}, {L"フ", L"ふ"}, {L"ヘ", L"へ"}, {L"ホ", L"ほ"}, {L"マ", L"ま"}, {L"ミ", L"み"}, {L"ム", L"む"}, {L"メ", L"め"}, {L"モ", L"も"}, {L"ヤ", L"や"}, {L"ユ", L"ゆ"}, {L"ヨ", L"よ"}, {L"ラ", L"ら"}, {L"リ", L"り"}, {L"ル", L"る"}, {L"レ", L"れ"}, {L"ロ", L"ろ"}, {L"ワ", L"わ"}, {L"ヲ", L"を"}, {L"ン", L"ん"}, {L"ー", L"ー"}, {L"ッ", L"っ"}, {L"、", L"、"}, {L"゚", L"?"}, {L"゙", L"!"}, {L"・", L"…"}, {L"?", L" "}, {L"。", L"。"}, {L"\uF8F0", L""}, {L"\uFFFD", L""} // invalid (shift_jis A0 <=> EF A3 B0) | FF FD - F8 F0) }; auto remap = [](std::string s) { std::wstring result; auto ws = StringToWideString(s, 932).value(); for (auto _c : ws) { std::wstring c; c.push_back(_c); if (katakanaMap.find(c) != katakanaMap.end()) { result += katakanaMap[c]; } else result += c; } return WideStringToString(result, 932); }; return write_string_overwrite(data, len, remap(s)); } bool F01006590155AC000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); std::regex regex("(?=@.)"); std::sregex_token_iterator it(s.begin(), s.end(), regex, -1); std::sregex_token_iterator end; std::vector parts(it, end); s = ""; int counter = 0; while (counter < parts.size()) { std::string part = parts[counter]; if (part[0] != '@') { s += part; counter++; continue; } std::string tag = part.substr(0, 2); std::string content = part.substr(2); if (tag == "@s" || tag == "@t") { s += content.substr(4); counter++; continue; } else if (tag == "@m") { s += content.substr(2); counter++; continue; } else if (tag == "@n") { s += '\n' + content; counter++; continue; } else if (tag == "@b" || tag == "@a" || tag == "@p" || tag == "@k") { s += content; counter++; continue; } else if (tag == "@v" || tag == "@h") { std::regex regex("[\\w_-]+"); s += std::regex_replace(content, regex, ""); counter++; continue; } else if (tag == "@r") { s += content + parts[counter + 2].substr(1); counter += 3; continue; } else if (tag == "@I") { if (content == "@" || parts[counter + 1].substr(0, 2) == "@r") { counter++; continue; } std::regex regex(u8"[\\d+─]"); s += std::regex_replace(content, regex, ""); counter += 3; continue; } else { s += content; counter++; continue; } } return write_string_overwrite(data, len, s); } bool F01000200194AE000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); static std::string readString_savedSentence = ""; static bool readString_playerNameFlag = false; static std::string readString_playerName = u8"ラピス"; std::regex regex("(?=@.)"); std::sregex_token_iterator it(s.begin(), s.end(), regex, -1); std::sregex_token_iterator end; std::vector parts(it, end); s = ""; size_t counter = 0; while (counter < parts.size()) { const std::string &part = parts[counter]; if (part.empty() || part[0] != '@') { s += part; counter++; continue; } std::string tag = part.substr(0, 2); std::string content = part.substr(2); if (tag == "@*") { if (content.find("name") == 0) { if (readString_playerName == u8"ラピス") { s += content.substr(4) + readString_playerName + parts[counter + 4].substr(1); } else { s += content.substr(4) + parts[counter + 3].substr(1) + parts[counter + 4].substr(1); } counter += 5; continue; } } else if (tag == "@s" || tag == "@t") { s += content.substr(4); counter++; continue; } else if (tag == "@m") { s += content.substr(2); counter++; continue; } else if (tag == "@u") { readString_playerNameFlag = true; readString_savedSentence = ""; counter++; return write_string_overwrite(data, len, ""); } else if (tag == "@n" || tag == "@b" || tag == "@a" || tag == "@p" || tag == "@k") { s += content; counter++; continue; } else if (tag == "@v" || tag == "@h") { std::regex regex("[\\w_-]+"); s += std::regex_replace(content, regex, ""); counter++; continue; } else if (tag == "@r") { s += content + parts[counter + 2].substr(1); counter += 3; continue; } else if (tag == "@I") { if (content == "@" || parts[counter + 1].substr(0, 2) == "@r") { counter++; continue; } std::regex regex(u8"[\\d+─]"); s += std::regex_replace(content, regex, ""); counter += 3; continue; } else { s += content; counter++; continue; } } if (!readString_playerNameFlag) { ; } else if (readString_savedSentence.empty()) { readString_savedSentence = s; s = ""; } else { std::string savedSentence = readString_savedSentence; readString_playerNameFlag = false; readString_savedSentence = ""; readString_playerName = s; s = s + "\n" + savedSentence; } return write_string_overwrite(data, len, s); } bool F0100EA001A626000(void *data, size_t *len, HookParam *hp) { auto s = utf32_to_utf16((uint32_t *)data, *len / 4); if (s == L"  ") { return false; } s = std::regex_replace(s, std::wregex(L"\n+"), L" "); s = std::regex_replace(s, std::wregex(L"\\$\\{FirstName\\}"), L"ナーヤ"); if (startWith(s, L"#T")) { s = std::regex_replace(s, std::wregex(L"#T2[^#]+"), L""); s = std::regex_replace(s, std::wregex(L"#T\\d"), L""); } auto u32 = utf16_to_utf32(s.c_str(), s.size()); return write_string_overwrite(data, len, u32); } bool F010093800DB1C000(void *data, size_t *len, HookParam *hp) { auto s = utf32_to_utf16((uint32_t *)data, *len / 4); s = std::regex_replace(s, std::wregex(L"\\n+"), L" "); s = std::regex_replace(s, std::wregex(L"\\$\\{FirstName\\}"), L"シリーン"); if (startWith(s, L"#T")) { s = std::regex_replace(s, std::wregex(L"\\#T2[^#]+"), L""); s = std::regex_replace(s, std::wregex(L"\\#T\\d"), L""); } auto u32 = utf16_to_utf32(s.c_str(), s.size()); return write_string_overwrite(data, len, u32); } bool F0100F7E00DFC8000(void *data, size_t *len, HookParam *hp) { auto s = utf32_to_utf16((uint32_t *)data, *len / 4); s = std::regex_replace(s, std::wregex(L"[\\s]"), L" "); s = std::regex_replace(s, std::wregex(L"#KW"), L""); s = std::regex_replace(s, std::wregex(L"#C\\(TR,0xff0000ff\\)"), L""); s = std::regex_replace(s, std::wregex(L"#P\\(.*\\)"), L""); auto u32 = utf16_to_utf32(s.c_str(), s.size()); return write_string_overwrite(data, len, u32); } bool F0100982015606000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); s = std::regex_replace(s, std::wregex(L"\\n+|(\\\\n)+"), L" "); return write_string_overwrite(data, len, s); } bool F0100C4E013E5E000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); s = std::regex_replace(s, std::wregex(L"\\\\n"), L" "); return write_string_overwrite(data, len, s); } bool F010001D015260000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); if (startWith(s, "#Key")) return false; strReplace(s, "#n", "\n"); return write_string_overwrite(data, len, s); } bool F0100E1E00E2AE000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); s = std::regex_replace(s, std::regex("#n"), "\n"); s = std::regex_replace(s, std::regex("[A-Za-z0-9]"), ""); s = std::regex_replace(s, std::regex("[~^,\\-\\[\\]#]"), ""); return write_string_overwrite(data, len, s); } bool F0100DE200C0DA000(void *data, size_t *len, HookParam *hp) { StringReplacer((char *)data, len, "#n", 2, " ", 1); StringReplacer((char *)data, len, "\n", 1, " ", 1); return true; } bool F0100AEC013DDA000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); static std::string ss; if (ss == s) return false; ss = s; return true; } bool F0100F7801B5DC000(void *data, size_t *len, HookParam *hp) { if (!all_ascii((wchar_t *)data)) return false; // chaos on first load. StringReplacer((wchar_t *)data, len, L"
", 4, L"\n", 1); return true; } bool F01006CC015ECA000(void *data, size_t *len, HookParam *hp) { StringCharReplacer((wchar_t *)data, len, L"#
", 5, L'\n'); return true; } bool F0100925014864000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); s = std::regex_replace(s, std::regex("(#n)+"), " "); s = std::regex_replace(s, std::regex("(#[A-Za-z]+\\[(\\d*[.])?\\d+\\])+"), ""); return write_string_overwrite(data, len, s); } bool F0100936018EB4000(void *data, size_t *len, HookParam *hp) { auto s = utf32_to_utf16((uint32_t *)data, *len / 4); s = std::regex_replace(s, std::wregex(L"<[^>]+>"), L""); s = std::regex_replace(s, std::wregex(L"\n+"), L" "); auto u32 = utf16_to_utf32(s.c_str(), s.size()); return write_string_overwrite(data, len, u32); } template void T01000BB01CB8A000(hook_stack *stack, HookParam *hp, uintptr_t *data, uintptr_t *split, size_t *len) { auto address = YUZU::emu_arg(stack)[index]; std::wstring s; while (auto c = *(uint16_t *)address) { if (c == 0x0 || c == 0xcccc) { break; } else if (c == 0xa || c == 0xd) ; else { s += c; } address += 4; } write_string_new(data, len, s); } std::unordered_map T0100DEF01D0C6000_dict; void T0100DEF01D0C6000_2(hook_stack *stack, HookParam *hp, uintptr_t *data, uintptr_t *split, size_t *len) { auto address1 = YUZU::emu_arg(stack)[0] + 0x14; auto address2 = YUZU::emu_arg(stack)[1] + 0x14; auto word = std::wstring((wchar_t *)address1); auto meaning = std::wstring((wchar_t *)address2); T0100DEF01D0C6000_dict[word] = meaning; } void T010061300DF48000(hook_stack *stack, HookParam *hp, uintptr_t *data, uintptr_t *split, size_t *len) { auto address1 = YUZU::emu_arg(stack)[0]; auto address2 = YUZU::emu_arg(stack)[1]; auto word = std::string((char *)address1); word = std::regex_replace(word, std::regex(R"(\w+\.\w+)"), ""); while (!(*(BYTE *)address2)) address2 += 1; auto meaning = std::string((char *)address2); meaning = std::regex_replace(meaning, std::regex(R"(%\w+)"), ""); write_string_new(data, len, word + '\n' + meaning); } template void T0100B0100E26C000(hook_stack *stack, HookParam *hp, uintptr_t *data, uintptr_t *split, size_t *len) { auto address = YUZU::emu_arg(stack)[index]; if (type == 2) address += 0xA; auto length = (*(DWORD *)(address + 0x10)) * 2; *len = length; *data = address + 0x14; } bool F010045C014650000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); std::regex pattern("(@(\\/)?[a-zA-Z#](\\(\\d+\\))?|)[*<>]+"); s = std::regex_replace(s, pattern, ""); return write_string_overwrite(data, len, s); } bool F0100AB100E2FA000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); s = std::regex_replace(s, std::wregex(LR"(\n)"), L""); s = std::regex_replace(s, std::wregex(LR"(\u3000)"), L""); s = std::regex_replace(s, std::wregex(LR"(<[^>]*>)"), L""); return write_string_overwrite(data, len, s); } bool F01008C0016544000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); s = std::regex_replace(s, std::wregex(L"<[^>]+>"), L" "); return write_string_overwrite(data, len, s); } bool F0100FB7019ADE000(void *data, size_t *len, HookParam *hp) { static int idx = 0; return ((++idx) % 2 == 1); } bool F01006F000B056000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); s = std::regex_replace(s, std::wregex(L"\\[.*?\\]"), L" "); return write_string_overwrite(data, len, s); } bool F0100068019996000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); s = std::regex_replace(s, std::regex("%N"), "\n"); return write_string_overwrite(data, len, s); } bool F0100ADC014DA0000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); std::wregex symbolRegex(L"[~^$(,)]"); std::wregex alphanumericRegex(L"[A-Za-z0-9]"); std::wregex atRegex(L"@"); std::wregex leadingSpaceRegex(L"^\\s+"); s = std::regex_replace(s, symbolRegex, L""); s = std::regex_replace(s, alphanumericRegex, L""); s = std::regex_replace(s, atRegex, L" "); s = std::regex_replace(s, leadingSpaceRegex, L""); return write_string_overwrite(data, len, s); } bool F0100AFA01750C000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); std::regex newlineRegex("(\\\\n)+"); std::regex specialCharsRegex("\\\\d$|^\\@[a-z]+|#.*?#|\\$"); s = std::regex_replace(s, newlineRegex, " "); s = std::regex_replace(s, specialCharsRegex, ""); return write_string_overwrite(data, len, s); } bool F0100C1E0102B8000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); s = std::regex_replace(s, std::regex("#N"), "\n"); std::regex colorRegex("#Color\\[[\\d]+\\]"); s = std::regex_replace(s, colorRegex, ""); return write_string_overwrite(data, len, s); } bool F0100BD700E648000(void *data, size_t *len, HookParam *hp) { StringReplacer((char *)data, len, "*", 1, " ", 1); StringReplacer((char *)data, len, u8"ゞ", sizeof(u8"ゞ"), u8"!?", sizeof(u8"!?")); return true; } bool F0100D9500A0F6000(void *data, size_t *len, HookParam *hp) { StringReplacer((char *)data, len, u8"㊤", sizeof(u8"㊤"), u8"―", sizeof(u8"―")); StringReplacer((char *)data, len, u8"㊥", sizeof(u8"㊥"), u8"―", sizeof(u8"―")); StringReplacer((char *)data, len, u8"^㌻", sizeof(u8"^㌻"), u8" ", sizeof(u8" ")); // \n return true; } bool F0100DA201E0DA000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); s = std::regex_replace(s, std::wregex(L"[\\s]"), L""); return write_string_overwrite(data, len, s); } bool F01002C0008E52000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); s = std::regex_replace(s, std::regex("(YUR)"), u8"ユーリ"); s = std::regex_replace(s, std::regex("(FRE)"), u8"フレン"); s = std::regex_replace(s, std::regex("(RAP)"), u8"ラピード"); s = std::regex_replace(s, std::regex("(EST|ESU)"), u8"エステル"); s = std::regex_replace(s, std::regex("(KAR)"), u8"カロル"); s = std::regex_replace(s, std::regex("(RIT)"), u8"リタ"); s = std::regex_replace(s, std::regex("(RAV|REI)"), u8"レイヴン"); s = std::regex_replace(s, std::regex("(JUD)"), u8"ジュディス"); s = std::regex_replace(s, std::regex("(PAT)"), u8"パティ"); s = std::regex_replace(s, std::regex("(DUK|DYU)"), u8"デューク"); s = std::regex_replace(s, std::regex("[A-Za-z0-9]"), ""); s = std::regex_replace(s, std::regex("[,(-)_]"), ""); s = std::regex_replace(s, std::regex("^\\s+"), ""); while (std::regex_search(s, std::regex("^\\s*$"))) { s = std::regex_replace(s, std::regex("^\\s*$"), ""); } return write_string_overwrite(data, len, s); } bool F01005940182EC000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); std::wregex whitespaceRegex(L"\\s"); s = std::regex_replace(s, whitespaceRegex, L""); std::wregex colorRegex(L"(.*?)<\\/color>"); s = std::regex_replace(s, colorRegex, L"$1"); return write_string_overwrite(data, len, s); } void T01005940182EC000(hook_stack *stack, HookParam *hp, uintptr_t *data, uintptr_t *split, size_t *len) { auto address = YUZU::emu_arg(stack)[0]; *data = address + 0x14; *len = wcslen((wchar_t *)*data) * 2; } bool F0100B0601852A000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); static std::wstring last; if (last == s) return false; last = s; return true; } bool F010027100C79A000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); static std::string last; if (last == s) return false; last = s; return true; } bool F0100B0C016164000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); std::wregex htmlTagsPattern(L"<[^>]*>"); std::wregex lettersAndNumbersPattern(L"[A-Za-z0-9]"); s = std::regex_replace(s, htmlTagsPattern, L""); s = std::regex_replace(s, lettersAndNumbersPattern, L""); static std::wstring last; if (last == s) return false; last = s; return write_string_overwrite(data, len, s); } bool F010043B013C5C000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); std::wregex htmlTagsPattern(L"<[^>]*>"); s = std::regex_replace(s, htmlTagsPattern, L""); static std::wstring last; if (last == s) return false; last = s; return write_string_overwrite(data, len, s); } bool F010055D009F78000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); std::regex pattern3("\\d+"); s = std::regex_replace(s, pattern3, ""); static std::string last; if (last == s) return false; last = s; return write_string_overwrite(data, len, s); } bool F010080C01AA22000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); std::regex furiganaRegex("#\\d+R.*?#"); s = std::regex_replace(s, furiganaRegex, ""); std::regex lettersNumbersRegex("[A-Za-z0-9]"); s = std::regex_replace(s, lettersNumbersRegex, ""); std::regex symbolsRegex(u8"[().%,_!#©&:?/]"); s = std::regex_replace(s, symbolsRegex, ""); return write_string_overwrite(data, len, s); } bool F0100CB700D438000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); std::regex furiganaRegex("(.*?)<\\/RB>(.*?)<\\/RT><\\/RUBY>"); s = std::regex_replace(s, furiganaRegex, "$1"); std::regex htmlTagRegex("<[^>]*>"); s = std::regex_replace(s, htmlTagRegex, ""); static std::string last; if (last == s) return false; last = s; return write_string_overwrite(data, len, s); } bool F01005C301AC5E000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); s = std::regex_replace(s, std::regex(".*_.*_.*"), ""); // SIR_C01_016,ERU_C00_000 s = std::regex_replace(s, std::regex("\\.mp4"), ""); s = std::regex_replace(s, std::regex("@v"), ""); s = std::regex_replace(s, std::regex("@n"), "\n"); return write_string_overwrite(data, len, s); } bool F0100815019488000_text(void *data, size_t *len, HookParam *hp) { //@n@vaoi_s01_0110「うんうん、そうかも!」 auto s = std::string((char *)data, *len); s = std::regex_replace(s, std::regex("@.*_.*_\\d+"), ""); s = std::regex_replace(s, std::regex("@n"), ""); return write_string_overwrite(data, len, s); } bool F0100815019488000_name(void *data, size_t *len, HookParam *hp) { // あおい@n@vaoi_s01_0110「うんうん、そうかも!」 auto s = std::string((char *)data, *len); if (s.find("@n") == s.npos) return false; s = std::regex_replace(s, std::regex("(.*)@n.*"), "$1"); return write_string_overwrite(data, len, s); } bool F010072000BD32000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); std::regex lineBreakRegex("\\[~\\]"); s = std::regex_replace(s, lineBreakRegex, "\n"); std::regex romRegex("rom:[\\s\\S]*$"); s = std::regex_replace(s, romRegex, ""); std::regex furiganaRegex("\\[[\\w\\d]*\\[[\\w\\d]*\\].*?\\[\\/\\[\\w\\d]*\\]\\]"); s = std::regex_replace(s, furiganaRegex, ""); std::regex bracketsRegex("\\[.*?\\]"); s = std::regex_replace(s, bracketsRegex, ""); static std::string last; if (last == s) return false; last = s; return write_string_overwrite(data, len, s); } bool F01009B50139A8000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); std::wregex htmlTagRegex(L"<[^>]*>"); s = std::regex_replace(s, htmlTagRegex, L""); std::wregex hoursRegex(L"\\b\\d{2}:\\d{2}\\b"); s = std::regex_replace(s, hoursRegex, L""); auto _ = L"^(?:スキップ|むしる|取り出す|話す|選ぶ|ならびかえ|閉じる|やめる|undefined|決定|ボロのクワ|拾う)$(\\r?\\n|\\r)?"; while (std::regex_search(s, std::wregex(_))) { s = std::regex_replace(s, std::wregex(_), L""); } while (std::regex_search(s, std::wregex(L"^\\s*$"))) { s = std::regex_replace(s, std::wregex(L"^\\s*$"), L""); } static std::wstring last; if (last == s) return false; last = s; return write_string_overwrite(data, len, s); } bool F010032300C562000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); static std::string last; s = std::regex_replace(s, std::regex(R"((#Ruby\[)([^,]+),(#\w+\[.\])?(.+?]))"), "$2"); s = std::regex_replace(s, std::regex(R"(#\w+(\[.+?\])?)"), ""); s = std::regex_replace(s, std::regex(u8" "), ""); if (last == s) return false; last = s; return write_string_overwrite(data, len, s); } bool F010088B01A8FC000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); static std::string last; s = std::regex_replace(s, std::regex(R"(#\w+(\[.+?\])?)"), ""); s = std::regex_replace(s, std::regex(u8" "), ""); if (last == s) return false; last = s; return write_string_overwrite(data, len, s); } bool FF010061300DF48000_2(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); static std::string last; if (last == s) return false; last = s; return true; } bool F0100DEF01D0C6000_2(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); static std::wstring last; if (last == s) return false; last = s; if (T0100DEF01D0C6000_dict.find(s) == T0100DEF01D0C6000_dict.end()) return false; s += L'\n' + T0100DEF01D0C6000_dict[s]; return write_string_overwrite(data, len, s); } bool F0100CEF0152DE000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); s = std::regex_replace(s, std::regex(u8" "), ""); s = std::regex_replace(s, std::regex(R"(#n)"), ""); s = std::regex_replace(s, std::regex(R"(#\w.+?])"), ""); return write_string_overwrite(data, len, s); } bool F010061300DF48000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); s = std::regex_replace(s, std::regex(R"(%\w+)"), ""); s = std::regex_replace(s, std::regex(u8" "), ""); return write_string_overwrite(data, len, s); } bool F0100E4000F616000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); auto ws = StringToWideString(s, 932).value(); ws = std::regex_replace(ws, std::wregex(LR"(\\\w)"), L""); s = WideStringToString(ws, 932); return write_string_overwrite(data, len, s); } bool F01005A401D766000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); s = std::regex_replace(s, std::regex(R"(\\n)"), ""); s = std::regex_replace(s, std::regex(R"(\|(.*?)\|(.*?)\|)"), "$1"); return write_string_overwrite(data, len, s); } bool F010027300A660000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); s = std::regex_replace(s, std::regex(u8R"(#n( )*)"), ""); return write_string_overwrite(data, len, s); } bool F0100FA10185B0000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); s = std::regex_replace(s, std::regex(R"(#.+?])"), ""); return write_string_overwrite(data, len, s); } bool F010095E01581C000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); s = std::regex_replace(s, std::regex(R"(\n)"), ""); s = std::regex_replace(s, std::regex(R"(\\\w+)"), ""); return write_string_overwrite(data, len, s); } bool F0100943010310000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); strReplace(s, u8"❞", "\""); strReplace(s, u8"❝", "\""); s = std::regex_replace(s, std::regex("@(.*?)@"), "$1\n"); return write_string_overwrite(data, len, s); } template bool F010027401A2A2000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); std::wregex dicRegex(L"\\[dic.*?text="); s = std::regex_replace(s, dicRegex, L""); std::wregex rubyRegex(L"\\[|'.*?\\]"); s = std::regex_replace(s, rubyRegex, L""); std::wregex closingBraceRegex(L"\\]"); s = std::regex_replace(s, closingBraceRegex, L""); if (choice) { std::wregex whitespaceRegex(LR"([^\S\n]| )"); s = std::regex_replace(s, whitespaceRegex, L""); } else { std::wregex whitespaceRegex(L"\\s| "); s = std::regex_replace(s, whitespaceRegex, L""); } return write_string_overwrite(data, len, s); } bool F010027401A2A2000_2(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); static std::wstring last; auto x = endWith(last, s); last = s; if (x) return false; return F010027401A2A2000(data, len, hp); } bool F0100BD4014D8C000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); s = std::regex_replace(s, std::wregex(L"<[^>]*>"), L""); s = std::regex_replace(s, std::wregex(L".*?_"), L""); static std::wstring last; if (last == s) return false; last = s; return write_string_overwrite(data, len, s); } bool F01007FD00DB20000(void *data, size_t *len, HookParam *hp) { auto s = utf32_to_utf16((uint32_t *)data, *len / 4); s = std::regex_replace(s, std::wregex(LR"(\n+)"), L" "); s = std::regex_replace(s, std::wregex(LR"(\#T1[^#]+)"), L""); s = std::regex_replace(s, std::wregex(LR"(\#T\d)"), L""); if (s == L"  ") return false; auto u32 = utf16_to_utf32(s.c_str(), s.size()); return write_string_overwrite(data, len, u32); } bool F010021D01474E000(void *data, size_t *len, HookParam *hp) { auto s = utf32_to_utf16((uint32_t *)data, *len / 4); s = std::regex_replace(s, std::wregex(LR"(#\w\(.+?\)|#\w{2})"), L""); s = std::regex_replace(s, std::wregex(LR"(\n)"), L""); s = std::regex_replace(s, std::wregex(LR"(\u3000)"), L""); static std::wstring last; if (last == s) return false; last = s; auto u32 = utf16_to_utf32(s.c_str(), s.size()); return write_string_overwrite(data, len, u32); } bool F010021D01474E000_2(void *data, size_t *len, HookParam *hp) { auto s = utf32_to_utf16((uint32_t *)data, *len / 4); s = std::regex_replace(s, std::wregex(LR"(\u3000)"), L""); s = std::regex_replace(s, std::wregex(LR"(#\w.+?\)|#\w+)"), L""); static std::wstring last; if (last == s) return false; last = s; auto u32 = utf16_to_utf32(s.c_str(), s.size()); return write_string_overwrite(data, len, u32); } bool F01002C00177AE000(void *data, size_t *len, HookParam *hp) { auto s = utf32_to_utf16((uint32_t *)data, *len / 4); s = std::regex_replace(s, std::wregex(LR"(\u3000)"), L""); s = std::regex_replace(s, std::wregex(LR"(\n)"), L""); static std::wstring last; if (last == s) return false; last = s; auto u32 = utf16_to_utf32(s.c_str(), s.size()); return write_string_overwrite(data, len, u32); } bool F0100EA100DF92000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); static std::string last; if (last.find(s) != last.npos) return false; last = s; s = std::regex_replace(s, std::regex(R"([~^$(,)R])"), ""); s = std::regex_replace(s, std::regex(R"(\\n)"), ""); return write_string_overwrite(data, len, s); } template bool F010079200C26E000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); s = std::regex_replace(s, std::regex(R"(#n)"), ""); static std::string last; if (last == s) return false; last = s; return write_string_overwrite(data, len, s); } bool F010037500DF38000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); s = std::regex_replace(s, std::wregex(LR"(\n)"), L""); static std::wstring last; if (last == s) return false; last = s; return write_string_overwrite(data, len, s); } bool F0100C7400CFB4000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); s = std::regex_replace(s, std::wregex(L"\\d"), L""); s = std::regex_replace(s, std::wregex(L"<[^>]*>"), L""); while (std::regex_search(s, std::wregex(L"^\\s*$"))) { s = std::regex_replace(s, std::wregex(L"^\\s*$"), L""); } static std::wstring last; if (last == s) return false; last = s; return write_string_overwrite(data, len, s); } bool F0100CB9018F5A000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); s = std::regex_replace(s, std::wregex(L"<[^>]*>"), L""); s = std::regex_replace(s, std::wregex(L"\\{([^{}]+):[^{}]+\\}"), L"$1"); return write_string_overwrite(data, len, s); } bool F010028D0148E6000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); s = std::regex_replace(s, std::regex("{|\\/.*?}|\\[.*?]", std::regex_constants::grep), ""); s = std::regex_replace(s, std::regex("(\\\\\\\\c|\\\\\\\\n)+"), " "); s = std::regex_replace(s, std::regex(",.*$"), " "); return write_string_overwrite(data, len, s); } bool F0100F4401940A000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); s = std::regex_replace(s, std::wregex(L"[\\r\\n]+"), L""); s = std::regex_replace(s, std::wregex(L"<[^>]+>|\\[\\[[^]]+\\]\\]"), L""); return write_string_overwrite(data, len, s); } bool F0100B5500CA0C000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); // std::regex pattern1("\\\\u0000+$"); std::regex pattern2("\\\\"); std::regex pattern3("\\$"); // s = std::regex_replace(s, pattern1, ""); s = std::regex_replace(s, pattern2, ""); s = std::regex_replace(s, pattern3, ""); return write_string_overwrite(data, len, s); } void T0100B5500CA0C000(hook_stack *stack, HookParam *hp, uintptr_t *data, uintptr_t *split, size_t *len) { auto address = YUZU::emu_arg(stack, hp->emu_addr)[6]; *data = address; *len = *(WORD *)(address - 2); } bool F0100A8401A0A8000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); std::wregex samePageNewLineRegex(L"[\r\n]+"); s = std::regex_replace(s, samePageNewLineRegex, L""); std::wregex newPageTextRegex(L"(<.+?>)+"); s = std::regex_replace(s, newPageTextRegex, L"\r\n"); strReplace(s, L"", L"(L)"); strReplace(s, L"", L"(ZL)"); strReplace(s, L"", L"(Y)"); strReplace(s, L"", L"(X)"); strReplace(s, L"", L"(A)"); strReplace(s, L"", L"(B)"); strReplace(s, L"", L"(+)"); strReplace(s, L"", L"(-)"); strReplace(s, L"", L"(DPAD_DOWN)"); strReplace(s, L"", L"(DPAD_LEFT)"); strReplace(s, L"", L"(LSTICK)"); strReplace(s, L"", L"(L3)"); return write_string_overwrite(data, len, s); } bool F0100BC0018138000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); std::wregex tagContentRegex(L"<[^>]*>([^<]*)<\\/[^>]*>"); s = std::regex_replace(s, tagContentRegex, L""); s = std::regex_replace(s, std::wregex(L""), L"L"); s = std::regex_replace(s, std::wregex(L""), L"R"); s = std::regex_replace(s, std::wregex(L""), L"A"); s = std::regex_replace(s, std::wregex(L""), L"B"); s = std::regex_replace(s, std::wregex(L""), L"X"); s = std::regex_replace(s, std::wregex(L""), L"Y"); s = std::regex_replace(s, std::wregex(L""), L"+"); s = std::regex_replace(s, std::wregex(L""), L"-"); s = std::regex_replace(s, std::wregex(L"<[^>]+>"), L""); return write_string_overwrite(data, len, s); } bool F0100D7800E9E0000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); s = std::regex_replace(s, std::wregex(L"[A-Za-z0-9]"), L""); s = std::regex_replace(s, std::wregex(L"<[^>]*>"), L""); s = std::regex_replace(s, std::wregex(L"^二十五字二.*(\r?\n|\r)?"), L""); s = std::regex_replace(s, std::wregex(L"^操作を割り当てる.*(\r?\n|\r)?"), L""); s = std::regex_replace(s, std::wregex(L"^上記アイコンが出.*(\r?\n|\r)?"), L""); s = std::regex_replace(s, std::wregex(L"[()~^,ö.!]"), L""); static std::wstring last; if (last == s) return false; last = s; return write_string_overwrite(data, len, s); } void TF0100AA1013B96000(hook_stack *stack, HookParam *hp, uintptr_t *data, uintptr_t *split, size_t *len) { auto ptr = (char *)*data; std::string collect; while (*ptr || *(ptr - 1)) ptr--; while (!(*ptr && *(ptr + 1))) ptr++; do { if (!(*ptr)) { ptr++; } else { collect += std::string(ptr); ptr += strlen(ptr); } } while (*ptr || *(ptr + 1)); strReplace(collect, "\x87\x85", "\x81\x5c"); strReplace(collect, "\x87\x86", "\x81\x5c"); strReplace(collect, "\x87\x87", "\x81\x5c"); strReplace(collect, "\n", ""); strReplace(collect, "\x81\x40", ""); return write_string_new(data, len, collect); } template void T0100CF400F7CE000(hook_stack *stack, HookParam *hp, uintptr_t *data, uintptr_t *split, size_t *len) { auto address = YUZU::emu_arg(stack)[idx]; std::string s; int i = 0; while (1) { auto c = *(BYTE *)(address + i); if (c == 0) break; if (c < 0x20 && c > 0x10) { auto command = *(BYTE *)(address + i + 1); if (command == 0x80) i += 3; else if (command == 0xb8) i += 4; else { auto sz = *(BYTE *)(address + i + 2); i += 3 + sz; } } else if (c == 0xaa) { i += 1; } else if (c == 0xff) { i += 0x30; } else { auto l = 1 + IsDBCSLeadByteEx(932, c); s += std::string((char *)(address + i), l); i += l; } } write_string_new(data, len, s); } void T0100DB300B996000(hook_stack *stack, HookParam *hp, uintptr_t *data, uintptr_t *split, size_t *len) { auto address = YUZU::emu_arg(stack)[8] + 1; std::string s; int i = 0; while (1) { auto c = *(BYTE *)(address + i); if (c == 0) break; if (c < 0x20 && c > 0x10) { auto sz = *(BYTE *)(address + i + 2); i += 3 + sz; } else { auto l = 1 + IsDBCSLeadByteEx(932, c); s += std::string((char *)(address + i), l); i += l; } } write_string_new(data, len, s); } bool F0100CBA014014000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); s = std::regex_replace(s, std::regex(u8"《.*?》"), ""); s = std::regex_replace(s, std::regex("<[^>]*>"), ""); return write_string_overwrite(data, len, s); } template bool F0100CC401A16C000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); s = std::regex_replace(s, std::regex("<[^>]*>"), ""); s = std::regex_replace(s, std::regex("\\d+"), ""); if (s == "") return false; static std::string last; if (last == s) return false; last = s; return write_string_overwrite(data, len, s); } bool F0100BDD01AAE4000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); s = std::regex_replace(s, std::regex("(#Ruby\\[)([^,]+).([^\\]]+)."), "$2"); s = std::regex_replace(s, std::regex("(#n)+"), " "); s = std::regex_replace(s, std::regex("(#[A-Za-z]+[(\\d*[.])?\\d+])+"), ""); return write_string_overwrite(data, len, s); } bool F0100C310110B4000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); s = std::regex_replace(s, std::regex("(#Ruby\\[)([^,]+).([^\\]]+)."), "$2"); s = std::regex_replace(s, std::regex("#Color\\[[\\d]+\\]"), ""); s = std::regex_replace(s, std::regex(u8"( #n)+"), "#n"); s = std::regex_replace(s, std::regex("#n+"), " "); return write_string_overwrite(data, len, s); } bool F010003F003A34000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); s = std::regex_replace(s, std::wregex(L"[\\s\\S]*$"), L""); s = std::regex_replace(s, std::wregex(L"\n+"), L" "); s = std::regex_replace(s, std::wregex(L"\\s"), L""); s = std::regex_replace(s, std::wregex(L"[＀븅]"), L""); return write_string_overwrite(data, len, s); } bool F01007B601C608000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); s = std::regex_replace(s, std::wregex(L"<[^>]*>"), L""); s = std::regex_replace(s, std::wregex(L"\\[.*?\\]"), L""); std::vector lines = strSplit(s, L"\n"); std::wstring result; for (const std::wstring &line : lines) { if (result.empty() == false) result += L"\n"; std::wregex commandRegex(L"^(?:メニュー|システム|Ver\\.)$(\\r?\\n|\\r)?"); s = std::regex_replace(s, commandRegex, L""); std::wregex emptyLineRegex(L"^\\s*$"); s = std::regex_replace(s, emptyLineRegex, L""); } static std::wstring last; if (last == s) return false; last = s; return write_string_overwrite(data, len, s); } bool F010046601125A000(void *data, size_t *len, HookParam *hp) { auto s = utf32_to_utf16((uint32_t *)data, *len / 4); s = std::regex_replace(s, std::wregex(L"(.+?).+?"), L"$1"); s = std::regex_replace(s, std::wregex(L"\n+"), L" "); auto u32 = utf16_to_utf32(s.c_str(), s.size()); return write_string_overwrite(data, len, u32); } bool F0100771013FA8000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); s = std::regex_replace(s, std::wregex(L"
"), L"\n"); s = std::regex_replace(s, std::wregex(L"^(\\s+)"), L""); return write_string_overwrite(data, len, s); } bool F0100556015CCC000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); std::regex rubiRegex("\\[[^\\]]+."); s = std::regex_replace(s, rubiRegex, ""); s = std::regex_replace(s, std::regex("\\\\k|\\\\x|%C|%B|%p-1;"), ""); std::regex colorRegex("#[0-9a-fA-F]+;([^%#]+)(%r)?"); s = std::regex_replace(s, colorRegex, "$1"); static std::set dump; if (dump.find(s) != dump.end()) return false; dump.insert(s); return write_string_overwrite(data, len, s); } template bool F0100CC80140F8000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); s = std::regex_replace(s, std::wregex(L"^(?:スキップ|メニュー|バックログ|ズームイン|ズームアウト|ガイド OFF|早送り|オート|人物情報|ユニット表示切替|カメラリセット|ガイド表示切替|ページ切替|閉じる|コマンド選択|詳細|シミュレーション|移動)$([\\r?\\n|\\r])?"), L""); s = std::regex_replace(s, std::wregex(L"[A-Za-z0-9]"), L""); s = std::regex_replace(s, std::wregex(L"[().%,_!#©&:?/]"), L""); while (std::regex_search(s, std::wregex(L"^\\s*$"))) { s = std::regex_replace(s, std::wregex(L"^\\s*$"), L""); } static std::wstring last; if (last == s) return false; last = s; return write_string_overwrite(data, len, s); } bool F0100D9A01BD86000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); s = std::regex_replace(s, std::wregex(L"[\\s]"), L""); s = std::regex_replace(s, std::wregex(L"\\\\n"), L""); return write_string_overwrite(data, len, s); } bool F010042300C4F6000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); s = std::regex_replace(s, std::wregex(L"[\\s]"), L""); s = std::regex_replace(s, std::wregex(L"(.+?/)"), L""); s = std::regex_replace(s, std::wregex(L"(\" .*)"), L""); s = std::regex_replace(s, std::wregex(L"^(.+?\")"), L""); return write_string_overwrite(data, len, s); } bool F010044800D2EC000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); s = std::regex_replace(s, std::wregex(L"\\n+"), L" "); s = std::regex_replace(s, std::wregex(L"\\"), L"???"); s = std::regex_replace(s, std::wregex(L"<.+?>"), L""); return write_string_overwrite(data, len, s); } template bool F010021300F69E000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); s = std::regex_replace(s, std::wregex(L"\\$[a-z]"), L""); s = std::regex_replace(s, std::wregex(L"@"), L""); static std::wstring last; if (last == s) return false; last = s; return write_string_overwrite(data, len, s); } bool F010050000705E000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); s = std::regex_replace(s, std::regex("\\s"), ""); s = std::regex_replace(s, std::regex("
"), "\n"); s = std::regex_replace(s, std::regex("<([^:>]+):[^>]+>"), "$1"); s = std::regex_replace(s, std::regex("<[^>]+>"), ""); return write_string_overwrite(data, len, s); } bool F01001B900C0E2000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); std::regex whitespaceRegex("\\s"); s = std::regex_replace(s, whitespaceRegex, ""); std::regex hashRegex("#[A-Za-z]+(\\[(\\d*\\.)?\\d+\\])+"); s = std::regex_replace(s, hashRegex, ""); std::regex hashLetterRegex("#[a-z]"); s = std::regex_replace(s, hashLetterRegex, ""); std::regex lowercaseRegex("[a-z]"); s = std::regex_replace(s, lowercaseRegex, ""); return write_string_overwrite(data, len, s); } bool F0100217014266000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); std::wregex htmlTagRegex(L"<[^>]*>"); s = std::regex_replace(s, htmlTagRegex, L""); std::wregex furiganaRegex(L"{([^{}]+):[^{}]+}"); s = std::regex_replace(s, furiganaRegex, L"$1"); while (std::regex_search(s, std::wregex(L"^\\s+"))) { s = std::regex_replace(s, std::wregex(L"^\\s+"), L""); } return write_string_overwrite(data, len, s); } bool F010007500F27C000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); std::wregex htmlTagRegex(L"<[^>]*>"); s = std::regex_replace(s, htmlTagRegex, L""); auto _ = L"^(?:決定|進む|ページ移動|ノート全体図|閉じる|もどる|セーブ中)$(\\r?\\n|\\r)?"; while (std::regex_search(s, std::wregex(_))) { s = std::regex_replace(s, std::wregex(_), L""); } while (std::regex_search(s, std::wregex(L"^\\s*$"))) { s = std::regex_replace(s, std::wregex(L"^\\s*$"), L""); } static std::wstring last; if (last == s) return false; last = s; return write_string_overwrite(data, len, s); } bool F0100874017BE2000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); s = std::regex_replace(s, std::wregex(L"\\n+|(\\\\n)+"), L" "); s = std::regex_replace(s, std::wregex(L"#n"), L""); return write_string_overwrite(data, len, s); } bool F010094601D910000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); s = std::regex_replace(s, std::wregex(L"\\<.*?\\>"), L""); s = std::regex_replace(s, std::wregex(L"\\[.*?\\]"), L""); s = std::regex_replace(s, std::wregex(L"\\s"), L""); return write_string_overwrite(data, len, s); } bool F010079201BD88000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); s = std::regex_replace(s, std::wregex(L"[\\s]"), L""); s = std::regex_replace(s, std::wregex(L"\\\\n"), L""); return write_string_overwrite(data, len, s); } bool F010086C00AF7C000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); s = std::regex_replace(s, std::regex("\\[([^\\]]+)\\/[^\\]]+\\]"), "$1"); s = std::regex_replace(s, std::regex("\\s+"), " "); s = std::regex_replace(s, std::regex("\\\\n"), " "); s = std::regex_replace(s, std::regex("<[^>]+>|\\[[^\\]]+\\]"), ""); return write_string_overwrite(data, len, s); } bool F010079C017B98000(void *data, size_t *len, HookParam *hp) { auto s = utf32_to_utf16((uint32_t *)data, *len / 4); s = std::regex_replace(s, std::wregex(L"[\\s]"), L""); s = std::regex_replace(s, std::wregex(L"#KW"), L""); s = std::regex_replace(s, std::wregex(L"#C\\(TR,0xff0000ff\\)"), L""); s = std::regex_replace(s, std::wregex(L"【SW】"), L""); s = std::regex_replace(s, std::wregex(L"【SP】"), L""); s = std::regex_replace(s, std::wregex(L"#P\\(.*\\)"), L""); auto u32 = utf16_to_utf32(s.c_str(), s.size()); return write_string_overwrite(data, len, u32); } bool F010061A01C1CE000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); s = std::regex_replace(s, std::wregex(L"[\\s]"), L""); s = std::regex_replace(s, std::wregex(L"sound"), L" "); return write_string_overwrite(data, len, s); } bool F0100F7401AA74000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); s = std::regex_replace(s, std::regex("[\\s]"), ""); s = std::regex_replace(s, std::regex("@[a-z]"), ""); s = std::regex_replace(s, std::regex("@[0-9]"), ""); return write_string_overwrite(data, len, s); } bool F010060301588A000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); static lru_cache cache(4); static std::string last; if (cache.touch(s)) return false; if (startWith(s, last)) { write_string_overwrite(data, len, s.substr(last.size(), s.size() - last.size())); } last = s; return true; } bool F010005F00E036000_1(void *data, size_t *len, HookParam *hp) { static lru_cache cache(5); static std::string last; auto s = std::string((char *)data, *len); if (endWith(last, s)) { last = s; return false; } if (cache.touch(s)) { last = s; return false; } last = s; return write_string_overwrite(data, len, s); } bool F010005F00E036000(void *data, size_t *len, HookParam *hp) { if (!F010005F00E036000_1(data, len, hp)) return false; static std::string last; auto s = std::string((char *)data, *len); auto parse = [](std::string &s) { strReplace(s, u8"㊤", u8"―"); strReplace(s, u8"㊥", u8"―"); strReplace(s, u8"㊦", u8"―"); return s; }; if (startWith(s, last)) { write_string_overwrite(data, len, parse(s.substr(last.size(), s.size() - last.size()))); last = s; return true; } last = s; return write_string_overwrite(data, len, parse(s)); } bool F0100FC2019346000(void *data, size_t *len, HookParam *hp) { StringFilter((char *)data, len, "#n", 2); auto s = std::string((char *)data, *len); s = std::regex_replace(s, std::regex(R"((#[A-Za-z]+\[(\d*[.])?\d+\])+)"), ""); return write_string_overwrite(data, len, s); } template bool F0100E5200D1A2000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); auto ws = StringToWideString(s, 932).value(); ws = std::regex_replace(ws, std::wregex(LR"((\\n)+)"), L" "); ws = std::regex_replace(ws, std::wregex(LR"(\\d$|^\@[a-z]+|#.*?#|\$)"), L""); ws = std::regex_replace(ws, std::wregex(LR"(\u3000+)"), L""); if (choice) ws = std::regex_replace(ws, std::wregex(LR"(, ?\w+)"), L""); s = WideStringToString(ws, 932); return write_string_overwrite(data, len, s); } bool F010028D0148E6000_2(void *data, size_t *len, HookParam *hp) { StringFilter((char *)data, len, "@w", 2); return true; } namespace { #pragma optimize("", off) // 必须禁止优化这个函数,或者引用一下参数,否则参数被优化没了。 void F01009E600FAF6000_collect(const char *_) {} #pragma optimize("", on) bool F01009E600FAF6000(void *data, size_t *len, HookParam *hpx) { auto s = std::string((char *)data, *len); HookParam hp; hp.address = (uintptr_t)F01009E600FAF6000_collect; hp.offset = GETARG1; hp.type = USING_STRING; hp.filter_fun = [](void *data, size_t *size, HookParam *hp) { StringFilter((char *)data, size, "@1r", 3); StringFilter((char *)data, size, "@-1r", 4); return true; }; static auto _ = NewHook(hp, "01009E600FAF6000"); static std::map mp; // 这个address会被触发两次。 if (mp.find(hpx->emu_addr) == mp.end()) mp[hpx->emu_addr] = hpx->address; if (mp[hpx->emu_addr] != hpx->address) return false; F01009E600FAF6000_collect(s.c_str()); return false; } } template bool F0100EFE0159C6000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); auto ws = StringToWideString(s, 932).value(); ws = std::regex_replace(ws, std::wregex(LR"((\\n)+)"), L" "); ws = std::regex_replace(ws, std::wregex(LR"(\\d$|^\@[a-z]+|#.*?#|\$)"), L""); ws = std::regex_replace(ws, std::wregex(LR"(\u3000+)"), L""); ws = std::regex_replace(ws, std::wregex(LR"(@w|\\c)"), L""); if (choice) ws = std::regex_replace(ws, std::wregex(LR"(, ?\w+)"), L""); s = WideStringToString(ws, 932); return write_string_overwrite(data, len, s); } bool F0100FDB00AA80000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); s = std::regex_replace(s, std::regex("\\[([^\\]]+)\\/[^\\]]+\\]"), "$1"); s = std::regex_replace(s, std::regex("<[^>]*>"), ""); return write_string_overwrite(data, len, s); } bool F0100FF500E34A000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); s = std::regex_replace(s, std::regex("\\[.*?\\]"), ""); s = std::regex_replace(s, std::regex("\\n+"), " "); return write_string_overwrite(data, len, s); } bool F010076501DAEA000(void *data, size_t *len, HookParam *hp) { StringFilter((char *)data, len, "\\n", 2); return true; } bool F01005E9016BDE000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); std::regex patt("/\\/\\/ remove rubi\\n\\ss = s.replace\\(patt, ''\\);/"); s = std::regex_replace(s, patt, ""); s = std::regex_replace(s, std::regex("\\\\k|\\\\x|%C|%B|%p-1;"), ""); s = std::regex_replace(s, std::regex("#[0-9a-fA-F]+;([^%#]+)(%r)?"), "$1"); s = std::regex_replace(s, std::regex("\\\\n"), " "); return write_string_overwrite(data, len, s); } bool F010065301A2E0000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); s = std::regex_replace(s, std::wregex(L"\\d+"), L""); s = std::regex_replace(s, std::wregex(L"<[^>]*>"), L""); return write_string_overwrite(data, len, s); } bool F01002AE00F442000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); std::wregex pattern1(L"\\[([^\\]\\/]+)\\/[^\\]]+\\]"); s = std::regex_replace(s, pattern1, L"$1"); std::wregex pattern2(L"(\\S*)@"); s = std::regex_replace(s, pattern2, L"$1"); std::wregex pattern3(L"\\$"); s = std::regex_replace(s, pattern3, L""); return write_string_overwrite(data, len, s); } bool F01000A400AF2A000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); s = std::regex_replace(s, std::wregex(L"@[a-zA-Z]|%[a-zA-Z]+"), L""); static std::wstring last; if (last == s) return false; last = s; return write_string_overwrite(data, len, s); } bool F01006B5014E2E000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); s = std::regex_replace(s, std::regex("@r(.*?)@(.*?)@"), "$1"); s = std::regex_replace(s, std::regex("@n"), ""); s = std::regex_replace(s, std::regex("@v"), ""); s = std::regex_replace(s, std::regex("TKY[0-9]{6}_[A-Z][0-9]{2}"), ""); return write_string_overwrite(data, len, s); } bool F0100CF400F7CE000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); s = std::regex_replace(s, std::regex("\\n+"), " "); return write_string_overwrite(data, len, s); } bool F01000AE01954A000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); s = std::regex_replace(s, std::regex("[A-Za-z0-9]"), ""); s = std::regex_replace(s, std::regex("[~^(-).%,!:#@$/*&;+_]"), ""); return write_string_overwrite(data, len, s); } bool F01003BD013E30000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); s = std::regex_replace(s, std::regex("{|\\/.*?}|\\[.*?]"), ""); return write_string_overwrite(data, len, s); } bool F010074F013262000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); s = std::regex_replace(s, std::regex("\\[.*?]"), ""); return write_string_overwrite(data, len, s); } bool F010057E00AC56000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); s = std::regex_replace(s, std::regex("<[^>]*>"), ""); s = std::regex_replace(s, std::regex(u8"ズーム|回転|身長|体重"), ""); s = std::regex_replace(s, std::regex("[A-Za-z0-9]"), ""); s = std::regex_replace(s, std::regex("[().%,!#/]"), ""); while (std::regex_search(s, std::regex("^\\s*$"))) { s = std::regex_replace(s, std::regex("^\\s*$"), ""); } static std::string last; if (last == s) return false; last = s; return write_string_overwrite(data, len, s); } bool F010051D010FC2000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); s = std::regex_replace(s, std::regex("\\[([^\\]]+)\\/[^\\]]+\\]"), "$1"); s = std::regex_replace(s, std::regex("\\s+"), " "); s = std::regex_replace(s, std::regex("\\\\n"), " "); s = std::regex_replace(s, std::regex("<[^>]+>|\\[[^\\]]+\\]"), ""); return write_string_overwrite(data, len, s); } bool F010096000CA38000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); s = std::regex_replace(s, std::wregex(LR"(\$\w{1,2})"), L""); s = std::regex_replace(s, std::wregex(LR"(\$\[|\$\/.+?])"), L""); return write_string_overwrite(data, len, s); } bool F0100EC001DE7E000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); s = std::regex_replace(s, std::wregex(LR"(<\w+=[^>]+>|<\/\w+>)"), L""); return write_string_overwrite(data, len, s); } bool F0100DEF01D0C6000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); s = std::regex_replace(s, std::wregex(LR"(\n)"), L""); s = std::regex_replace(s, std::wregex(LR"(\u3000)"), L""); s = std::regex_replace(s, std::wregex(LR"(<.+?>)"), L""); return write_string_overwrite(data, len, s); } bool F01005AF00E9DC000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); s = std::regex_replace(s, std::regex(R"(#n)"), ""); s = std::regex_replace(s, std::regex(R"(#\w+(\[.+?\])?)"), ""); return write_string_overwrite(data, len, s); } bool F010031C01F410000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); s += L"\n"; return write_string_overwrite(data, len, s); } namespace { #pragma optimize("", off) // 必须禁止优化这个函数,或者引用一下参数,否则参数被优化没了。 void F01006530151F0000_collect(const wchar_t *_) {} #pragma optimize("", on) bool F01006530151F0000(void *data, size_t *len, HookParam *) { auto s = std::wstring((wchar_t *)data, *len / 2); strReplace(s, L"/player", L""); HookParam hp; hp.address = (uintptr_t)F01006530151F0000_collect; hp.offset = GETARG1; hp.type = CODEC_UTF16 | USING_STRING; static auto _ = NewHook(hp, "01006530151F0000"); F01006530151F0000_collect(s.c_str()); return false; } } bool F010043901E972000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); strReplace(s, L"
", L"\n"); return write_string_overwrite(data, len, s); } bool wF0100A9B01D4AE000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); s = std::regex_replace(s, std::wregex(LR"(@(.*?)@)"), L"$1\n"); return write_string_overwrite(data, len, s); } bool aF0100A9B01D4AE000(void *data, size_t *len, HookParam *hp) { auto s = std::string((char *)data, *len); strReplace(s, u8"❛", "'"); strReplace(s, u8"❜", "'"); strReplace(s, u8"❝", "\""); strReplace(s, u8"❞", "\""); s = std::regex_replace(s, std::regex(R"(@(.*?)@)"), "$1\n"); s = std::regex_replace(s, std::regex(R"(\$s\(i?\))"), ""); s = std::regex_replace(s, std::regex(R"(\$[<>]\d+)"), ""); return write_string_overwrite(data, len, s); } bool F0100FB301E70A000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); return s != L"\uc5d0\u4bad\u0012"; } bool F0100F0A01F112000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); static std::wstring last; if (last == s) return false; last = s; s = std::regex_replace(s, std::wregex(LR"(\$\[(.*?)\$/(.*?)\$\])"), L"$1"); return write_string_overwrite(data, len, s); } bool F0100C9001E10C000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); s = std::regex_replace(s, std::wregex(LR"(<(.*?)>)"), L""); // return write_string_overwrite(data, len, s); } bool F01001BA01EBFC000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); s = std::regex_replace(s, std::wregex(LR"(#n)"), L""); s = std::regex_replace(s, std::wregex(LR"(#\w+(\[.+?\])?)"), L""); return write_string_overwrite(data, len, s); } bool F01000BB01CB8A000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); static std::wstring last; if (last == s) return false; last = s; s = std::regex_replace(s, std::wregex(LR"(\u3000)"), L""); return write_string_overwrite(data, len, s); } bool F010044701E9BC000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); s = std::regex_replace(s, std::wregex(LR"(\<.*?\>)"), L""); s = std::regex_replace(s, std::wregex(LR"(\s)"), L""); return write_string_overwrite(data, len, s); } bool F01003BB01DF54000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); s = std::regex_replace(s, std::wregex(LR"(\\\u3000*)"), L""); s = std::regex_replace(s, std::wregex(LR"(\$)"), L""); return write_string_overwrite(data, len, s); } bool F01004E5017C54000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); s = std::regex_replace(s, std::wregex(LR"(<.+?>)"), L""); s = std::regex_replace(s, std::wregex(LR"(\u3000)"), L""); return write_string_overwrite(data, len, s); } bool F0100FA001E160000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); s = std::regex_replace(s, std::wregex(LR"(\r\n)"), L""); s = std::regex_replace(s, std::wregex(LR"(\u3000)"), L""); return write_string_overwrite(data, len, s); } bool F0100B1F0123B6000(void *data, size_t *len, HookParam *hp) { if (all_ascii((wchar_t *)data)) return false; return F010096000CA38000(data, len, hp); } bool F0100A62019078000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); s = std::regex_replace(s, std::wregex(LR"([\s])"), L""); s = std::regex_replace(s, std::wregex(LR"($$R)"), L""); s = std::regex_replace(s, std::wregex(LR"(%)"), L""); return write_string_overwrite(data, len, s); } bool F01001EF017BE6000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); while (std::regex_search(s, std::wregex(L"^\\s*$"))) { s = std::regex_replace(s, std::wregex(L"^\\s*$"), L""); } return write_string_overwrite(data, len, s); } bool F01000EA00D2EE000(void *data, size_t *len, HookParam *hp) { auto s = std::wstring((wchar_t *)data, *len / 2); s = std::regex_replace(s, std::wregex(L"\\n+"), L" "); s = std::regex_replace(s, std::wregex(L"\\"), L"???"); s = std::regex_replace(s, std::wregex(L"\\"), L"chiaki_washa"); s = std::regex_replace(s, std::wregex(L"<.+?>"), L""); return write_string_overwrite(data, len, s); } auto _ = []() { emfunctionhooks = { // Memories Off {0x8003eeac, {CODEC_UTF16, 0, 0, mages_readstring<0>, 0, "0100978013276000", "1.0.0"}}, {0x8003eebc, {CODEC_UTF16, 0, 0, mages_readstring<0>, 0, "0100978013276000", "1.0.1"}}, // Memories Off ~Sorekara~ {0x8003fb7c, {CODEC_UTF16, 0, 0, mages_readstring<0>, 0, "0100B4A01326E000", "1.0.0"}}, {0x8003fb8c, {CODEC_UTF16, 0, 0, mages_readstring<0>, 0, "0100B4A01326E000", "1.0.1"}}, // Famicom Tantei Club: Kieta Koukeisha {0x80052a10, {CODEC_UTF16, 0, 0, mages_readstring<3>, 0, "0100B4500F7AE000", "1.0.0"}}, // Famicom Tantei Club Part: Ushiro ni Tatsu Shoujo {0x8004cb30, {CODEC_UTF16, 0, 0, mages_readstring<3>, 0, "010078400F7B0000", "1.0.0"}}, // Memories Off 2nd {0x8003ee0c, {CODEC_UTF16, 0, 0, mages_readstring<0>, 0, "0100D31013274000", "1.0.0"}}, {0x8003ee1c, {CODEC_UTF16, 0, 0, mages_readstring<0>, 0, "0100D31013274000", "1.0.1"}}, // Omoide ni Kawaru Kimi ~Memories Off~ {0x8003ef6c, {CODEC_UTF16, 0, 0, mages_readstring<0>, 0, "0100FFA013272000", "1.0.0"}}, {0x8003ef7c, {CODEC_UTF16, 0, 0, mages_readstring<0>, 0, "0100FFA013272000", "1.0.1"}}, // Memories Off 6 ~T-Wave~ {0x80043d7c, {CODEC_UTF16, 0, 0, mages_readstring<0>, 0, "010047A013268000", "1.0.0"}}, {0x80043d5c, {CODEC_UTF16, 0, 0, mages_readstring<0>, 0, "010047A013268000", "1.0.1"}}, // Memories Off: Yubikiri no Kioku {0x800440ec, {CODEC_UTF16, 0, 0, mages_readstring<0>, 0, "010079C012896000", "1.0.0"}}, // Memories Off #5 Togireta Film {0x8003f6ac, {CODEC_UTF16, 0, 0, mages_readstring<0>, 0, "010073901326C000", "1.0.0"}}, {0x8003f5fc, {CODEC_UTF16, 0, 0, mages_readstring<0>, 0, "010073901326C000", "1.0.1"}}, // SINce Memories: Hoshi no Sora no Shita de {0x80048cc8, {CODEC_UTF16, 0, 0, mages_readstring<4>, 0, "0100E94014792000", 0}}, // line + name => join {0x8004f44c, {CODEC_UTF16, 0, 0, mages_readstring<4>, 0, "0100E94014792000", 0}}, // fast trophy {0x8004f474, {CODEC_UTF16, 0, 0, mages_readstring<4>, 0, "0100E94014792000", 0}}, // prompt {0x80039dc0, {CODEC_UTF16, 0, 0, mages_readstring<4>, 0, "0100E94014792000", 0}}, // choice // Yahari Game demo Ore no Seishun Love Come wa Machigatteiru. {0x8005DFB8, {CODEC_UTF16, 0, 0, mages_readstring<0>, 0, "0100E0D0154BC000", "1.0.0"}}, // CHAOS;HEAD NOAH {0x80046700, {CODEC_UTF16, 0, 0, mages_readstring<0>, 0, "0100957016B90000", "1.0.0"}}, {0x8003A2c0, {CODEC_UTF16, 0, 0, mages_readstring<0>, 0, "0100957016B90000", "1.0.0"}}, // choice {0x8003EAB0, {CODEC_UTF16, 0, 0, mages_readstring<0>, 0, "0100957016B90000", "1.0.0"}}, // TIPS list (menu) {0x8004C648, {CODEC_UTF16, 0, 0, mages_readstring<0>, 0, "0100957016B90000", "1.0.0"}}, // system message {0x80050374, {CODEC_UTF16, 0, 0, mages_readstring<0>, 0, "0100957016B90000", "1.0.0"}}, // TIPS (red) // Shiro to Kuro no Alice {0x80013f20, {CODEC_UTF8, 0, 0, 0, NewLineCharFilterW, "0100A460141B8000", "1.0.0"}}, {0x80013f94, {CODEC_UTF8, 0, 0, 0, NewLineCharFilterW, "0100A460141B8000", "1.0.0"}}, {0x8001419c, {CODEC_UTF8, 0, 0, 0, NewLineCharFilterW, "0100A460141B8000", "1.0.0"}}, // Shiro to Kuro no Alice -Twilight line- {0x80014260, {CODEC_UTF8, 0, 0, 0, NewLineCharFilterW, "0100A460141B8000", "1.0.0"}}, {0x800142d4, {CODEC_UTF8, 0, 0, 0, NewLineCharFilterW, "0100A460141B8000", "1.0.0"}}, {0x800144dc, {CODEC_UTF8, 0, 0, 0, NewLineCharFilterW, "0100A460141B8000", "1.0.0"}}, // CLANNAD {0x80072d00, {CODEC_UTF16 | FULL_STRING, 1, 0, 0, F0100A3A00CC7E000, "0100A3A00CC7E000", "1.0.0"}}, {0x80072d30, {CODEC_UTF16 | FULL_STRING, 1, 0, 0, F0100A3A00CC7E000, "0100A3A00CC7E000", "1.0.7"}}, // VARIABLE BARRICADE NS {0x800e3424, {CODEC_UTF8, 0, 0, 0, F010045C0109F2000, "010045C0109F2000", "1.0.1"}}, //"System Messages + Choices"), //Also includes the names of characters, {0x800fb080, {CODEC_UTF8, 3, 0, 0, F010045C0109F2000, "010045C0109F2000", "1.0.1"}}, // Main Text // AMNESIA for Nintendo Switch {0x805bba5c, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<2>, F0100A1E00BFEA000, "0100A1E00BFEA000", "1.0.1"}}, // dialogue {0x805e9930, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<1>, F0100A1E00BFEA000, "0100A1E00BFEA000", "1.0.1"}}, // choice {0x805e7fd8, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<1>, F0100A1E00BFEA000, "0100A1E00BFEA000", "1.0.1"}}, // name // Chou no Doku Hana no Kusari Taishou Tsuya Koi Ibun {0x80095010, {CODEC_UTF16, 1, 0, 0, F0100A1200CA3C000, "0100A1200CA3C000", "2.0.1"}}, // Main Text + Names // Live a Live {0x80a05170, {CODEC_UTF16, 0, 0, 0, F0100982015606000, "0100C29017106000", "1.0.0"}}, // Sakura no Kumo * Scarlet no Koi {0x804e4858, {CODEC_UTF8, 3, 1, 0, F01006590155AC000, "01006590155AC000", "1.0.0"}}, // name {0x804e4870, {CODEC_UTF8, 0, 0, 0, F01006590155AC000, "01006590155AC000", "1.0.0"}}, // dialogue // Majestic Majolical {0x80557408, {CODEC_UTF8, 0, 0, 0, F01000200194AE000, "01000200194AE000", "1.0.0"}}, // name {0x8059ee94, {CODEC_UTF8, 3, 0, 0, F01000200194AE000, "01000200194AE000", "1.0.0"}}, // player name {0x80557420, {CODEC_UTF8, 0, 0, 0, F01000200194AE000, "01000200194AE000", "1.0.0"}}, // dialogue // Matsurika no Kei {0x8017ad54, {CODEC_UTF32, 1, 0, 0, F0100EA001A626000, "0100EA001A626000", "1.0.0"}}, // text {0x80174d4c, {CODEC_UTF32, 1, 0, 0, F0100EA001A626000, "0100EA001A626000", "1.0.0"}}, // name // Cupid Parasite {0x80057910, {CODEC_UTF32, 2, 0, 0, F0100F7E00DFC8000, "0100F7E00DFC8000", "1.0.1"}}, // name + text {0x80169df0, {CODEC_UTF32, 0, 0, 0, F0100F7E00DFC8000, "0100F7E00DFC8000", "1.0.1"}}, // choice // Radiant Tale {0x80075190, {CODEC_UTF8, 1, 0, 0, F0100925014864000, "0100925014864000", "1.0.0"}}, // prompt {0x8002fb18, {CODEC_UTF8, 0, 0, 0, F0100925014864000, "0100925014864000", "1.0.0"}}, // name {0x8002fd7c, {CODEC_UTF8, 0, 0, 0, F0100925014864000, "0100925014864000", "1.0.0"}}, // text {0x8004cf28, {CODEC_UTF8, 1, 0, 0, F0100925014864000, "0100925014864000", "1.0.0"}}, // text // MUSICUS {0x80462DD4, {CODEC_UTF8, 0, 1, 0, F01006590155AC000, "01000130150FA000", "1.0.0"}}, // name {0x80462DEC, {CODEC_UTF8, 0, 0, 0, F01006590155AC000, "01000130150FA000", "1.0.0"}}, // dialogue 1 {0x80480d4c, {CODEC_UTF8, 0, 0, 0, F01006590155AC000, "01000130150FA000", "1.0.0"}}, // dialogue 2 {0x804798e0, {CODEC_UTF8, 0, 0, 0, F01006590155AC000, "01000130150FA000", "1.0.0"}}, // choice // Story of Seasons a Wonderful Life {0x80ac4d88, {CODEC_UTF32, 0, 0, F0100936018EB4000, "0100936018EB4000", "1.0.3"}}, // Main text {0x808f7e84, {CODEC_UTF32, 0, 0, F0100936018EB4000, "0100936018EB4000", "1.0.3"}}, // Item name {0x80bdf804, {CODEC_UTF32, 0, 0, F0100936018EB4000, "0100936018EB4000", "1.0.3"}}, // Item description // Hamefura Pirates 乙女ゲームの破滅フラグしかない悪役令嬢に転生してしまった… 〜波乱を呼ぶ海賊〜 {0x81e75940, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<1>, F0100982015606000, "0100982015606000", "1.0.0"}}, // Hamekai.TalkPresenter$$AddMessageBacklog {0x81c9ae60, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<1>, F0100982015606000, "0100982015606000", "1.0.0"}}, // Hamekai.ChoicesText$$SetText {0x81eb7dc0, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<1>, F0100982015606000, "0100982015606000", "1.0.0"}}, // Hamekai.ShortStoryTextView$$AddText // Death end re;Quest {0x80241088, {CODEC_UTF8, 8, 0, 0, F0100AEC013DDA000, "0100AEC013DDA000", "1.0.0"}}, // english ver // Death end re;Quest 2 {0x80225C3C, {CODEC_UTF8, 8, 0, 0, F010001D015260000, "010001D015260000", "1.0.0"}}, // Death end re;Quest Code Z {0x82349188, {CODEC_UTF16, 1, 0, 0, 0, "010054B01BE90000", "1.0.0"}}, {0x823DC128, {CODEC_UTF16, 1, 0, 0, 0, "010054B01BE90000", "1.0.2"}}, // Meta Meet Cute!!!+ {0x81DD6010, {CODEC_UTF16, 1, -32, 0, 0, "01009A401C1B0000", "1.02"}}, // english ver, only long string, short string can't find. // Of the Red, the Light, and the Ayakashi Tsuzuri {0x8176D78C, {CODEC_UTF16, 3, 0, 0, 0, "0100F7801B5DC000", "1.0.0"}}, // Tokimeki Memorial Girl's Side: 4th Heart {0x817e7da8, {CODEC_UTF16, 0, 0, T0100B0100E26C000<2, 0>, 0, "0100B0100E26C000", "1.0.0"}}, // name (x1) + dialogue (x2) {0x81429f54, {CODEC_UTF16, 0, 0, T0100B0100E26C000<0, 1>, 0, "0100B0100E26C000", "1.0.0"}}, // choice (x0) {0x8180633c, {CODEC_UTF16, 0, 0, T0100B0100E26C000<1, 2>, 0, "0100B0100E26C000", "1.0.0"}}, // help (x1) // 13 Sentinels: Aegis Rim {0x80057d18, {CODEC_UTF8, 0, 0, 0, F010045C014650000, "010045C014650000", "1.0.0"}}, // cutscene text {0x8026fec0, {CODEC_UTF8, 1, 0, 0, F010045C014650000, "010045C014650000", "1.0.0"}}, // prompt {0x8014eab4, {CODEC_UTF8, 0, 0, 0, F010045C014650000, "010045C014650000", "1.0.0"}}, // name (combat) {0x801528ec, {CODEC_UTF8, 3, 0, 0, F010045C014650000, "010045C014650000", "1.0.0"}}, // dialogue (combat) {0x80055acc, {CODEC_UTF8, 0, 0, 0, F010045C014650000, "010045C014650000", "1.0.0"}}, // dialogue 2 (speech bubble) {0x802679c8, {CODEC_UTF8, 1, 0, 0, F010045C014650000, "010045C014650000", "1.0.0"}}, // notification {0x8025e210, {CODEC_UTF8, 2, 0, 0, F010045C014650000, "010045C014650000", "1.0.0"}}, // scene context example: 数日前 咲良高校 1年B組 教室 1985年5月" {0x8005c518, {CODEC_UTF8, 0, 0, 0, F010045C014650000, "010045C014650000", "1.0.0"}}, // game help // Sea of Stars {0x83e93ca0, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F01008C0016544000, "01008C0016544000", "1.0.45861"}}, // Main text {0x820c3fa0, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F01008C0016544000, "01008C0016544000", "1.0.47140"}}, // Main text // Final Fantasy I {0x81e88040, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, 0, "01000EA014150000", "1.0.1"}}, // Main text {0x81cae54c, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, 0, "01000EA014150000", "1.0.1"}}, // Intro text {0x81a3e494, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, 0, "01000EA014150000", "1.0.1"}}, // battle text {0x81952c28, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, 0, "01000EA014150000", "1.0.1"}}, // Location // Final Fantasy II {0x8208f4cc, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, 0, "01006B7014156000", "1.0.1"}}, // Main text {0x817e464c, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, 0, "01006B7014156000", "1.0.1"}}, // Intro text {0x81fb6414, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, 0, "01006B7014156000", "1.0.1"}}, // battle text // Final Fantasy III {0x82019e84, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, 0, "01002E2014158000", "1.0.1"}}, // Main text1 {0x817ffcfc, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, 0, "01002E2014158000", "1.0.1"}}, // Main text2 {0x81b8b7e4, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, 0, "01002E2014158000", "1.0.1"}}, // battle text {0x8192c4a8, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, 0, "01002E2014158000", "1.0.1"}}, // Location // Final Fantasy IV {0x81e44bf4, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, 0, "01004B301415A000", "1.0.2"}}, // Main text {0x819f92c4, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, 0, "01004B301415A000", "1.0.2"}}, // Rolling text {0x81e2e798, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, 0, "01004B301415A000", "1.0.2"}}, // Battle text {0x81b1e6a8, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, 0, "01004B301415A000", "1.0.2"}}, // Location // Final Fantasy V {0x81d63e24, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, 0, "0100AA201415C000", "1.0.2"}}, // Main text {0x81adfb3c, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, 0, "0100AA201415C000", "1.0.2"}}, // Location {0x81a8fda8, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, 0, "0100AA201415C000", "1.0.2"}}, // Battle text // Final Fantasy VI {0x81e6b350, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, 0, "0100AA001415E000", "1.0.2"}}, // Main text {0x81ab40ec, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, 0, "0100AA001415E000", "1.0.2"}}, // Location {0x819b8c88, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, 0, "0100AA001415E000", "1.0.2"}}, // Battle text // Final Fantasy IX {0x80034b90, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<1>, F01006F000B056000, "01006F000B056000", "1.0.1"}}, // Main Text {0x802ade64, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F01006F000B056000, "01006F000B056000", "1.0.1"}}, // Battle Text {0x801b1b84, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F01006F000B056000, "01006F000B056000", "1.0.1"}}, // Descriptions {0x805aa0b0, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F01006F000B056000, "01006F000B056000", "1.0.1"}}, // Key Item Name {0x805a75d8, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F01006F000B056000, "01006F000B056000", "1.0.1"}}, // Key Item Content {0x8002f79c, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F01006F000B056000, "01006F000B056000", "1.0.1"}}, // Menu {0x80ca88b0, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F01006F000B056000, "01006F000B056000", "1.0.1"}}, // Tutorial1 {0x80ca892c, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F01006F000B056000, "01006F000B056000", "1.0.1"}}, // Tutorial2 {0x80008d88, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<1>, F01006F000B056000, "01006F000B056000", "1.0.1"}}, // Location // Norn9 Var Commons {0x8003E874, {CODEC_UTF8, 0, 0, 0, F0100068019996000, "0100068019996000", "1.0.0"}}, // English // 薄桜鬼 真改 万葉ノ抄 {0x8004E8F0, {CODEC_UTF8, 1, 0, 0, F010001D015260000, "0100EA601A0A0000", "1.0.0"}}, // Hakuouki Shinkai: Tsukikage no Shou / 薄桜鬼 真改 月影ノ抄 {0x8019ecd0, {CODEC_UTF8, 1, 0, 0, F0100E1E00E2AE000, "0100E1E00E2AE000", "1.0.0"}}, // Text // Chrono Cross: The Radical Dreamers Edition {0x802b1254, {CODEC_UTF32, 1, 0, 0, 0, "0100AC20128AC000", "1.0.2"}}, // Text // AIR {0x800a6b10, {CODEC_UTF16, 1, 0, 0, F0100ADC014DA0000, "0100ADC014DA0000", "1.0.1"}}, // Text + Name // Shinigami to Shoujo {0x21cb08, {0, 1, 0, 0, F0100AFA01750C000, "0100AFA01750C000", "1.0.2"}}, // Text,sjis // Octopath Traveler II {0x8088a4d4, {CODEC_UTF16, 0, 0, 0, 0, "0100A3501946E000", "1.0.0"}}, // main text // NieR:Automata The End of YoRHa Edition {0x808e7068, {CODEC_UTF16, 3, 0, 0, 0, "0100B8E016F76000", "1.0.2"}}, // Text // Reine des Fleurs {0x80026434, {CODEC_UTF8, 0, 0, 0, 0, "0100B5800C0E4000", "1.0.0"}}, // Dialogue text // Code: Realize ~Saikou no Hanataba~ (Code:Realize ~彩虹の花束~) {0x80019c14, {CODEC_UTF8, 0, 0x1c, 0, F010088B01A8FC000, "0100B6900A668000", "1.0.0"}}, {0x80041560, {CODEC_UTF8, 1, 0, 0, F010088B01A8FC000, "0100B6900A668000", "1.0.0"}}, {0x800458c8, {CODEC_UTF8, 0, 0, 0, F010088B01A8FC000, "0100B6900A668000", "1.0.0"}}, // Diabolik Lovers Grand Edition {0x80041080, {CODEC_UTF8, 1, 0, 0, F0100BD700E648000, "0100BD700E648000", "1.0.0"}}, // name {0x80041080, {CODEC_UTF8, 0, 0, 0, F0100BD700E648000, "0100BD700E648000", "1.0.0"}}, // dialogue {0x80041080, {CODEC_UTF8, 2, 0, 0, F0100BD700E648000, "0100BD700E648000", "1.0.0"}}, // choice1 // Shinobi, Koi Utsutsu {0x8002aca0, {CODEC_UTF8, 0, 0, 0, F0100C1E0102B8000, "0100C1E0102B8000", "1.0.0"}}, // name {0x8002aea4, {CODEC_UTF8, 0, 0, 0, F0100C1E0102B8000, "0100C1E0102B8000", "1.0.0"}}, // dialogue1 {0x8001ca90, {CODEC_UTF8, 2, 0, 0, F0100C1E0102B8000, "0100C1E0102B8000", "1.0.0"}}, // dialogue2 {0x80049dbc, {CODEC_UTF8, 1, 0, 0, F0100C1E0102B8000, "0100C1E0102B8000", "1.0.0"}}, // choice // Yoru, Tomosu {0xe2748eb0, {CODEC_UTF32, 1, 0, 0, 0, "0100C2901153C000", "1.0.0"}}, // text1 // Closed Nightmare {0x800c0918, {CODEC_UTF8, 0, 0, 0, F0100D9500A0F6000, "0100D9500A0F6000", "1.0.0"}}, // line + name {0x80070b98, {CODEC_UTF8, 0, 0, 0, F0100D9500A0F6000, "0100D9500A0F6000", "1.0.0"}}, // fast trophy {0x800878fc, {CODEC_UTF8, 0, 0, 0, F0100D9500A0F6000, "0100D9500A0F6000", "1.0.0"}}, // prompt {0x80087aa0, {CODEC_UTF8, 0, 0, 0, F0100D9500A0F6000, "0100D9500A0F6000", "1.0.0"}}, // choice // Yuru Camp△ - Have a Nice Day! {0x816d03f8, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100982015606000, "0100D12014FC2000", "1.0.0"}}, // dialog / backlog // Akuyaku Reijou wa Ringoku no Outaishi ni Dekiai Sareru {0x817b35c4, {CODEC_UTF8, 1, 0, 0, F0100DA201E0DA000, "0100DA201E0DA000", "1.0.0"}}, // Dialogue // Yunohana Spring! ~Mellow Times~ {0x80028178, {CODEC_UTF8, 0, 0, 0, F0100DE200C0DA000, "0100DE200C0DA000", "1.0.0"}}, // name {0x8001b9d8, {CODEC_UTF8, 2, 0, 0, F0100DE200C0DA000, "0100DE200C0DA000", "1.0.0"}}, // dialogue1 {0x8001b9b0, {CODEC_UTF8, 2, 0, 0, F0100DE200C0DA000, "0100DE200C0DA000", "1.0.0"}}, // dialogue2 {0x8004b940, {CODEC_UTF8, 2, 0, 0, F0100DE200C0DA000, "0100DE200C0DA000", "1.0.0"}}, // dialogue3 {0x8004a8d0, {CODEC_UTF8, 1, 0, 0, F0100DE200C0DA000, "0100DE200C0DA000", "1.0.0"}}, // choice // サマータイムレンダ Another Horizon {0x818ebaf0, {CODEC_UTF16, 0, 0, T01005940182EC000, F01005940182EC000, "01005940182EC000", "1.0.0"}}, // dialogue // Aquarium {0x8051a990, {CODEC_UTF8, 0, 1, 0, F01006590155AC000, "0100D11018A7E000", "1.0.0"}}, // name {0x8051a9a8, {CODEC_UTF8, 0, 0, 0, F01006590155AC000, "0100D11018A7E000", "1.0.0"}}, // dialogue {0x80500178, {CODEC_UTF8, 0, 0, 0, F01006590155AC000, "0100D11018A7E000", "1.0.0"}}, // choice // AKA {0x8166eb80, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100B0601852A000, "0100B0601852A000", "1.0.0"}}, // Main text {0x817d44a4, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100B0601852A000, "0100B0601852A000", "1.0.0"}}, // Letter {0x815cb0f4, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100B0601852A000, "0100B0601852A000", "1.0.0"}}, // Mission title {0x815cde30, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100B0601852A000, "0100B0601852A000", "1.0.0"}}, // Mission description {0x8162a910, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100B0601852A000, "0100B0601852A000", "1.0.0"}}, // Craft description {0x817fdca8, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100B0601852A000, "0100B0601852A000", "1.0.0"}}, // Inventory item name // Etrian Odyssey I HD {0x82d57550, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100B0C016164000, "01008A3016162000", "1.0.2"}}, // Text {0x824ff408, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100B0C016164000, "01008A3016162000", "1.0.2"}}, // Config Description {0x8296b4e4, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100B0C016164000, "01008A3016162000", "1.0.2"}}, // Class Description {0x81b2204c, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100B0C016164000, "01008A3016162000", "1.0.2"}}, // Item Description // Etrian Odyssey II HD {0x82f24c70, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100B0C016164000, "0100B0C016164000", "1.0.2"}}, // Text {0x82cc0988, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100B0C016164000, "0100B0C016164000", "1.0.2"}}, // Config Description {0x8249acd4, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100B0C016164000, "0100B0C016164000", "1.0.2"}}, // Class Description {0x81b27644, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100B0C016164000, "0100B0C016164000", "1.0.2"}}, // Item Description // Etrian Odyssey III HD {0x83787f04, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100B0C016164000, "0100D32015A52000", "1.0.2"}}, // Text {0x8206915c, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100B0C016164000, "0100D32015A52000", "1.0.2"}}, // Config Description {0x82e6d1d4, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100B0C016164000, "0100D32015A52000", "1.0.2"}}, // Class Description {0x82bf5d48, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100B0C016164000, "0100D32015A52000", "1.0.2"}}, // Item Description // Fire Emblem Engage {0x8248c550, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<2>, 0, "0100A6301214E000", "1.3.0"}}, // App.Talk3D.TalkLog$$AddLog {0x820C6530, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<2>, 0, "0100A6301214E000", "2.0.0"}}, // App.Talk3D.TalkLog$$AddLog // AMNESIA LATER×CROWD for Nintendo Switch {0x800ebc34, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<1>, F0100982015606000, "0100B5700CDFC000", "1.0.0"}}, // waterfall {0x8014dc64, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<1>, F0100982015606000, "0100B5700CDFC000", "1.0.0"}}, // name {0x80149b10, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<1>, F0100982015606000, "0100B5700CDFC000", "1.0.0"}}, // dialogue {0x803add50, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<1>, F0100982015606000, "0100B5700CDFC000", "1.0.0"}}, // choice // Natsumon! 20th Century Summer Vacation {0x80db5d34, {CODEC_UTF16, 0, 0, 0, F0100A8401A0A8000, "0100A8401A0A8000", "1.1.0"}}, // tutorial {0x846fa578, {CODEC_UTF16, 0, 0, 0, F0100A8401A0A8000, "0100A8401A0A8000", "1.1.0"}}, // choice {0x8441e800, {CODEC_UTF16, 0, 0, 0, F0100A8401A0A8000, "0100A8401A0A8000", "1.1.0"}}, // examine + dialog // Super Mario RPG {0x81d78c58, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100BC0018138000, "0100BC0018138000", "1.0.0"}}, // Main Text {0x81dc9cf8, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100BC0018138000, "0100BC0018138000", "1.0.0"}}, // Name {0x81c16b80, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<1>, F0100BC0018138000, "0100BC0018138000", "1.0.0"}}, // Cutscene {0x821281f0, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<1>, F0100BC0018138000, "0100BC0018138000", "1.0.0"}}, // Special/Item/Menu/Objective Description {0x81cd8148, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<1>, F0100BC0018138000, "0100BC0018138000", "1.0.0"}}, // Special Name {0x81fc2820, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100BC0018138000, "0100BC0018138000", "1.0.0"}}, // Item Name Battle {0x81d08d28, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100BC0018138000, "0100BC0018138000", "1.0.0"}}, // Item Name Off-battle {0x82151aac, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100BC0018138000, "0100BC0018138000", "1.0.0"}}, // Shop Item Name {0x81fcc870, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<1>, F0100BC0018138000, "0100BC0018138000", "1.0.0"}}, // Objective Title {0x821bd328, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100BC0018138000, "0100BC0018138000", "1.0.0"}}, // Monster List - Name {0x820919b8, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100BC0018138000, "0100BC0018138000", "1.0.0"}}, // Monster List - Description {0x81f56518, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100BC0018138000, "0100BC0018138000", "1.0.0"}}, // Info {0x82134ce0, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100BC0018138000, "0100BC0018138000", "1.0.0"}}, // Help Category {0x82134f30, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100BC0018138000, "0100BC0018138000", "1.0.0"}}, // Help Name {0x821372e4, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100BC0018138000, "0100BC0018138000", "1.0.0"}}, // Help Description 1 {0x82137344, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100BC0018138000, "0100BC0018138000", "1.0.0"}}, // Help Description 2 {0x81d0ee80, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<2>, F0100BC0018138000, "0100BC0018138000", "1.0.0"}}, // Location {0x82128f64, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100BC0018138000, "0100BC0018138000", "1.0.0"}}, // Album Title {0x81f572a0, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<3>, F0100BC0018138000, "0100BC0018138000", "1.0.0"}}, // Load/Save Text {0x81d040a8, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100BC0018138000, "0100BC0018138000", "1.0.0"}}, // Levelup First Part {0x81d043fc, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100BC0018138000, "0100BC0018138000", "1.0.0"}}, // Levelup Second Part {0x81d04550, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100BC0018138000, "0100BC0018138000", "1.0.0"}}, // Levelup New Ability Description {0x81fbfa18, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100BC0018138000, "0100BC0018138000", "1.0.0"}}, // Yoshi Mini-Game Header {0x81fbfa74, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100BC0018138000, "0100BC0018138000", "1.0.0"}}, // Yoshi Mini-Game Text {0x81cf41b4, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100BC0018138000, "0100BC0018138000", "1.0.0"}}, // Enemy Special Attacks // Trials of Mana {0x800e8abc, {CODEC_UTF16, 1, 0, 0, F0100D7800E9E0000, "0100D7800E9E0000", "1.1.1"}}, // Text // Utsusemi no Meguri {0x821b452c, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, 0, "0100DA101D9AA000", "1.0.0"}}, // text1 {0x821b456c, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, 0, "0100DA101D9AA000", "1.0.0"}}, // text2 {0x821b45ac, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, 0, "0100DA101D9AA000", "1.0.0"}}, // text3 // Buddy Mission BOND {0x80046dd0, {0, 0, 0, T0100DB300B996000, 0, "0100DB300B996000", 0}}, // 1.0.0, 1.0.1,sjis {0x80046de0, {0, 0, 0, T0100DB300B996000, 0, "0100DB300B996000", 0}}, // Bravely Default II {0x80b97700, {CODEC_UTF16, 0, 0, 0, 0, "010056F00C7B4000", "1.0.0"}}, // Main Text {0x80bb8d3c, {CODEC_UTF16, 0, 0, 0, 0, "010056F00C7B4000", "1.0.0"}}, // Main Ptc Text {0x810add68, {CODEC_UTF16, 0, 0, 0, 0, "010056F00C7B4000", "1.0.0"}}, // Secondary Text // Tantei Bokumetsu / 探偵撲滅 {0x8011c340, {CODEC_UTF8, 1, 0, 0, F0100CBA014014000, "0100CBA014014000", "1.0.0"}}, // Text {0x80064f20, {CODEC_UTF8, 1, 0, 0, F0100CBA014014000, "0100CBA014014000", "1.0.0"}}, // Choices // Ys X: Nordics {0x80817758, {CODEC_UTF8, 1, 0, 0, F0100CC401A16C000<0>, "0100CC401A16C000", "1.0.4"}}, // Main Text {0x80981e3c, {CODEC_UTF8, 0, 0, 0, F0100CC401A16C000<1>, "0100CC401A16C000", "1.0.4"}}, // Secondary Text // 9 R.I.P {0x80025360, {CODEC_UTF8, 2, 0, 0, F0100BDD01AAE4000, "0100BDD01AAE4000", "1.0.0"}}, // name {0x80023c60, {CODEC_UTF8, 0, 0, 0, F0100BDD01AAE4000, "0100BDD01AAE4000", "1.0.0"}}, // text {0x8005388c, {CODEC_UTF8, 1, 0, 0, F0100BDD01AAE4000, "0100BDD01AAE4000", "1.0.0"}}, // choice {0x80065010, {CODEC_UTF8, 0, 0, 0, F0100BDD01AAE4000, "0100BDD01AAE4000", "1.0.0"}}, // character description {0x8009c780, {CODEC_UTF8, 0, 0, 0, F0100BDD01AAE4000, "0100BDD01AAE4000", "1.0.0"}}, // prompt // Kiss Bell - Let's sound the kissing-bell of the promise / キスベル {0x8049d958, {CODEC_UTF8, 1, 0, 0, F01006590155AC000, "0100BD7015E6C000", "1.0.0"}}, // text // Piofiore no Banshou -Ricordo- CN {0x80015fa0, {CODEC_UTF8, 2, 0, 0, F0100C310110B4000, "0100C310110B4000", "1.0.0"}}, // handlerMsg {0x80050d50, {CODEC_UTF8, 0, 0, 0, F0100C310110B4000, "0100C310110B4000", "1.0.0"}}, // handlerName {0x8002F430, {CODEC_UTF8, 0, 0, 0, F0100C310110B4000, "0100C310110B4000", "1.0.0"}}, // handlerPrompt {0x8002F4F0, {CODEC_UTF8, 0, 0, 0, F0100C310110B4000, "0100C310110B4000", "1.0.0"}}, // handlerPrompt {0x8002F540, {CODEC_UTF8, 0, 0, 0, F0100C310110B4000, "0100C310110B4000", "1.0.0"}}, // handlerPrompt // Piofiore no Banshou -Ricordo- {0x800141d0, {CODEC_UTF8, 2, 0, 0, F0100C310110B4000, "01005F700DC56000", "1.0.0"}}, // handlerMsg {0x8004ce20, {CODEC_UTF8, 0, 0, 0, F0100C310110B4000, "01005F700DC56000", "1.0.0"}}, // handlerName {0x8002be90, {CODEC_UTF8, 0, 0, 0, F0100C310110B4000, "01005F700DC56000", "1.0.0"}}, // handlerPrompt {0x8002bf50, {CODEC_UTF8, 0, 0, 0, F0100C310110B4000, "01005F700DC56000", "1.0.0"}}, // handlerPrompt {0x8002bfa0, {CODEC_UTF8, 0, 0, 0, F0100C310110B4000, "01005F700DC56000", "1.0.0"}}, // handlerPrompt // Piofiore no Banshou -Episodio1926- {0x80019630, {CODEC_UTF8, 2, 0, 0, F0100C310110B4000, "01009E30120F4000", "1.0.0"}}, // handlerMsg {0x8005B7B0, {CODEC_UTF8, 0, 0, 0, F0100C310110B4000, "01009E30120F4000", "1.0.0"}}, // handlerName {0x80039230, {CODEC_UTF8, 0, 0, 0, F0100C310110B4000, "01009E30120F4000", "1.0.0"}}, // handlerPrompt {0x800392F0, {CODEC_UTF8, 0, 0, 0, F0100C310110B4000, "01009E30120F4000", "1.0.0"}}, // handlerPrompt {0x80039340, {CODEC_UTF8, 0, 0, 0, F0100C310110B4000, "01009E30120F4000", "1.0.0"}}, // handlerPrompt // Pokémon Let’s Go, Pikachu! {0x8067d9fc, {CODEC_UTF16, 0, 0, 0, F010003F003A34000, "010003F003A34000", "1.0.2"}}, // Text // Ikemen Sengoku Toki o Kakeru Koi / イケメン戦国◆時をかける恋 新たなる出逢い {0x813e4fb4, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, 0, "01008BE016CE2000", "1.0.0"}}, // Main Text {0x813e4c60, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, 0, "01008BE016CE2000", "1.0.0"}}, // Name {0x813b5360, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, 0, "01008BE016CE2000", "1.0.0"}}, // Choices {0x81bab9ac, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<1>, 0, "01008BE016CE2000", "1.0.0"}}, // Info // Shin Megami Tensei V {0x80ce01a4, {CODEC_UTF16, 0, 0, 0, 0, "01006BD0095F4000", "1.0.2"}}, // Text // The Legend of Zelda: Link's Awakening {0x80f57910, {CODEC_UTF8, 1, 0, 0, 0, "01006BB00C6F0000", "1.0.1"}}, // Main Text // Cendrillon palikA {0x8001ab8c, {CODEC_UTF8, 2, 0, 0, F0100DE200C0DA000, "01006B000A666000", "1.0.0"}}, // name {0x80027b30, {CODEC_UTF8, 0, 0, 0, F0100DE200C0DA000, "01006B000A666000", "1.0.0"}}, // dialogue // Crayon Shin-chan Shiro of Coal Town {0x83fab4bc, {CODEC_UTF16, 0, 0, ReadTextAndLenW<0>, F01007B601C608000, "01007B601C608000", "1.0.1"}}, // Fuuraiki 4 {0x80008c80, {CODEC_UTF32, 1, 0, 0, F010046601125A000, "010046601125A000", "1.0.0"}}, // Main {0x80012b1c, {CODEC_UTF32, 1, 0, 0, F010046601125A000, "010046601125A000", "1.0.0"}}, // Wordpad {0x80012ccc, {CODEC_UTF32, 1, 0, 0, F010046601125A000, "010046601125A000", "1.0.0"}}, // Comments {0x80009f74, {CODEC_UTF32, 1, 0, 0, F010046601125A000, "010046601125A000", "1.0.0"}}, // Choices {0x80023d64, {CODEC_UTF32, 0, 0, 0, F010046601125A000, "010046601125A000", "1.0.0"}}, // Location // Ken ga Kimi for S / 剣が君 for S {0x81477128, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100771013FA8000, "0100771013FA8000", "1.1"}}, // Main Text {0x81470e38, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100771013FA8000, "0100771013FA8000", "1.1"}}, // Secondary Text // ANONYMOUS;CODE {0x80011608, {CODEC_UTF8, 1, 0, 0, F0100556015CCC000, "0100556015CCC000", "1.0.0"}}, // dialouge, menu // Sugar * Style (シュガー*スタイル) {0x800ccbc8, {0, 0, 0, 0, 0, "0100325012B70000", "1.0.0"}}, // ret x0 name + text (readShiftJisString), filter is to complex, quit. // Nightshade/百花百狼 {0x802999c8, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<1>, F010042300C4F6000, "010042300C4F6000", "1.0.1"}}, // dialogue {0x8015b544, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F010042300C4F6000, "010042300C4F6000", "1.0.1"}}, // name {0x802a2fd4, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<1>, F010042300C4F6000, "010042300C4F6000", "1.0.1"}}, // choice1 {0x802b7900, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<1>, F010042300C4F6000, "010042300C4F6000", "1.0.1"}}, // choice2 // Toraware no Paruma {0x8015b7a8, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F010044800D2EC000, "010044800D2EC000", "1.0.0"}}, // text x0 {0x8015b46c, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<1>, F010044800D2EC000, "010044800D2EC000", "1.0.0"}}, // name x1 // Brothers Conflict: Precious Baby {0x8016aecc, {CODEC_UTF16, 0, 0, ReadTextAndLenW<0>, F0100982015606000, "010037400DAAE000", "1.0.0"}}, // name {0x80126b9c, {CODEC_UTF16, 0, 0, ReadTextAndLenW<0>, F0100982015606000, "010037400DAAE000", "1.0.0"}}, // dialogue {0x80129160, {CODEC_UTF16, 0, 0, ReadTextAndLenW<2>, F0100982015606000, "010037400DAAE000", "1.0.0"}}, // choice // Zettai Kaikyu Gakuen {0x80067b5c, {CODEC_UTF16, 1, 0, 0, F010021300F69E000<0>, "010021300F69E000", "1.0.0"}}, // name+ dialogue main(ADV)+choices {0x80067cd4, {CODEC_UTF16, 1, 0, 0, F010021300F69E000<1>, "010021300F69E000", "1.0.0"}}, // dialogueNVL // Dragon Quest Builders 2 {0x805f8900, {CODEC_UTF8, 1, 0, 0, F010050000705E000, "010050000705E000", "1.7.3"}}, // Main text textbox {0x8068a698, {CODEC_UTF8, 0, 0, 0, F010050000705E000, "010050000705E000", "1.7.3"}}, // Not press to continue text {0x806e4118, {CODEC_UTF8, 3, 0, 0, F010050000705E000, "010050000705E000", "1.7.3"}}, // Character creation text {0x8067459c, {CODEC_UTF8, 1, 0, 0, F010050000705E000, "010050000705E000", "1.7.3"}}, // Objective progress1 {0x800a4f90, {CODEC_UTF8, 0, 0, 0, F010050000705E000, "010050000705E000", "1.7.3"}}, // Objective progress2 {0x8060a1c0, {CODEC_UTF8, 0, 0, 0, F010050000705E000, "010050000705E000", "1.7.3"}}, // Infos1 {0x805f6130, {CODEC_UTF8, 1, 0, 0, F010050000705E000, "010050000705E000", "1.7.3"}}, // Infos2 {0x80639b6c, {CODEC_UTF8, 2, 0, 0, F010050000705E000, "010050000705E000", "1.7.3"}}, // Item description {0x807185ac, {CODEC_UTF8, 1, 0, 0, F010050000705E000, "010050000705E000", "1.7.3"}}, // Mission1 {0x80657e4c, {CODEC_UTF8, 1, 0, 0, F010050000705E000, "010050000705E000", "1.7.3"}}, // Mission2 {0x80713be0, {CODEC_UTF8, 1, 0, 0, F010050000705E000, "010050000705E000", "1.7.3"}}, // Mission3 {0x8076ab04, {CODEC_UTF8, 1, 0, 0, F010050000705E000, "010050000705E000", "1.7.3"}}, // Tutorial header {0x8076ab2c, {CODEC_UTF8, 1, 0, 0, F010050000705E000, "010050000705E000", "1.7.3"}}, // Tutorial explanation // BUSTAFELLOWS season2 {0x819ed3e4, {CODEC_UTF16, 0, 0, ReadTextAndLenW<0>, F0100874017BE2000, "010037400DAAE000", "1.0.0"}}, // dialogue {0x82159cd0, {CODEC_UTF16, 0, 0, ReadTextAndLenW<1>, F0100874017BE2000, "010037400DAAE000", "1.0.0"}}, // textmessage {0x81e17530, {CODEC_UTF16, 0, 0, ReadTextAndLenW<0>, F0100874017BE2000, "010037400DAAE000", "1.0.0"}}, // option {0x81e99d64, {CODEC_UTF16, 0, 0, ReadTextAndLenW<0>, F0100874017BE2000, "010037400DAAE000", "1.0.0"}}, // choice {0x8186f81c, {CODEC_UTF16, 0, 0, ReadTextAndLenW<0>, F0100874017BE2000, "010037400DAAE000", "1.0.0"}}, // archives // 5分後に意外な結末 モノクロームの図書館 {0x81fa4890, {CODEC_UTF16, 1, 0X14, 0, F010094601D910000, "010094601D910000", "1.0.1"}}, // book text {0x81fa5250, {CODEC_UTF16, 1, 0X14, 0, F010094601D910000, "010094601D910000", "1.0.1"}}, // book text {0x81b1c68c, {CODEC_UTF16, 0, 0X14, 0, F010094601D910000, "010094601D910000", "1.0.1"}}, // choice1 {0x81b1c664, {CODEC_UTF16, 0, 0X14, 0, F010094601D910000, "010094601D910000", "1.0.1"}}, // choice2 {0x81b1e5b0, {CODEC_UTF16, 3, 0X14, 0, F010094601D910000, "010094601D910000", "1.0.1"}}, // dialogue // Tokimeki Memorial Girl’s Side 2nd Season for Nintendo Switch {0x82058848, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F010079201BD88000, "010079201BD88000", "1.0.1"}}, // dialogue1 {0x82058aa0, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F010079201BD88000, "010079201BD88000", "1.0.1"}}, // dialogue2 {0x8205a244, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F010079201BD88000, "010079201BD88000", "1.0.1"}}, // dialogue3 {0x826ee1d8, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F010079201BD88000, "010079201BD88000", "1.0.1"}}, // choice {0x8218e258, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F010079201BD88000, "010079201BD88000", "1.0.1"}}, // news {0x823b61d4, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F010079201BD88000, "010079201BD88000", "1.0.1"}}, // mail {0x82253454, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F010079201BD88000, "010079201BD88000", "1.0.1"}}, // luckyitem {0x82269240, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F010079201BD88000, "010079201BD88000", "1.0.1"}}, // profile1 {0x82269138, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F010079201BD88000, "010079201BD88000", "1.0.1"}}, // profile2 {0x822691ec, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F010079201BD88000, "010079201BD88000", "1.0.1"}}, // profile3 {0x82269198, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F010079201BD88000, "010079201BD88000", "1.0.1"}}, // profile4 // Uta no☆Prince-sama♪ Repeat Love / うたの☆プリンスさまっ♪Repeat LOVE {0x800374a0, {0, 0, 0, 0, F0100068019996000, "010024200E00A000", "1.0.0"}}, // Main Text + Name,sjis {0x8002ea08, {0, 0, 0, 0, F0100068019996000, "010024200E00A000", "1.0.0"}}, // Choices,sjis // ワンド オブ フォーチュン R~ for Nintendo Switch {0x81ed0580, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100DA201E0DA000, "01000C7019E1C000", "1.0.0"}}, // dialogue {0x81f96bac, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100DA201E0DA000, "01000C7019E1C000", "1.0.0"}}, // name {0x8250ac28, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100DA201E0DA000, "01000C7019E1C000", "1.0.0"}}, // choice // ワンド オブ フォーチュン R2 ~時空に沈む黙示録~ for Nintendo Switch {0x821540c4, {CODEC_UTF16, 0, 0, ReadTextAndLenW<0>, F0100DA201E0DA000, "010088A01A774000", "1.0.0"}}, // dialogue {0x8353e674, {CODEC_UTF16, 0, 0, ReadTextAndLenW<0>, F0100DA201E0DA000, "010088A01A774000", "1.0.0"}}, // choice {0x835015e8, {CODEC_UTF16, 0, 0, ReadTextAndLenW<0>, F0100DA201E0DA000, "010088A01A774000", "1.0.0"}}, // name // Yo-kai Watch 4++ {0x80a88080, {CODEC_UTF8, 1, 0, 0, F010086C00AF7C000, "010086C00AF7C000", "2.2.0"}}, // All Text // Cupid Parasite -Sweet & Spicy Darling- {0x80138150, {CODEC_UTF32, 2, 0, 0, F010079C017B98000, "010079C017B98000", "1.0.0"}}, // name + text {0x801a1bf0, {CODEC_UTF32, 0, 0, 0, F010079C017B98000, "010079C017B98000", "1.0.0"}}, // choice // DesperaDrops {0x8199c95c, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<1>, F010061A01C1CE000, "010061A01C1CE000", "1.0.0"}}, // text1 {0x81d5c900, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<1>, F010061A01C1CE000, "010061A01C1CE000", "1.0.0"}}, // text2 {0x820d6324, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<1>, F010061A01C1CE000, "010061A01C1CE000", "1.0.0"}}, // choice // Dragon Ball Z: Kakarot {0x812a8e28, {CODEC_UTF16, 0, 0, 0, F01008C0016544000, "0100EF00134F4000", "1.50"}}, // Main Text {0x812a8c90, {CODEC_UTF16, 0, 0, 0, F01008C0016544000, "0100EF00134F4000", "1.50"}}, // Name {0x80bfbff0, {CODEC_UTF16, 0, 0, 0, F01008C0016544000, "0100EF00134F4000", "1.50"}}, // Ptc Text {0x80bfbfd4, {CODEC_UTF16, 0, 0, 0, F01008C0016544000, "0100EF00134F4000", "1.50"}}, // Ptc Name {0x8126a538, {CODEC_UTF16, 0, 0, 0, F01008C0016544000, "0100EF00134F4000", "1.50"}}, // Info {0x8106fcbc, {CODEC_UTF16, 0, 0, 0, F01008C0016544000, "0100EF00134F4000", "1.50"}}, // More Info {0x80fad204, {CODEC_UTF16, 0, 0, 0, F01008C0016544000, "0100EF00134F4000", "1.50"}}, // Hint Part1 {0x80fad2d0, {CODEC_UTF16, 0, 0, 0, F01008C0016544000, "0100EF00134F4000", "1.50"}}, // Hint Part2 {0x80facf1c, {CODEC_UTF16, 0, 0, 0, F01008C0016544000, "0100EF00134F4000", "1.50"}}, // Loading Title {0x80fad018, {CODEC_UTF16, 0, 0, 0, F01008C0016544000, "0100EF00134F4000", "1.50"}}, // Loading Description {0x81250c50, {CODEC_UTF16, 0, 0, 0, F01008C0016544000, "0100EF00134F4000", "1.50"}}, // Tutorial h1 {0x81250df0, {CODEC_UTF16, 0, 0, 0, F01008C0016544000, "0100EF00134F4000", "1.50"}}, // Tutorial h2 {0x81251e80, {CODEC_UTF16, 0, 0, 0, F01008C0016544000, "0100EF00134F4000", "1.50"}}, // Tutorial Description1 {0x81252214, {CODEC_UTF16, 0, 0, 0, F01008C0016544000, "0100EF00134F4000", "1.50"}}, // Tutorial Description2 {0x810ae1c4, {CODEC_UTF16, 0, 0, 0, F01008C0016544000, "0100EF00134F4000", "1.50"}}, // Config Description {0x812a9bb8, {CODEC_UTF16, 0, 0, 0, F01008C0016544000, "0100EF00134F4000", "1.50"}}, // Menu Talk {0x812a9b78, {CODEC_UTF16, 0, 0, 0, F01008C0016544000, "0100EF00134F4000", "1.50"}}, // Menu Name // Harvestella {0x80af7abc, {CODEC_UTF16, 0, 0, 0, F0100B0601852A000, "0100EDD018032000", "1.0.1"}}, // Main Text {0x80c0beb8, {CODEC_UTF16, 0, 0, 0, F0100B0601852A000, "0100EDD018032000", "1.0.1"}}, // Tutorial + News {0x80b87f94, {CODEC_UTF16, 0, 0, 0, F0100B0601852A000, "0100EDD018032000", "1.0.1"}}, // Tutorial Part 2 {0x80e1c378, {CODEC_UTF16, 0, 0, 0, F0100B0601852A000, "0100EDD018032000", "1.0.1"}}, // Mission Title {0x80a7d7f4, {CODEC_UTF16, 0, 0, 0, F0100B0601852A000, "0100EDD018032000", "1.0.1"}}, // Mission Description {0x80e39130, {CODEC_UTF16, 0, 0, 0, F0100B0601852A000, "0100EDD018032000", "1.0.1"}}, // Item Name {0x80e38f80, {CODEC_UTF16, 0, 0, 0, F0100B0601852A000, "0100EDD018032000", "1.0.1"}}, // Item Description Part1 {0x80e38ea8, {CODEC_UTF16, 0, 0, 0, F0100B0601852A000, "0100EDD018032000", "1.0.1"}}, // Item Description Part2 // Sen no Hatou, Tsukisome no Kouki {0x8003fc90, {CODEC_UTF8, 1, 0, 0, 0, "0100F8A017BAA000", "1.0.0"}}, // text1 {0x8017a740, {CODEC_UTF8, 0, 0, 0, 0, "0100F8A017BAA000", "1.0.0"}}, // text2 // Olympia Soiree {0x8002ad60, {CODEC_UTF8, 31, 0, 0, F0100C310110B4000, "0100F9D00C186000", "1.0.0"}}, {0x8004b9e0, {CODEC_UTF8, 1, 0, 0, F0100C310110B4000, "0100F9D00C186000", "1.0.0"}}, // Getsuei no Kusari -Sakuran Paranoia- {0x21801c, {0, 2, 0, 0, F0100F7401AA74000, "0100F7401AA74000", "1.0.0"}}, // text,sjis {0x228fac, {0, 1, 0, 0, F0100F7401AA74000, "0100F7401AA74000", "1.0.0"}}, // choices {0x267f24, {0, 1, 0, 0, F0100F7401AA74000, "0100F7401AA74000", "1.0.0"}}, // dictionary // Xenoblade Chronicles 2 {0x8010b180, {CODEC_UTF8, 1, 0, 0, F01006F000B056000, "0100F3400332C000", "2.0.2"}}, // Text // Kanon {0x800dc524, {CODEC_UTF16, 0, 0, 0, F0100FB7019ADE000, "0100FB7019ADE000", "1.0.0"}}, // Text // Princess Arthur {0x80066e10, {0, 2, 0, 0, F0100FC2019346000, "0100FC2019346000", "1.0.0"}}, // Dialogue text ,sjis {0x8001f7d0, {0, 0, 0, 0, F0100FC2019346000, "0100FC2019346000", "1.0.0"}}, // Name // Layton’s Mystery Journey: Katrielle and the Millionaires’ Conspiracy {0x8025d520, {0, 2, 0, 0, F0100FDB00AA80000, "0100FDB00AA80000", "1.1.0"}}, // All Text ,sjis // Xenoblade Chronicles: Definitive Edition {0x808a5670, {CODEC_UTF8, 1, 0, 0, F0100FF500E34A000, "0100FF500E34A000", "1.1.2"}}, // Main Text {0x80305968, {CODEC_UTF8, 1, 0, 0, F0100FF500E34A000, "0100FF500E34A000", "1.1.2"}}, // Choices {0x8029edc8, {CODEC_UTF8, 0, 0, 0, F0100FF500E34A000, "0100FF500E34A000", "1.1.2"}}, // Item Name {0x8029ede8, {CODEC_UTF8, 0, 0, 0, F0100FF500E34A000, "0100FF500E34A000", "1.1.2"}}, // Item Description {0x8026a454, {CODEC_UTF8, 0, 0, 0, F0100FF500E34A000, "0100FF500E34A000", "1.1.2"}}, // Acquired Item Name {0x803c725c, {CODEC_UTF8, 0, 0, 0, F0100FF500E34A000, "0100FF500E34A000", "1.1.2"}}, // Acquired Item Notification {0x802794cc, {CODEC_UTF8, 0, 0, 0, F0100FF500E34A000, "0100FF500E34A000", "1.1.2"}}, // Location Discovered // Unicorn Overlord {0x805ae1f8, {CODEC_UTF8, 1, 0, 0, F01000AE01954A000, "01000AE01954A000", "1.00"}}, // Text // Octopath Traveler {0x8005ef78, {CODEC_UTF32, 0, 0, 0, 0, "01000E200DC58000", "1.0.0"}}, // Text // The World Ends with You: Final Remix {0x80706ab8, {CODEC_UTF16, 2, 0, 0, F01006F000B056000, "01001C1009892000", "1.0.0"}}, // Text // JackJanne {0x81f02cd8, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100982015606000, "01001DD010A2E800", "1.0.5"}}, // Text {0x821db028, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100982015606000, "01001DD010A2E800", "1.0.5"}}, // choice // Collar x Malice {0x800444c4, {CODEC_UTF8, 0, 0, 0, 0, "01002B400E9DA000", "1.0.0"}}, // Text // Kanda Alice mo Suiri Suru. {0x80041db0, {0, 0, 0, 0, F01003BD013E30000, "01003BD013E30000", "1.0.0"}}, // sjis // Rune Factory 3 Special {0x81fb3364, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F01001EF017BE6000, "01001EF017BE6000", "1.0.4"}}, // Main Text {0x826c0f20, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<1>, F01001EF017BE6000, "01001EF017BE6000", "1.0.4"}}, // Aproach {0x81fb3320, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F01001EF017BE6000, "01001EF017BE6000", "1.0.4"}}, // Choices {0x821497e8, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<1>, F01001EF017BE6000, "01001EF017BE6000", "1.0.4"}}, // Calendar {0x826ba1a0, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<1>, F01001EF017BE6000, "01001EF017BE6000", "1.0.4"}}, // Info {0x823f6200, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F01001EF017BE6000, "01001EF017BE6000", "1.0.4"}}, // More Info {0x826c381c, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<1>, F01001EF017BE6000, "01001EF017BE6000", "1.0.4"}}, // Item Select Name // Toraware no Paruma -Refrain- {0x80697300, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<1>, F01000EA00D2EE000, "01000EA00D2EE000", "1.0.0"}}, // text x1 {0x806f43c0, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F01000EA00D2EE000, "01000EA00D2EE000", "1.0.0"}}, // name x0 {0x80d2aca4, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F01000EA00D2EE000, "01000EA00D2EE000", "1.0.0"}}, // choice x0 {0x804b04c8, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F01000EA00D2EE000, "01000EA00D2EE000", "1.0.0"}}, // alert x0 {0x804b725c, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F01000EA00D2EE000, "01000EA00D2EE000", "1.0.0"}}, // prompt x0 // Aiyoku no Eustia {0x804BEFD0, {CODEC_UTF8, 0, 0, 0, F01006590155AC000, "01001CC017BB2000", "1.0.0"}}, // x0 - name {0x804BEFE8, {CODEC_UTF8, 0, 0, 0, F01006590155AC000, "01001CC017BB2000", "1.0.0"}}, // x0 - dialogue {0x804d043c, {CODEC_UTF8, 0, 0, 0, F01006590155AC000, "01001CC017BB2000", "1.0.0"}}, // x0 - choice // Jakou no Lyla ~Trap of MUSK~ {0x80167100, {CODEC_UTF32, 1, 0, 0, F010093800DB1C000, "010093800DB1C000", "1.0.0"}}, // x1 text + name (unformated), #T1 #T2, #T0/* 1. European night */ {0x801589a0, {CODEC_UTF32, 1, 0, 0, F010093800DB1C000, "010093800DB1C000", "1.0.0"}}, // x0=x1=choice (sig=SltAdd) {0x801b4300, {CODEC_UTF32, 1, 0, 0, F010093800DB1C000, "010093800DB1C000", "1.0.0"}}, // x1 text + name (unformated), #T1 #T2, #T0/* 2. Asian night */ {0x802a9170, {CODEC_UTF32, 1, 0, 0, F010093800DB1C000, "010093800DB1C000", "1.0.0"}}, // x0=x1=choice (sig=SltAdd) {0x80301e80, {CODEC_UTF32, 1, 0, 0, F010093800DB1C000, "010093800DB1C000", "1.0.0"}}, // x1 text + name (unformated), #T1 #T2, #T0/* 3. Arabic night */ {0x803f7a90, {CODEC_UTF32, 1, 0, 0, F010093800DB1C000, "010093800DB1C000", "1.0.0"}}, // x0=x1=choice (sig=SltAdd) // Galleria no Chika Meikyuu to Majo no Ryodan ガレリアの地下迷宮と魔女ノ旅団 {0x8002f64c, {CODEC_UTF8, 0, 0, 0, 0, "01007010157B4000", "1.0.1"}}, // Main Text // Dragon's Dogma: Dark Arisen {0x81023a80, {CODEC_UTF8, 1, 0, 0, F010057E00AC56000, "010057E00AC56000", "1.0.1"}}, // Main Text {0x8103e140, {CODEC_UTF8, 1, 0, 0, F010057E00AC56000, "010057E00AC56000", "1.0.1"}}, // Allies + Cutscene Text {0x8103bb10, {CODEC_UTF8, 1, 0, 0, F010057E00AC56000, "010057E00AC56000", "1.0.1"}}, // NPC Text {0x80150720, {CODEC_UTF8, 0, 0, 0, F010057E00AC56000, "010057E00AC56000", "1.0.1"}}, // Intro Message {0x80df90a8, {CODEC_UTF8, 0, 0, 0, F010057E00AC56000, "010057E00AC56000", "1.0.1"}}, // Info1 {0x80ce2bb8, {CODEC_UTF8, 0, 0, 0, F010057E00AC56000, "010057E00AC56000", "1.0.1"}}, // Info2 {0x80292d84, {CODEC_UTF8, 0, 0, 0, F010057E00AC56000, "010057E00AC56000", "1.0.1"}}, // Info Popup1 {0x80cfac6c, {CODEC_UTF8, 0, 0, 0, F010057E00AC56000, "010057E00AC56000", "1.0.1"}}, // Info Popup2 {0x8102d460, {CODEC_UTF8, 1, 0, 0, F010057E00AC56000, "010057E00AC56000", "1.0.1"}}, // Description // Yo-kai Watch Jam - Yo-kai Academy Y: Waiwai Gakuen {0x80dd0cec, {CODEC_UTF8, 0, 0, 0, F010051D010FC2000, "010051D010FC2000", "4.0.0"}}, // Dialogue text {0x80e33450, {CODEC_UTF8, 3, 0, 0, F010051D010FC2000, "010051D010FC2000", "4.0.0"}}, // Other Dialogue text {0x80c807c0, {CODEC_UTF8, 0, 0, 0, F010051D010FC2000, "010051D010FC2000", "4.0.0"}}, // Item description etc text {0x808d9a30, {CODEC_UTF8, 0, 0, 0, F010051D010FC2000, "010051D010FC2000", "4.0.0"}}, // Tutorial Text {0x811b95ac, {CODEC_UTF8, 3, 0, 0, F010051D010FC2000, "010051D010FC2000", "4.0.0"}}, // Menu screen {0x80e20290, {CODEC_UTF8, 3, 0, 0, F010051D010FC2000, "010051D010FC2000", "4.0.0"}}, // Opening Song Text etc {0x80c43680, {CODEC_UTF8, 3, 0, 0, F010051D010FC2000, "010051D010FC2000", "4.0.0"}}, // Cutscene Text // NEO: The World Ends With You {0x81581d6c, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<1>, F010043B013C5C000, "010043B013C5C000", "1.03"}}, // Text {0x818eb248, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F010043B013C5C000, "010043B013C5C000", "1.03"}}, // Objective {0x81db84a4, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F010043B013C5C000, "010043B013C5C000", "1.03"}}, // Menu: Collection Item Name {0x81db8660, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<1>, F010043B013C5C000, "010043B013C5C000", "1.03"}}, // Menu: Collection Item Description {0x81c71a48, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F010043B013C5C000, "010043B013C5C000", "1.03"}}, // Tutorial Title {0x81c71b28, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F010043B013C5C000, "010043B013C5C000", "1.03"}}, // Tutorial Description // Eiyuden Chronicle: Rising {0x82480190, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<1>, 0, "010039B015CB6000", "1.02"}}, // Main Text {0x824805d0, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<1>, 0, "010039B015CB6000", "1.02"}}, // Name {0x81f05c44, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, 0, "010039B015CB6000", "1.02"}}, // Intro Text {0x82522ac4, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, 0, "010039B015CB6000", "1.02"}}, // Character Info {0x81b715f4, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, 0, "010039B015CB6000", "1.02"}}, // Info {0x825274d0, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<1>, 0, "010039B015CB6000", "1.02"}}, // Info2 {0x825269b0, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, 0, "010039B015CB6000", "1.02"}}, // Tutorial Title {0x82526a0c, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, 0, "010039B015CB6000", "1.02"}}, // Tutorial Description {0x82523e04, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, 0, "010039B015CB6000", "1.02"}}, // Objective Title {0x82524160, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, 0, "010039B015CB6000", "1.02"}}, // Objective Description {0x81f0351c, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, 0, "010039B015CB6000", "1.02"}}, // Location Selection Title {0x81f0358c, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, 0, "010039B015CB6000", "1.02"}}, // Location Selection Description {0x81f0d520, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, 0, "010039B015CB6000", "1.02"}}, // Quest Title {0x81f0d58c, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, 0, "010039B015CB6000", "1.02"}}, // Quest Description {0x81f00318, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, 0, "010039B015CB6000", "1.02"}}, // Help Title {0x81f00368, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, 0, "010039B015CB6000", "1.02"}}, // Help Description {0x81f0866c, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, 0, "010039B015CB6000", "1.02"}}, // Config Description // Ghost Trick: Phantom Detective {0x81448898, {CODEC_UTF16, 0, 0, 0, F010043B013C5C000, "010029B018432000", "1.0.0"}}, // Main Text {0x80c540d4, {CODEC_UTF16, 0, 0, 0, F010043B013C5C000, "010029B018432000", "1.0.0"}}, // Secondary Text {0x80e50dd4, {CODEC_UTF16, 0, 0, 0, F010043B013C5C000, "010029B018432000", "1.0.0"}}, // Object Name {0x80f91c08, {CODEC_UTF16, 0, 0, 0, F010043B013C5C000, "010029B018432000", "1.0.0"}}, // Language Selection {0x805c9014, {CODEC_UTF16, 0, 0, 0, F010043B013C5C000, "010029B018432000", "1.0.0"}}, // Story/Character Info // Higurashi no Naku Koro ni Hou {0x800bd6c8, {0, 0, 0, 0, F0100F6A00A684000, "0100F6A00A684000", "1.0.0"}}, // sjis {0x800c2d20, {0, 0, 0, 0, F0100F6A00A684000, "0100F6A00A684000", "1.2.0"}}, // sjis // Umineko no Naku Koro ni Saku ~Nekobako to Musou no Koukyoukyoku~ {0x800b4560, {CODEC_UTF8, 0, 0, 0, 0, "01006A300BA2C000", "1.0.0"}}, // x0 name + text (bottom, center) - whole line. filter is to complex, quit. {0x801049c0, {CODEC_UTF8, 0, 0, 0, 0, "01006A300BA2C000", "1.0.0"}}, // x0 prompt, bottomLeft {0x80026378, {CODEC_UTF8, 0, 0, 0, 0, "01006A300BA2C000", "1.0.0"}}, // x0 Yes|No {0x801049a8, {CODEC_UTF8, 0, 0, 0, 0, "01006A300BA2C000", "1.0.0"}}, // x0 topLeft (double: ♪ + text) // Koroshiya to Strawberry- Plus {0x81322cec, {CODEC_UTF16, 0, 0, ReadTextAndLenW<0>, F010042300C4F6000, "0100E390145C8000", "1.0.0"}}, // dialogue {0x819b1a78, {CODEC_UTF16, 0, 0, ReadTextAndLenW<2>, F010042300C4F6000, "0100E390145C8000", "1.0.0"}}, // dialogue {0x81314e8c, {CODEC_UTF16, 0, 0, ReadTextAndLenW<0>, F010042300C4F6000, "0100E390145C8000", "1.0.0"}}, // dialogue // Tokimeki Memorial Girl's Side 1st Love for Nintendo Switch {0x822454a4, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100D9A01BD86000, "0100D9A01BD86000", "1.0.1"}}, // dialogue1 {0x82247138, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100D9A01BD86000, "0100D9A01BD86000", "1.0.1"}}, // dialogue2 {0x822472e0, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100D9A01BD86000, "0100D9A01BD86000", "1.0.1"}}, // dialogue3 {0x82156988, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100D9A01BD86000, "0100D9A01BD86000", "1.0.1"}}, // choice {0x82642200, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<2>, F0100D9A01BD86000, "0100D9A01BD86000", "1.0.1"}}, // option1 {0x81ecd758, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100D9A01BD86000, "0100D9A01BD86000", "1.0.1"}}, // option2 {0x823185e4, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100D9A01BD86000, "0100D9A01BD86000", "1.0.1"}}, // mail {0x823f2edc, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100D9A01BD86000, "0100D9A01BD86000", "1.0.1"}}, // roomDescript {0x821e3cf0, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100D9A01BD86000, "0100D9A01BD86000", "1.0.1"}}, // dateDescript {0x81e20050, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100D9A01BD86000, "0100D9A01BD86000", "1.0.1"}}, // characterDesc1 {0x81e1fe50, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100D9A01BD86000, "0100D9A01BD86000", "1.0.1"}}, // characterDesc2 {0x81e1feb0, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100D9A01BD86000, "0100D9A01BD86000", "1.0.1"}}, // characterDesc3 {0x81e1ff04, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100D9A01BD86000, "0100D9A01BD86000", "1.0.1"}}, // characterDesc4 {0x821d03b0, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<3>, F0100D9A01BD86000, "0100D9A01BD86000", "1.0.1"}}, // news {0x82312008, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100D9A01BD86000, "0100D9A01BD86000", "1.0.1"}}, // luckyitem // Triangle Strategy {0x80aadebc, {CODEC_UTF16, 0, 0, 0, F0100CC80140F8000<0>, "0100CC80140F8000", "1.1.0"}}, // Main Text {0x81358ce4, {CODEC_UTF16, 3, 0, 0, F0100CC80140F8000<1>, "0100CC80140F8000", "1.1.0"}}, // Secondary Text {0x80a38988, {CODEC_UTF16, 0, 0, 0, F0100CC80140F8000<2>, "0100CC80140F8000", "1.1.0"}}, // Info Contents {0x80aa4aec, {CODEC_UTF16, 0, 0, 0, F0100CC80140F8000<3>, "0100CC80140F8000", "1.1.0"}}, // Info {0x80b1f300, {CODEC_UTF16, 0, 0, 0, F0100CC80140F8000<4>, "0100CC80140F8000", "1.1.0"}}, // Difficulty Selection Part1 {0x80b1f670, {CODEC_UTF16, 0, 0, 0, F0100CC80140F8000<5>, "0100CC80140F8000", "1.1.0"}}, // Difficulty Selection Part2 {0x80aa48f0, {CODEC_UTF16, 0, 0, 0, F0100CC80140F8000<6>, "0100CC80140F8000", "1.1.0"}}, // PopUp Message // Xenoblade Chronicles 3 {0x80cf6ddc, {CODEC_UTF8, 0, 0, 0, F010074F013262000, "010074F013262000", "2.2.0"}}, // Main Text {0x80e76150, {CODEC_UTF8, 0, 0, 0, F010074F013262000, "010074F013262000", "2.2.0"}}, // Secondary Text {0x807b4ee4, {CODEC_UTF8, 1, 0, 0, F010074F013262000, "010074F013262000", "2.2.0"}}, // Tutorial Description {0x80850218, {CODEC_UTF8, 0, 0, 0, F010074F013262000, "010074F013262000", "2.2.0"}}, // Objective // CLOCK ZERO ~Shuuen no Ichibyou~ Devote {0x8003c290, {0, 0, 0, 0, F0100BDD01AAE4000, "01008C100C572000", "1.0.0"}}, // name,sjis {0x8003c184, {0, 0, 0, 0, F0100BDD01AAE4000, "01008C100C572000", "1.0.0"}}, // dialogue {0x8001f6d0, {0, 0, 0, 0, F0100BDD01AAE4000, "01008C100C572000", "1.0.0"}}, // prompt // Shuuen no Virche -ErroR:salvation {0x8001f594, {CODEC_UTF8, 0, 0x1C, 0, F0100C310110B4000, "01005B9014BE0000", "1.0.0"}}, // dialog {0x8001f668, {CODEC_UTF8, 0, 0x1C, 0, F0100C310110B4000, "01005B9014BE0000", "1.0.0"}}, // center {0x8003d540, {CODEC_UTF8, 0, 0, 0, F0100C310110B4000, "01005B9014BE0000", "1.0.0"}}, // choice // Shuuen no Virche -EpiC:lycoris- {0x8002bf6c, {CODEC_UTF8, 0, 0x1c, 0, FF010061300DF48000_2, "01004D601B0AA000", "1.0.1"}}, {0x8004e720, {CODEC_UTF8, 1, 0, 0, FF010061300DF48000_2, "01004D601B0AA000", "1.0.1"}}, // Spade no Kuni no Alice ~Wonderful White World~ / スペードの国のアリス ~Wonderful White World~ {0x8135d018, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<1>, F01008C0016544000, "01003FE00E2F8000", "1.0.0"}}, // Text + Name // Spade no Kuni no Alice ~Wonderful Black World~ (スペードの国のアリス ~Wonderful Black World~) {0x819dbdc8, {CODEC_UTF16, 0, 0x14, 0, F0100AB100E2FA000, "0100AB100E2FA000", "1.0.0"}}, {0x81f8e564, {CODEC_UTF16, 1, 0x14, 0, F0100AB100E2FA000, "0100AB100E2FA000", "1.0.0"}}, // 十三支演義 偃月三国伝1・2 for Nintendo Switch (Juuzaengi ~Engetsu Sangokuden~) {0x82031f20, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<2>, F0100DA201E0DA000, "01003D2017FEA000", "1.0.0"}}, // name {0x82ef9550, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<1>, F0100DA201E0DA000, "01003D2017FEA000", "1.0.0"}}, // dialogue {0x83252e0c, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100DA201E0DA000, "01003D2017FEA000", "1.0.0"}}, // choice // Tales of Vesperia: Definitive Edition {0x802de170, {CODEC_UTF8, 2, 0, 0, F01002C0008E52000, "01002C0008E52000", "1.0.2"}}, // Ptc Text {0x802cf170, {CODEC_UTF8, 3, 0, 0, F01002C0008E52000, "01002C0008E52000", "1.0.2"}}, // Cutscene {0x8019957c, {CODEC_UTF8, 0, 0, 0, F01002C0008E52000, "01002C0008E52000", "1.0.2"}}, // Conversation {0x802c0600, {CODEC_UTF8, 2, 0, 0, F01002C0008E52000, "01002C0008E52000", "1.0.2"}}, // Info {0x801135fc, {CODEC_UTF8, 0, 0, 0, F01002C0008E52000, "01002C0008E52000", "1.0.2"}}, // Post Battle Text // Nil Adminari no Tenbin Irodori Nadeshiko {0x8005fd5c, {CODEC_UTF8, 0, 0, 0, F0100BDD01AAE4000, "01002BB00A662000", "1.0.0"}}, // name {0x800db0d8, {CODEC_UTF8, 0, 20, 0, F0100BDD01AAE4000, "01002BB00A662000", "1.0.0"}}, // name // Hanayaka Nari, Waga Ichizoku Modern Nostalgie {0x2509ac, {CODEC_UTF8, 0, 0, T0100B5500CA0C000, F0100B5500CA0C000, "01008DE00C022000", "1.0.0"}}, // Hanayaka Nari, Waga Ichizoku Gentou Nostalgie {0x27ca10, {CODEC_UTF8, 0, 0, T0100B5500CA0C000, F0100B5500CA0C000, "0100B5500CA0C000", "1.0.0"}}, // x3 (double trigged), name+text, onscreen // Master Detective Archives: Rain Code {0x80bf2034, {CODEC_UTF16, 0, 0, 0, F0100F4401940A000, "0100F4401940A000", "1.3.3"}}, // Dialogue text {0x80c099d4, {CODEC_UTF16, 0, 0, 0, F0100F4401940A000, "0100F4401940A000", "1.3.3"}}, // Cutscene text {0x80cbf1f4, {CODEC_UTF16, 0, 0, 0, F0100F4401940A000, "0100F4401940A000", "1.3.3"}}, // Menu {0x80cbc11c, {CODEC_UTF16, 0, 0, 0, F0100DA201E0DA000, "0100F4401940A000", "1.3.3"}}, // Menu Item Description {0x80cacc14, {CODEC_UTF16, 0, 0, 0, F0100DA201E0DA000, "0100F4401940A000", "1.3.3"}}, // Menu Item Description 2 {0x80cd6410, {CODEC_UTF16, 0, 0, 0, F0100DA201E0DA000, "0100F4401940A000", "1.3.3"}}, // Menu Item Description 3 {0x80c214d4, {CODEC_UTF16, 0, 0, 0, F0100F4401940A000, "0100F4401940A000", "1.3.3"}}, // Description {0x80cc9908, {CODEC_UTF16, 0, 0, 0, F0100DA201E0DA000, "0100F4401940A000", "1.3.3"}}, // Mini game item description {0x80bce36c, {CODEC_UTF16, 0, 0, 0, F0100F4401940A000, "0100F4401940A000", "1.3.3"}}, // Tutorial {0x80bcb7d4, {CODEC_UTF16, 0, 0, 0, F0100F4401940A000, "0100F4401940A000", "1.3.3"}}, // Loading Screen information {0x80bf32d8, {CODEC_UTF16, 0, 0, 0, F0100F4401940A000, "0100F4401940A000", "1.3.3"}}, // Choices // Fire Emblem: Three Houses {0x8041e6bc, {CODEC_UTF8, 0, 0, 0, F010055D009F78000, "010055D009F78000", "1.2.0"}}, // Main Text {0x805ca570, {CODEC_UTF8, 0, 0, 0, F010055D009F78000, "010055D009F78000", "1.2.0"}}, // Cutscene Text {0x8049f1e8, {CODEC_UTF8, 0, 0, 0, F010055D009F78000, "010055D009F78000", "1.2.0"}}, // Cutscene Text Scroll {0x805ee730, {CODEC_UTF8, 0, 0, 0, F010055D009F78000, "010055D009F78000", "1.2.0"}}, // Info {0x805ee810, {CODEC_UTF8, 0, 0, 0, F010055D009F78000, "010055D009F78000", "1.2.0"}}, // Info Choice {0x80467a60, {CODEC_UTF8, 0, 0, 0, F010055D009F78000, "010055D009F78000", "1.2.0"}}, // Location First Part {0x805f0340, {CODEC_UTF8, 0, 0, 0, F010055D009F78000, "010055D009F78000", "1.2.0"}}, // Location Second Part {0x801faae4, {CODEC_UTF8, 0, 0, 0, F010055D009F78000, "010055D009F78000", "1.2.0"}}, // Action Location {0x803375e8, {CODEC_UTF8, 0, 0, 0, F010055D009F78000, "010055D009F78000", "1.2.0"}}, // Objective {0x805fd870, {CODEC_UTF8, 0, 0, 0, F010055D009F78000, "010055D009F78000", "1.2.0"}}, // Tutorial {0x804022f8, {CODEC_UTF8, 0, 0, 0, F010055D009F78000, "010055D009F78000", "1.2.0"}}, // Request {0x802f7df4, {CODEC_UTF8, 0, 0, 0, F010055D009F78000, "010055D009F78000", "1.2.0"}}, // Quest Description {0x8031af0c, {CODEC_UTF8, 0, 0, 0, F010055D009F78000, "010055D009F78000", "1.2.0"}}, // Aproach Text // Sweet Clown ~Gozen San-ji no Okashi na Doukeshi~ {0x20dbfc, {0, 0, 0x28, 0, F010028D0148E6000, "010028D0148E6000", "1.2.0"}}, // dialog, sjis {0x214978, {0, 2, 0xC, 0, F010028D0148E6000, "010028D0148E6000", "1.2.0"}}, // choices // SWEET CLOWN ~午前三時のオカシな道化師~ {0x218B40, {FULL_STRING, 1, 0, 0, F010028D0148E6000_2, "010028D0148E6000", "1.0.1"}}, // TEXT {0x20D420, {0, 0, 0, 0, 0, "010028D0148E6000", "1.0.1"}}, // NAME+TEXT // Another Code: Recollection {0x82dcad30, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<1>, F0100CB9018F5A000, "0100CB9018F5A000", "1.0.0"}}, // Main Text {0x82f2cfb0, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100CB9018F5A000, "0100CB9018F5A000", "1.0.0"}}, // Item Description {0x82dcc5fc, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100CB9018F5A000, "0100CB9018F5A000", "1.0.0"}}, // Tutorial PopUp Header {0x82dcc61c, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100CB9018F5A000, "0100CB9018F5A000", "1.0.0"}}, // Tutorial PopUp Description {0x82f89e78, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100CB9018F5A000, "0100CB9018F5A000", "1.0.0"}}, // Aproach Text {0x82973300, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<1>, F0100CB9018F5A000, "0100CB9018F5A000", "1.0.0"}}, // Chapter {0x82dd2604, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100CB9018F5A000, "0100CB9018F5A000", "1.0.0"}}, // Location {0x82bcb77c, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<1>, F0100CB9018F5A000, "0100CB9018F5A000", "1.0.0"}}, // Save Message {0x828ccfec, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100CB9018F5A000, "0100CB9018F5A000", "1.0.0"}}, // Acquired Item {0x83237b14, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100CB9018F5A000, "0100CB9018F5A000", "1.0.0"}}, // Question Options {0x82dcee10, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100CB9018F5A000, "0100CB9018F5A000", "1.0.0"}}, // Tutorial Header {0x82dcee38, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100CB9018F5A000, "0100CB9018F5A000", "1.0.0"}}, // Tutorial Description {0x82e5cadc, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100CB9018F5A000, "0100CB9018F5A000", "1.0.0"}}, // Character Info Name {0x82e5cc38, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100CB9018F5A000, "0100CB9018F5A000", "1.0.0"}}, // Character Info Description {0x82871ac8, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100CB9018F5A000, "0100CB9018F5A000", "1.0.0"}}, // Letter Message {0x82e4dad4, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100CB9018F5A000, "0100CB9018F5A000", "1.0.0"}}, // アナザーキー {0x82bd65d0, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100CB9018F5A000, "0100CB9018F5A000", "1.0.0"}}, // Message Title {0x82bd65f0, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100CB9018F5A000, "0100CB9018F5A000", "1.0.0"}}, // Message Content {0x82c1ccf0, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100CB9018F5A000, "0100CB9018F5A000", "1.0.0"}}, // Decision Header {0x82c1d218, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100CB9018F5A000, "0100CB9018F5A000", "1.0.0"}}, // Decision1 {0x82c1e43c, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100CB9018F5A000, "0100CB9018F5A000", "1.0.0"}}, // Decision2 // AI: The Somnium Files {0x8165a9a4, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100C7400CFB4000, "0100C7400CFB4000", "1.0.2"}}, // Main Text + Tutorial {0x80320dd4, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<1>, F0100C7400CFB4000, "0100C7400CFB4000", "1.0.2"}}, // Menu Interface Text1 {0x80320e20, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<1>, F0100C7400CFB4000, "0100C7400CFB4000", "1.0.2"}}, // Menu Interface Text2 // AI: The Somnium Files - nirvanA Initiative {0x8189ae64, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100BD4014D8C000, "0100BD4014D8C000", "1.0.1"}}, // Main Text + Tutorial {0x81813428, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100BD4014D8C000, "0100BD4014D8C000", "1.0.1"}}, // Hover Investigation Text {0x82e122b8, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100BD4014D8C000, "0100BD4014D8C000", "1.0.1"}}, // Info {0x82cffff8, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100BD4014D8C000, "0100BD4014D8C000", "1.0.1"}}, // Config Description {0x818c3cd8, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100BD4014D8C000, "0100BD4014D8C000", "1.0.1"}}, // File: Names {0x82ea1a38, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100BD4014D8C000, "0100BD4014D8C000", "1.0.1"}}, // File: Contents {0x82cbb1fc, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F0100BD4014D8C000, "0100BD4014D8C000", "1.0.1"}}, // Investigation Choices // Fata morgana no Yakata ~Dreams of the Revenants Edition~ / ファタモ {0x8025a998, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F01008C0016544000, "0100BE40138B8000", "1.0.1"}}, // Main Text {0x801d6050, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F01008C0016544000, "0100BE40138B8000", "1.0.1"}}, // Choices // Ni no Kuni II: Revenant Kingdom {0x80ac651c, {CODEC_UTF8, 0, 0, 0, F0100C4E013E5E000, "0100C4E013E5E000", "1.0.0"}}, // Main Text {0x80335ea0, {CODEC_UTF8, 0, 0, 0, F0100C4E013E5E000, "0100C4E013E5E000", "1.0.0"}}, // Name // Harukanaru Toki no Naka de 7 {0x800102bc, {0, 0, 0, T0100CF400F7CE000<0>, F0100CF400F7CE000, "0100CF400F7CE000", "1.0.0"}}, // name, sjis {0x80051f90, {0, 0, 0, T0100CF400F7CE000<1>, F0100CF400F7CE000, "0100CF400F7CE000", "1.0.0"}}, // text {0x80010b48, {0, 0, 0, T0100CF400F7CE000<0>, F0100CF400F7CE000, "0100CF400F7CE000", "1.0.0"}}, // prompt {0x80010c80, {0, 0, 0, T0100CF400F7CE000<0>, F0100CF400F7CE000, "0100CF400F7CE000", "1.0.0"}}, // choice // Angelique Luminarise {0x80046c04, {0, 0, 0, T0100CF400F7CE000<0>, F0100CF400F7CE000, "0100D11018A7E000", "1.0.0"}}, // ingameDialogue, sjis {0x80011284, {0, 0, 0, T0100CF400F7CE000<0>, F0100CF400F7CE000, "0100D11018A7E000", "1.0.0"}}, // choice {0x80011140, {0, 0, 0, T0100CF400F7CE000<0>, F0100CF400F7CE000, "0100D11018A7E000", "1.0.0"}}, // prompt first // Star Ocean The Second Story R {0x81d5e4d0, {0, 0, 0, ReadTextAndLenDW<1>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // Main Text + Tutorial {0x81d641b4, {0, 0, 0, ReadTextAndLenDW<0>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // Intro Cutscene {0x824b1f00, {0, 0, 0, ReadTextAndLenDW<0>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // Character Selection Name {0x81d4c670, {0, 0, 0, ReadTextAndLenDW<0>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // Character Selection Lore {0x8203a048, {0, 0, 0, ReadTextAndLenDW<0>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // General Description {0x82108cd0, {0, 0, 0, ReadTextAndLenDW<1>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // Unique Spot Title {0x827a9848, {0, 0, 0, ReadTextAndLenDW<0>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // Chest Item {0x82756890, {0, 0, 0, ReadTextAndLenDW<1>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // Info {0x82241410, {0, 0, 0, ReadTextAndLenDW<0>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // Menu Talk {0x81d76404, {0, 0, 0, ReadTextAndLenDW<0>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // Secondary Talk {0x821112e0, {0, 0, 0, ReadTextAndLenDW<0>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // Location {0x82111320, {0, 0, 0, ReadTextAndLenDW<0>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // Location Interior {0x81d6ea24, {0, 0, 0, ReadTextAndLenDW<1>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // Special Arts/Spells Name {0x81d6ea68, {0, 0, 0, ReadTextAndLenDW<0>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // Special Arts/Spells Description {0x81d6ed48, {0, 0, 0, ReadTextAndLenDW<0>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // Special Arts/Spells Range {0x81d6eb3c, {0, 0, 0, ReadTextAndLenDW<0>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // Special Arts/Spells Effect {0x81d6f880, {0, 0, 0, ReadTextAndLenDW<0>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // Special Arts/Spells Bonus {0x8246d81c, {0, 0, 0, ReadTextAndLenDW<0>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // Tactics Name {0x8246d83c, {0, 0, 0, ReadTextAndLenDW<0>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // Tactics Description {0x8212101c, {0, 0, 0, ReadTextAndLenDW<0>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // Achievements Name {0x82121088, {0, 0, 0, ReadTextAndLenDW<0>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // Achievements Description {0x81d6c480, {0, 0, 0, ReadTextAndLenDW<0>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // Acquired Item1 {0x821143f0, {0, 0, 0, ReadTextAndLenDW<0>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // Acquired Item2 {0x81d6fb18, {0, 0, 0, ReadTextAndLenDW<1>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // Battle Skill Name {0x81d6fb4c, {0, 0, 0, ReadTextAndLenDW<0>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // Battle Skill Description {0x81d6fb7c, {0, 0, 0, ReadTextAndLenDW<0>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // Battle Skill Bonus Description {0x8212775c, {0, 0, 0, ReadTextAndLenDW<0>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // Battle Item Name {0x82127788, {0, 0, 0, ReadTextAndLenDW<0>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // Battle Item Description {0x821361ac, {0, 0, 0, ReadTextAndLenDW<0>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // Battle Ability Name {0x821361f4, {0, 0, 0, ReadTextAndLenDW<0>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // Battle Ability Range {0x82136218, {0, 0, 0, ReadTextAndLenDW<0>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // Battle Ability Effect {0x8238451c, {0, 0, 0, ReadTextAndLenDW<0>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // Battle Strategy Name {0x82134610, {0, 0, 0, ReadTextAndLenDW<0>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // Battle Acquired Item {0x824b5eac, {0, 0, 0, ReadTextAndLenDW<0>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // Item Name {0x824b5f04, {0, 0, 0, ReadTextAndLenDW<0>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // Item Description {0x824b5f54, {0, 0, 0, ReadTextAndLenDW<0>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // Item Effect {0x81d71790, {0, 0, 0, ReadTextAndLenDW<0>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // Item Factor Title {0x824b62c0, {0, 0, 0, ReadTextAndLenDW<0>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // Item Factor Description {0x824c2e2c, {0, 0, 0, ReadTextAndLenDW<1>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // IC/Specialty Skills Name {0x824c2e54, {0, 0, 0, ReadTextAndLenDW<0>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // IC/Specialty Skills Description {0x824c2fbc, {0, 0, 0, ReadTextAndLenDW<1>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // IC/Specialty Skills Level {0x823e7230, {0, 0, 0, ReadTextAndLenDW<0>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // IC/Specialty Name {0x823e94bc, {0, 0, 0, ReadTextAndLenDW<0>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // IC/Specialty Description {0x823e9980, {0, 0, 0, ReadTextAndLenDW<0>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // IC/Specialty Talent {0x823ea9c4, {0, 0, 0, ReadTextAndLenDW<0>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // IC/Specialty Support Item {0x82243b18, {0, 0, 0, ReadTextAndLenDW<1>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // Enemy Info Skills {0x81d64540, {0, 0, 0, ReadTextAndLenDW<0>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // Guild Mission Description {0x823b4f6c, {0, 0, 0, ReadTextAndLenDW<0>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // Guild Mission Reward {0x826facd8, {0, 0, 0, ReadTextAndLenDW<0>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // Challenge Mission Description {0x826f98f8, {0, 0, 0, ReadTextAndLenDW<0>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // Challenge Mission Reward {0x8244af2c, {0, 0, 0, ReadTextAndLenDW<0>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // Formation Name {0x8244ae90, {0, 0, 0, ReadTextAndLenDW<0>, F010065301A2E0000, "010065301A2E0000", "1.0.2"}}, // Formation Description // 魔法使いの夜 通常版 {0x80086ba0, {CODEC_UTF8, 0, 0, T010012A017F18000, 0, "010012A017F18000", "1.0.0"}}, {0x80086e70, {CODEC_UTF8, 0, 0, T010012A017F18000, 0, "010012A017F18000", "1.0.2"}}, // 月姫 -A piece of blue glass moon- {0x800ac290, {CODEC_UTF8, 0, 0, T010012A017F18000, 0, "01001DC01486A000", 0}}, // 1.0.1,1.0.2 // The Quintessential Quintuplets the Movie: Five Memories of My Time with You (JP) {0x80011688, {CODEC_UTF8, 1, 0, 0, F01005E9016BDE000, "01005E9016BDE000", "1.0.0"}}, // dialogue, menu, choice, name // Flowers: Les Quatre Saisons {0x8006f940, {CODEC_UTF16, 1, 0, 0, F01002AE00F442000, "01002AE00F442000", "1.0.1"}}, // 最悪なる災厄人間に捧ぐ eSHOP [01000A400AF2A000][v0] {0x8034EB44, {CODEC_UTF16, 8, 0, 0, F01000A400AF2A000, "01000A400AF2A000", "1.0.0"}}, // text // 神様のような君へ {0x80487CD0, {CODEC_UTF8, 0, 0, 0, F01006B5014E2E000, "01006B5014E2E000", "1.0.0"}}, // text // BUSTAFELLOWS {0x80191b18, {CODEC_UTF16, 0, 0, ReadTextAndLenW<0>, F0100874017BE2000, "010060800B7A8000", "1.1.3"}}, // Dialogue {0x80191f88, {CODEC_UTF16, 0, 0, ReadTextAndLenW<0>, F0100874017BE2000, "010060800B7A8000", "1.1.3"}}, // Choice {0x801921a4, {CODEC_UTF16, 0, 0, ReadTextAndLenW<0>, F0100874017BE2000, "010060800B7A8000", "1.1.3"}}, // Choice 2 {0x801935f0, {CODEC_UTF16, 0, 0, ReadTextAndLenW<0>, F0100874017BE2000, "010060800B7A8000", "1.1.3"}}, // option // Moujuutsukai to Ouji-sama ~Flower & Snow~ {0x800a1a10, {CODEC_UTF8, 1, 0, 0, F01001B900C0E2000, "01001B900C0E2000", "1.0.0"}}, // Dialogue 1 {0x80058f80, {CODEC_UTF8, 1, 0, 0, F01001B900C0E2000, "01001B900C0E2000", "1.0.0"}}, // Dialogue 2 // Detective Pikachu Returns {0x81585750, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<2>, F010007500F27C000, "010007500F27C000", "1.0.0"}}, // All Text // Dragon Quest Treasures {0x80bd62c4, {CODEC_UTF16, 0, 0, 0, F0100217014266000, "0100217014266000", "1.0.1"}}, // Cutscene {0x80a74b64, {CODEC_UTF16, 0, 0, 0, F0100217014266000, "0100217014266000", "1.0.1"}}, // Ptc Text {0x80a36d18, {CODEC_UTF16, 0, 0, 0, F0100217014266000, "0100217014266000", "1.0.1"}}, // Info {0x80c43878, {CODEC_UTF16, 0, 0, 0, F0100217014266000, "0100217014266000", "1.0.1"}}, // Tutorial Title {0x80c43d50, {CODEC_UTF16, 0, 0, 0, F0100217014266000, "0100217014266000", "1.0.1"}}, // Tutorial Description {0x80a72598, {CODEC_UTF16, 0, 0, 0, F0100217014266000, "0100217014266000", "1.0.1"}}, // Aproach Text // Rune Factory 4 Special {0x48b268, {CODEC_UTF8, 3, 0, 0, F010027100C79A000, "010027100C79A000", "1.0.1"}}, // All Text // The Legend of Zelda: Skyward Sword HD {0x80dc36dc, {CODEC_UTF16 | FULL_STRING, 3, 0, 0, F01001EF017BE6000, "01002DA013484000", "1.0.1"}}, // All Text // World of Final Fantasy Maxima {0x8068fea0, {CODEC_UTF8, 0, 0, 0, F010072000BD32000, "010072000BD32000", "1.0.0"}}, // Cutscene {0x802c6a48, {CODEC_UTF8, 0, 0, 0, F010072000BD32000, "010072000BD32000", "1.0.0"}}, // Action Text {0x803a523c, {CODEC_UTF8, 1, 0, 0, F010072000BD32000, "010072000BD32000", "1.0.0"}}, // Location {0x8041ed64, {CODEC_UTF8, 0, 0, 0, F010072000BD32000, "010072000BD32000", "1.0.0"}}, // Info {0x802c9f1c, {CODEC_UTF8, 0, 0, 0, F010072000BD32000, "010072000BD32000", "1.0.0"}}, // Chapter First Part {0x802c9f6c, {CODEC_UTF8, 0, 0, 0, F010072000BD32000, "010072000BD32000", "1.0.0"}}, // Chapter Second Part // Tokyo Xanadu eX+ {0x8025135c, {CODEC_UTF8, 1, 0, 0, F010080C01AA22000, "010080C01AA22000", "1.0.0"}}, // Name {0x80251068, {CODEC_UTF8, 0, 0, 0, F010080C01AA22000, "010080C01AA22000", "1.0.0"}}, // Main Text {0x802ac86c, {CODEC_UTF8, 0, 0, 0, F010080C01AA22000, "010080C01AA22000", "1.0.0"}}, // Action Text {0x802b04b4, {CODEC_UTF8, 0, 0, 0, F010080C01AA22000, "010080C01AA22000", "1.0.0"}}, // Choices {0x8013243c, {CODEC_UTF8, 0, 0, 0, F010080C01AA22000, "010080C01AA22000", "1.0.0"}}, // Location {0x802b1f3c, {CODEC_UTF8, 0, 0, 0, F010080C01AA22000, "010080C01AA22000", "1.0.0"}}, // Info {0x802ab46c, {CODEC_UTF8, 0, 0, 0, F010080C01AA22000, "010080C01AA22000", "1.0.0"}}, // Documents // DORAEMON STORY OF SEASONS: Friends of the Great Kingdom {0x839558e4, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<1>, F01009B50139A8000, "01009B50139A8000", "1.1.1"}}, // Text {0x8202a9b0, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F01009B50139A8000, "01009B50139A8000", "1.1.1"}}, // Tutorial // Monster Hunter Stories 2: Wings of Ruin {0x8042fe60, {CODEC_UTF8, 1, 0, 0, F0100CB700D438000, "0100CB700D438000", "1.5.2"}}, // Cutscene {0x804326c0, {CODEC_UTF8, 1, 0, 0, F0100CB700D438000, "0100CB700D438000", "1.5.2"}}, // Ptc Text {0x804d3d44, {CODEC_UTF8, 0, 0, 0, F0100CB700D438000, "0100CB700D438000", "1.5.2"}}, // Info {0x8045e7c8, {CODEC_UTF8, 0, 0, 0, F0100CB700D438000, "0100CB700D438000", "1.5.2"}}, // Info Choice {0x805cec4c, {CODEC_UTF8, 0, 0, 0, F0100CB700D438000, "0100CB700D438000", "1.5.2"}}, // Config Header {0x8078c2d0, {CODEC_UTF8, 0, 0, 0, F0100CB700D438000, "0100CB700D438000", "1.5.2"}}, // Config Name+ {0x805d0858, {CODEC_UTF8, 0, 0, 0, F0100CB700D438000, "0100CB700D438000", "1.5.2"}}, // Config Description {0x807612d4, {CODEC_UTF8, 0, 0, 0, F0100CB700D438000, "0100CB700D438000", "1.5.2"}}, // Notice {0x807194a0, {CODEC_UTF8, 1, 0, 0, F0100CB700D438000, "0100CB700D438000", "1.5.2"}}, // Update Content + Tutorial {0x804d687c, {CODEC_UTF8, 0, 0, 0, F0100CB700D438000, "0100CB700D438000", "1.5.2"}}, // Objective Title {0x804d6a7c, {CODEC_UTF8, 0, 0, 0, F0100CB700D438000, "0100CB700D438000", "1.5.2"}}, // Objective Description {0x80509900, {CODEC_UTF8, 0, 0, 0, F0100CB700D438000, "0100CB700D438000", "1.5.2"}}, // Aproach Text {0x8060ee90, {CODEC_UTF8, 1, 0, 0, F0100CB700D438000, "0100CB700D438000", "1.5.2"}}, // Acquired Item // 2045、月より。 {0x80016334, {CODEC_UTF8, 1, 0, 0, F01005C301AC5E000, "01005C301AC5E000", "1.0.1"}}, // ヤマノススメ Next Summit ~あの山に、もう一度~ {0x806E1444, {CODEC_UTF8, 0, 0, 0, F0100815019488000_text, "0100815019488000", "1.0.0"}}, {0x80659EE0, {CODEC_UTF8, 1, 0, 0, F0100815019488000_name, "0100815019488000", "1.0.0"}}, // Prison Princess {0x800eba00, {CODEC_UTF16, 2, 0x14, 0, 0, "0100F4800F872000", "1.0.0"}}, // 泡沫のユークロニア Utakata no Uchronia {0x8180de40, {CODEC_UTF16, 0, 0, ReadTextAndLenW<0>, F010027401A2A2000, "010027401A2A2000", "1.0.0"}}, // text box {0x816b61c0, {CODEC_UTF16, 0, 0, ReadTextAndLenW<0>, F010027401A2A2000, "010027401A2A2000", "1.0.0"}}, // dictionary {0x815fe594, {CODEC_UTF16, 0, 0, ReadTextAndLenW<0>, F010027401A2A2000, "010027401A2A2000", "1.0.0"}}, // choices {0x81836E0C, {CODEC_UTF16, 1, 0, 0, F010027401A2A2000_2, "010027401A2A2000", "1.0.1"}}, // Little Busters! Converted Edition {0x800A97C8, {CODEC_UTF8, 9, 0, 0, F0100943010310000, "0100943010310000", "1.0.0"}}, // GrimGrimoire OnceMore {0x80020bd4, {CODEC_UTF8, 0, 0, 0, 0, "01003F5017760000", "1.0.0"}}, {0x800375a0, {CODEC_UTF8, 2, 0, 0, 0, "01003F5017760000", "1.0.0"}}, // tutorial {0x800781dc, {CODEC_UTF8, 0, 0, 0, 0, "01003F5017760000", "1.0.0"}}, // Chapter // Temirana Koku no Tsuiteru Hime to Tsuitenai Kishidan {0x82457970, {CODEC_UTF16, 0, 0x14, 0, F0100A62019078000, "0100A62019078000", "1.0.1"}}, // Doukoku Soshite {0x8008171c, {0, 0, 0, 0, 0, "01007F000EB36000", "1.0.0"}}, // Mistonia no Kibou - The Lost Delight {0x8246c4ac, {CODEC_UTF16, 0, 0, 0, 0, "01007AD01CB42000", "1.0.0"}}, // even if TEMPEST: Tsuranaru Toki no Akatsuki {0x80031008, {CODEC_UTF8, 0, 0, 0, F010095E01581C000, "0100DEF01D0C2000", "1.0.2"}}, {0x8002e2cc, {CODEC_UTF8, 0, 0, 0, F010095E01581C000, "0100DEF01D0C2000", "1.0.2"}}, {0x8002e2cc, {CODEC_UTF8, 0, 0, 0, F010095E01581C000, "0100DEF01D0C2000", "1.0.2"}}, // even if TEMPEST: Yoiyami ni Kaku Katariki Majo {0x8001cf80, {CODEC_UTF8, 0, 0, 0, F010095E01581C000, "010095E01581C000", "1.0.8"}}, {0x800297d0, {CODEC_UTF8, 0, 0, 0, F010095E01581C000, "010095E01581C000", "1.0.8"}}, {0x8000edcc, {CODEC_UTF8, 0, 0, 0, F010095E01581C000, "010095E01581C000", "1.0.8"}}, // Taishou x Alice all in one {0x80064ab8, {CODEC_UTF16, 1, 0, 0, F010096000CA38000, "010096000CA38000", "1.0.2"}}, {0x80064bd4, {CODEC_UTF16, 1, 0, 0, F010096000CA38000, "010096000CA38000", "1.0.2"}}, {0x8015f968, {CODEC_UTF16, 0, 0, 0, F010096000CA38000, "010096000CA38000", "1.0.2"}}, // Taishou x Alice: HEADS & TAILS {0x8009bb3c, {CODEC_UTF16, 1, 0, 0, F0100B1F0123B6000, "0100B1F0123B6000", "2.0.0"}}, {0x8009bc58, {CODEC_UTF16, 1, 0, 0, F0100B1F0123B6000, "0100B1F0123B6000", "2.0.0"}}, // Hiiro_no_Kakera_Tamayorihime_Kitan_Omoiiro_no_Kioku {0x81922ce8, {CODEC_UTF16, 0, 0x14, 0, F0100EC001DE7E000, "0100EC001DE7E000", "1.0.0"}}, // Gensou Manège {0x8124f690, {CODEC_UTF16, 0, 0x14, 0, F010037500DF38000, "010037500DF38000", "1.0.4"}}, {0x811f63f0, {CODEC_UTF16, 0, 0x14, 0, F010037500DF38000, "010037500DF38000", "1.0.4"}}, {0x811917f4, {CODEC_UTF16, 0, 0x14, 0, F010037500DF38000, "010037500DF38000", "1.0.4"}}, {0x81595f90, {CODEC_UTF16, 0, 0x14, 0, F010037500DF38000, "010037500DF38000", "1.0.4"}}, // Gensou Kissa Enchanté {0x8002863c, {CODEC_UTF8, 0, 0, 0, 0, "010079200C26E000", "1.0.0"}}, {0x80044360, {CODEC_UTF8, 1, 0, 0, 0, "010079200C26E000", "1.0.0"}}, {0x8004a1a4, {CODEC_UTF8, 0, 0, 0, F010079200C26E000<0>, "010079200C26E000", "1.0.0"}}, {0x8004a394, {CODEC_UTF8, 0, 0, 0, F010079200C26E000<1>, "010079200C26E000", "1.0.0"}}, // Tengoku Struggle -strayside- {0x801bc678, {CODEC_UTF32, 0, 0, 0, F01002C00177AE000, "01002C00177AE000", "1.0.0"}}, {0x8016a05c, {CODEC_UTF32, 0, 0, 0, F01002C00177AE000, "01002C00177AE000", "1.0.0"}}, {0x80140cac, {CODEC_UTF32, 1, 0, 0, F01002C00177AE000, "01002C00177AE000", "1.0.0"}}, {0x800e08dc, {CODEC_UTF32, 0, 0, 0, F01002C00177AE000, "01002C00177AE000", "1.0.0"}}, // Meiji Katsugeki Haikara Ryuuseigumi -Seibai Shimaseu, Yonaoshi Kagyou- {0x802ab2fc, {CODEC_UTF8, 6, 0, 0, F0100EA100DF92000, "0100EA100DF92000", "1.0.0"}}, // 7'scarlet {0x8177ec00, {CODEC_UTF16, 0, 0x14, 0, F0100FA001E160000, "0100FA001E160000", "1.0.0"}}, {0x817754ac, {CODEC_UTF16, 0, 0x14, 0, F0100FA001E160000, "0100FA001E160000", "1.0.0"}}, // SympathyKiss / Sympathy Kiss (JP) {0x80037d90, {CODEC_UTF8, 0, 0, 0, F0100FA10185B0000, "0100FA10185B0000", "1.0.0"}}, {0x80030f24, {CODEC_UTF8, 0, 0, 0, F0100FA10185B0000, "0100FA10185B0000", "1.0.0"}}, {0x80054804, {CODEC_UTF8, 1, 0, 0, F0100FA10185B0000, "0100FA10185B0000", "1.0.0"}}, {0x80054290, {CODEC_UTF8, 1, 0, 0, F0100FA10185B0000, "0100FA10185B0000", "1.0.0"}}, // Kimi wa Yukima ni Koinegau (君は雪間に希う) {0x8013a0f0, {CODEC_UTF32, 0, 0, 0, F010021D01474E000, "010021D01474E000", "1.0.0"}}, {0x800319f8, {CODEC_UTF32, 0, 0, 0, F010021D01474E000_2, "010021D01474E000", "1.0.0"}}, {0x800488e4, {CODEC_UTF32, 1, 0, 0, F010021D01474E000, "010021D01474E000", "1.0.0"}}, {0x800bdb84, {CODEC_UTF32, 0, 0, 0, F010021D01474E000, "010021D01474E000", "1.0.0"}}, {0x800e4540, {CODEC_UTF32, 0, 0, 0, F010021D01474E000, "010021D01474E000", "1.0.0"}}, // Dairoku: Ayakashimori (DAIROKU:AYAKASHIMORI) {0x800e35ec, {CODEC_UTF8, 0, 0, 0, F010061300DF48000, "010061300DF48000", "1.0.1"}}, {0x800d103c, {CODEC_UTF8, 0, 0, 0, F010061300DF48000, "010061300DF48000", "1.0.1"}}, {0x800f1320, {CODEC_UTF8, 0, 0, T010061300DF48000, FF010061300DF48000_2, "010061300DF48000", "1.0.1"}}, // Charade Maniacs / CharadeManiacs {0x8001c460, {CODEC_UTF8, 0, 0x5c, 0, F0100CEF0152DE000, "0100CEF0152DE000", "1.0.0"}}, {0x8004c390, {CODEC_UTF8, 1, 0, 0, F0100CEF0152DE000, "0100CEF0152DE000", "1.0.0"}}, {0x80050d60, {CODEC_UTF8, 0, 0, 0, F0100CEF0152DE000, "0100CEF0152DE000", "1.0.0"}}, {0x8007ee20, {CODEC_UTF8, 0, 0, 0, F0100CEF0152DE000, "0100CEF0152DE000", "1.0.0"}}, // Hanaemu Kare to & bloom (花笑む彼と & bloom) {0x833e4d84, {CODEC_UTF16, 0, 0x14, 0, F0100DEF01D0C6000, "0100DEF01D0C6000", "1.0.0"}}, {0x8335f650, {CODEC_UTF16, 0, 0x14, 0, F0100DEF01D0C6000, "0100DEF01D0C6000", "1.0.0"}}, {0x81729520, {CODEC_UTF16, 1, 0x14, 0, F0100DEF01D0C6000_2, "0100DEF01D0C6000", "1.0.0"}}, {0x83375938, {CODEC_UTF16, 0, 0, T0100DEF01D0C6000_2, 0, "0100DEF01D0C6000", "1.0.0"}}, // Dance with Devils {0x81616034, {CODEC_UTF16, 0, 0x14, 0, F01004E5017C54000, "01004E5017C54000", "1.0.0"}}, {0x8185a800, {CODEC_UTF16, 0, 0x14, 0, F01004E5017C54000, "01004E5017C54000", "1.0.0"}}, // My9Swallows TOPSTARS LEAGUE {0x818554ac, {CODEC_UTF16, 0, 0x14, 0, F01003BB01DF54000, "01003BB01DF54000", "1.0.0"}}, {0x817b76d4, {CODEC_UTF16, 0, 0x14, 0, F01003BB01DF54000, "01003BB01DF54000", "1.0.0"}}, {0x8187882c, {CODEC_UTF16, 0, 0x14, 0, F01003BB01DF54000, "01003BB01DF54000", "1.0.1"}}, {0x817b8f64, {CODEC_UTF16, 0, 0x14, 0, F01003BB01DF54000, "01003BB01DF54000", "1.0.1"}}, // Tokeijikake no Apocalypse (時計仕掛けのアポカリプス) {0x8001d9c4, {CODEC_UTF8, 0, 0x1c, 0, F01005AF00E9DC000, "01005AF00E9DC000", "1.0.0"}}, {0x8004ca84, {CODEC_UTF8, 1, 0, 0, F01005AF00E9DC000, "01005AF00E9DC000", "1.0.0"}}, {0x8005b304, {CODEC_UTF8, 0, 0, 0, F01005AF00E9DC000, "01005AF00E9DC000", "1.0.0"}}, {0x8005b310, {CODEC_UTF8, 0, 0, 0, F01005AF00E9DC000, "01005AF00E9DC000", "1.0.0"}}, // Radiant Tale ~Fanfare!~ (ラディアンテイル ~ファンファーレ!~) {0x8003a880, {CODEC_UTF8, 0, 0, 0, F010088B01A8FC000, "010088B01A8FC000", "1.0.1"}}, {0x8004eb08, {CODEC_UTF8, 1, 0, 0, F010088B01A8FC000, "010088B01A8FC000", "1.0.1"}}, {0x8005bff4, {CODEC_UTF8, 0, 0, 0, F010088B01A8FC000, "010088B01A8FC000", "1.0.1"}}, {0x8005f0d4, {CODEC_UTF8, 3, 0, 0, F010088B01A8FC000, "010088B01A8FC000", "1.0.1"}}, // LoverPretend / Lover Pretend {0x80034ad0, {CODEC_UTF8, 0, 0, 0, F010032300C562000, "010032300C562000", "1.0.0"}}, {0x8004e950, {CODEC_UTF8, 1, 0, 0, F010032300C562000, "010032300C562000", "1.0.0"}}, {0x8002e6c4, {CODEC_UTF8, 0, 0, 0, F010032300C562000, "010032300C562000", "1.0.0"}}, {0x8005f6ec, {CODEC_UTF8, 0, 0, 0, F010032300C562000, "010032300C562000", "1.0.0"}}, // Norn9 ~Norn + Nonette~ LOFN (NORN9 ~ノルン+ノネット~ LOFN) {0x8002b200, {CODEC_UTF8, 1, 0x18, 0, F010061300DF48000, "01001A500AD6A000", "1.0.0"}}, {0x8003d83c, {CODEC_UTF8, 0, 0, 0, F010061300DF48000, "01001A500AD6A000", "1.0.0"}}, {0x80047850, {CODEC_UTF8, 0, 0, 0, F010061300DF48000, "01001A500AD6A000", "1.0.0"}}, // Shiritsu Berubara Gakuen ~Versailles no Bara Re*imagination~ (私立ベルばら学園 ~ベルサイユのばらRe*imagination~) {0x8001b68c, {CODEC_UTF8, 0, 0x1c, 0, F010027300A660000, "010027300A660000", "1.0.0"}}, {0x800460f0, {CODEC_UTF8, 1, 0, 0, F010027300A660000, "010027300A660000", "1.0.0"}}, // Himehibi Another Princess Days -White or Black- (ひめひび Another Princess Days – White or Black –) {0x219ed0, {0, 0, 0, 0, F0100E4000F616000, "0100E4000F616000", "1.0.0"}}, {0x21a3e0, {0, 0, 0, 0, F0100E4000F616000, "0100E4000F616000", "1.0.0"}}, // Himehibi -Princess Days- (ひめひび -Princess Days-) {0x20d7b8, {0, 0, 0, 0, F0100E4000F616000, "0100F8D0129F4000", "1.0.0"}}, {0x20da9c, {0, 0, 0, 0, F0100E4000F616000, "0100E4000F616000", "1.0.0"}}, {0x20d834, {0, 0, 0, 0, F0100E4000F616000, "0100F8D0129F4000", "1.0.1"}}, {0x20dae8, {0, 0, 0, 0, F0100E4000F616000, "0100E4000F616000", "1.0.1"}}, // オホーツクに消ゆ ~追憶の流氷・涙のニポポ人形~ {0x83d4bda0, {CODEC_UTF16, 1, 0x14, 0, F010044701E9BC000, "010044701E9BC000", "1.2.0"}}, {0x83d59320, {CODEC_UTF16, 0, 0x14, 0, F010044701E9BC000, "010044701E9BC000", "1.2.0"}}, {0x83d22530, {CODEC_UTF16, 0, 0x14, 0, F010044701E9BC000, "010044701E9BC000", "1.2.0"}}, {0x83d225c0, {CODEC_UTF16, 0, 0x14, 0, F010044701E9BC000, "010044701E9BC000", "1.2.0"}}, {0x83d26fd8, {CODEC_UTF16, 0, 0x14, 0, F010044701E9BC000, "010044701E9BC000", "1.2.0"}}, // Trouble Magia ~Wakeari Shoujo wa Mirai o Kachitoru Tame ni Ikoku no Mahou Gakkou e Ryuugaku Shimasu~ (トラブル・マギア ~訳アリ少女は未来を勝ち取るために異国の魔法学校へ留学します~) {0x8017e6b0, {CODEC_UTF16, 0, 0, T01000BB01CB8A000<1>, F01000BB01CB8A000, "01000BB01CB8A000", "1.0.0"}}, {0x80177ae0, {CODEC_UTF16, 0, 0, T01000BB01CB8A000<0>, F01000BB01CB8A000, "01000BB01CB8A000", "1.0.0"}}, {0x80122a4c, {CODEC_UTF16, 0, 0, T01000BB01CB8A000<0>, F01000BB01CB8A000, "01000BB01CB8A000", "1.0.0"}}, {0x800ba088, {CODEC_UTF16, 0, 0, T01000BB01CB8A000<0>, F01000BB01CB8A000, "01000BB01CB8A000", "1.0.0"}}, // Moeyo! Otome Doushi ~Kayuu Koigatari~ (燃えよ! 乙女道士 ~華遊恋語~) {0x8005c698, {CODEC_UTF16, 1, 0x20, 0, F01001BA01EBFC000, "01001BA01EBFC000", "1.0.0"}}, {0x80051cd0, {CODEC_UTF16, 1, 0, 0, F01001BA01EBFC000, "01001BA01EBFC000", "1.0.0"}}, // planetarian: Snow Globe {0x800F32A0, {CODEC_UTF16 | FULL_STRING, 1, 0, 0, 0, "010031C01F410000", "1.0.0"}}, // 各种语言一起都提取出来了 // planetarian: The Reverie of a Little Planet & Snow Globe 英文版 {0x801253EC, {CODEC_UTF16, 0xA, 0, 0, 0, "0100F0A01F112000", nullptr}}, // 1.0.0 && 1.0.1 // 中文 {0x8012441C, {CODEC_UTF16, 8, 0, 0, F0100F0A01F112000, "0100F0A01F112000", nullptr}}, // 1.0.0 && 1.0.1 // 日文 // The Town of Nie {0x818B6078, {CODEC_UTF16, 1, 0, 0, F0100C9001E10C000, "0100C9001E10C000", "1.0.0"}}, // Honey Vibes {0x81845F80, {CODEC_UTF16 | FULL_STRING, 1, 0, 0, F0100FB301E70A000, "0100FB301E70A000", "1.0.0"}}, // WORLDEND SYNDROME {0x805F5F04, {CODEC_UTF16, 2, 0, 0, 0, "01008A30083E2000", "1.0.0"}}, {0x800FBA84, {CODEC_UTF16, 2, 0, 0, 0, "01008A30083E2000", "1.0.1"}}, // Hatsumira -From the Future Undying- {0x8017BE0C, {CODEC_UTF8, 8, 0, 0, aF0100A9B01D4AE000, "0100A9B01D4AE000", "1.0.0"}}, // 英文 {0x8017C0B4, {CODEC_UTF16, 8, 0, 0, wF0100A9B01D4AE000, "0100A9B01D4AE000", "1.0.0"}}, // 日文 // Meiji Tokyo Renka Full Moon {0x81898840, {CODEC_UTF16, 3, 0, 0, F010043901E972000, "010043901E972000", "1.0.0"}}, // 日文 // 月影の鎖~狂爛モラトリアム~ {0x2170B4, {0, 1, 0, 0, F010076501DAEA000, "010076501DAEA000", "1.0.0"}}, // text {0x2179A8, {0, 2, 0, 0, 0, "010076501DAEA000", "1.0.0"}}, // name+text // 神々の悪戯 Unite Edition {0x812BFF40, {CODEC_UTF16, 1, -2, 0, F01006530151F0000, "01006530151F0000", "1.0.0"}}, // 只有第一行 {0x812BCEB8, {CODEC_UTF16, 1, -2, 0, F01006530151F0000, "01006530151F0000", "1.0.0"}}, // 只有2&3行 // 新宿羅生門 ―Rashomon of Shinjuku― {0x80062158, {CODEC_UTF8, 0, 0, 0, F01005A401D766000, "01005A401D766000", "1.0.0"}}, // 夏空のモノローグ ~Another Memory~ {0x8006007c, {0, 0, 0, 0, F0100FC2019346000, "01000E701DAE8000", "1.0.0"}}, {0x800578c4, {0, 1, 0, 0, F0100FC2019346000, "01000E701DAE8000", "1.0.0"}}, // 真紅の焔 真田忍法帳 for Nintendo Switch {0x800170a0, {CODEC_UTF8, 0, 0, 0, F0100FC2019346000, "01008A001C79A000", "1.0.0"}}, {0x800220a0, {CODEC_UTF8, 2, 0, 0, F0100FC2019346000, "01008A001C79A000", "1.0.0"}}, {0x8004bbd0, {CODEC_UTF8, 1, 0, 0, F0100FC2019346000, "01008A001C79A000", "1.0.0"}}, {0x80062a20, {CODEC_UTF8, 0, 0, 0, F0100FC2019346000, "01008A001C79A000", "1.0.0"}}, {0x80064c48, {CODEC_UTF8, 3, 0, 0, F0100FC2019346000, "01008A001C79A000", "1.0.0"}}, // 神さまと恋ゴコロ {0x20D838, {0, 7, 0, 0, 0, "0100612019F12000", "1.0.0"}}, // name+text {0x20D030, {0, 1, 0, 0, 0, "0100612019F12000", "1.0.0"}}, // KLAP!! for Nintendo Switch {0x8004a2d0, {CODEC_UTF8, 1, 0, 0, F0100FC2019346000, "0100E8E016D82000", "1.0.0"}}, {0x8004970c, {CODEC_UTF8, 1, 0, 0, F0100FC2019346000, "0100E8E016D82000", "1.0.0"}}, {0x800da5e0, {CODEC_UTF8, 0, 0, 0, F0100FC2019346000, "0100E8E016D82000", "1.0.0"}}, {0x8003dfac, {CODEC_UTF8, 0, 0, 0, F0100FC2019346000, "0100E8E016D82000", "1.0.0"}}, // PSYCHIC ECLIPSE -reload- {0x8091B41C, {CODEC_UTF8, 8, 0, 0, 0, "0100A0001B9F0000", "1.0.0"}}, // 提取不到短字符串 {0x804FAF5C, {CODEC_UTF8 | FULL_STRING, 1, 0, 0, 0, "0100A0001B9F0000", "1.1.0"}}, // 提取不到短字符串 text+name {0x80887ABC, {CODEC_UTF8, 8, 0, 0, 0, "0100A0001B9F0000", "1.1.0"}}, // 提取不到短字符串 // アイ★チュウ {0x824865C4, {CODEC_UTF16, 3, 0, 0, F01006CC015ECA000, "01006CC015ECA000", "1.14"}}, // Kaeru Batake DE Tsukamaete☆ (カエル畑DEつかまえて☆彡) {0x2206bc, {0, 0, 0, 0, F0100E5200D1A2000, "0100E5200D1A2000", "1.0.0"}}, {0x220cfc, {0, 0, 0, 0, F0100E5200D1A2000, "0100E5200D1A2000", "1.0.0"}}, {0x2372b0, {0, 1, 0, 0, F0100E5200D1A2000, "0100E5200D1A2000", "1.0.0"}}, // Kaeru Batake DE Tsukamaete: Natsu Chigira Sansen! (カエル畑DEつかまえて・夏 千木良参戦!) {0x2210d0, {0, 0, 0, 0, F0100EFE0159C6000, "0100EFE0159C6000", "1.0.0"}}, {0x221768, {0, 0, 0, 0, F0100EFE0159C6000, "0100EFE0159C6000", "1.0.0"}}, // Katakoi Contrast -collection of branch- (片恋いコントラスト ―collection of branch―) {0x8004ba20, {CODEC_UTF32, 0, 0, 0, F01007FD00DB20000, "01007FD00DB20000", "1.0.0"}}, {0x800c6eb0, {CODEC_UTF32, 1, 0, 0, F01007FD00DB20000, "01007FD00DB20000", "1.0.0"}}, {0x8017e560, {CODEC_UTF32, 0, 0, 0, F01007FD00DB20000, "01007FD00DB20000", "1.0.0"}}, {0x801f67c0, {CODEC_UTF32, 1, 0, 0, F01007FD00DB20000, "01007FD00DB20000", "1.0.0"}}, {0x802a76c0, {CODEC_UTF32, 0, 0, 0, F01007FD00DB20000, "01007FD00DB20000", "1.0.0"}}, {0x8031fc80, {CODEC_UTF32, 1, 0, 0, F01007FD00DB20000, "01007FD00DB20000", "1.0.0"}}, // 真 流行り神1・2パック {0x80072720, {CODEC_UTF8, 1, 0, 0, F010005F00E036000, "010005F00E036000", "1.0.0"}}, // 真流行り神3 {0x80082F70, {0, 0xb, 0, TF0100AA1013B96000, 0, "0100AA1013B96000", nullptr}}, //"1.0.0", "1.0.1" // NG {0x228AA4, {0, 6, 0, 0, F01009E600FAF6000, "01009E600FAF6000", "1.0.0"}}, {0x228C0C, {0, 6, 0, 0, F01009E600FAF6000, "01009E600FAF6000", "1.0.0"}}, // アサツグトリ {0x8012C824, {CODEC_UTF8, 1, 0, 0, F010060301588A000, "010060301588A000", "1.0.0"}}, }; return 1; }(); }