diff --git a/Runtime/GuiSys/CMakeLists.txt b/Runtime/GuiSys/CMakeLists.txt index 667def348..e87a30579 100644 --- a/Runtime/GuiSys/CMakeLists.txt +++ b/Runtime/GuiSys/CMakeLists.txt @@ -93,6 +93,8 @@ set(GUISYS_SOURCES CWordBreakTables.hpp CFontImageDef.cpp CFontImageDef.hpp - ITweakGui.hpp) + ITweakGui.hpp + CStringTable.cpp + CStringTable.hpp) runtime_add_list(GuiSys GUISYS_SOURCES) diff --git a/Runtime/GuiSys/CStringTable.cpp b/Runtime/GuiSys/CStringTable.cpp new file mode 100644 index 000000000..ede51dab2 --- /dev/null +++ b/Runtime/GuiSys/CStringTable.cpp @@ -0,0 +1,79 @@ +#include "CStringTable.hpp" + +namespace urde +{ +const std::vector CStringTable::skLanguages = +{ + 'ENGL', + 'FREN', + 'GERM', + 'SPAN', + 'ITAL', + 'DUTC', + 'JAPN' +}; + +FourCC CStringTable::mCurrentLanguage = CStringTable::skLanguages[0]; + +CStringTable::CStringTable(CInputStream& in) { LoadStringTable(in); } + +void CStringTable::LoadStringTable(CInputStream &in) +{ + in.readUint32Big(); + in.readUint32Big(); + u32 langCount = in.readUint32Big(); + x0_stringCount = in.readUint32Big(); + std::vector> langOffsets; + for (u32 i = 0 ; i 0) + { + if (langOffsets[lang].first == mCurrentLanguage) + { + offset = langOffsets[lang].second; + break; + } + + lang++; + } + + in.seek(offset); + + u32 dataLen = in.readUint32Big(); + m_bufLen = dataLen; + x4_data.reset(new u8[dataLen]); + in.readUBytesToBuf(x4_data.get(), dataLen); + for (u32 i = 0 ; i(x4_data.get() + i); + *off = hecl::SBig(*off); + } + for (u32 i = x0_stringCount * 4 ; i(x4_data.get() + i); + *chr = hecl::SBig(*chr); + } +} + +std::wstring CStringTable::GetString(s32 str) const +{ + if (str < 0 || str >= x0_stringCount) + return L"Invalid"; + + u32 off = *(reinterpret_cast(x4_data.get() + str * 4)); + CMemoryInStream tmp(x4_data.get() + off, m_bufLen - off); + return tmp.readWString(); +} + +void CStringTable::SetLanguage(s32 lang) +{ + mCurrentLanguage = skLanguages[lang]; +} +} diff --git a/Runtime/GuiSys/CStringTable.hpp b/Runtime/GuiSys/CStringTable.hpp new file mode 100644 index 000000000..45160c386 --- /dev/null +++ b/Runtime/GuiSys/CStringTable.hpp @@ -0,0 +1,23 @@ +#ifndef __URDE_CSTRINGTABLE_HPP__ +#define __URDE_CSTRINGTABLE_HPP__ + +#include "RetroTypes.hpp" + +namespace urde +{ +class CStringTable +{ + static const std::vector skLanguages; + static FourCC mCurrentLanguage; + u32 x0_stringCount = 0; + std::unique_ptr x4_data = 0; + u32 m_bufLen; +public: + CStringTable(CInputStream& in); + void LoadStringTable(CInputStream& in); + + std::wstring GetString(s32) const; + static void SetLanguage(s32); +}; +} +#endif // __URDE_CSTRINGTABLE_HPP__