mirror of https://github.com/AxioDL/metaforce.git
Merge branch 'master' of https://github.com/AxioDL/urde
This commit is contained in:
commit
d2fca93a8e
|
@ -93,6 +93,8 @@ set(GUISYS_SOURCES
|
||||||
CWordBreakTables.hpp
|
CWordBreakTables.hpp
|
||||||
CFontImageDef.cpp
|
CFontImageDef.cpp
|
||||||
CFontImageDef.hpp
|
CFontImageDef.hpp
|
||||||
ITweakGui.hpp)
|
ITweakGui.hpp
|
||||||
|
CStringTable.cpp
|
||||||
|
CStringTable.hpp)
|
||||||
|
|
||||||
runtime_add_list(GuiSys GUISYS_SOURCES)
|
runtime_add_list(GuiSys GUISYS_SOURCES)
|
||||||
|
|
|
@ -0,0 +1,86 @@
|
||||||
|
#include "CStringTable.hpp"
|
||||||
|
#include "CToken.hpp"
|
||||||
|
|
||||||
|
namespace urde
|
||||||
|
{
|
||||||
|
const std::vector<FourCC> 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<std::pair<FourCC, u32>> langOffsets;
|
||||||
|
for (u32 i = 0 ; i<langCount ; ++i)
|
||||||
|
{
|
||||||
|
FourCC fcc(in.readUint32Big());
|
||||||
|
u32 off = in.readUint32Big();
|
||||||
|
langOffsets.emplace_back(fcc,off);
|
||||||
|
}
|
||||||
|
|
||||||
|
u32 lang = 0;
|
||||||
|
u32 offset = 0;
|
||||||
|
while((langCount--) > 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<x0_stringCount ; i += 4)
|
||||||
|
{
|
||||||
|
u32* off = reinterpret_cast<u32*>(x4_data.get() + i);
|
||||||
|
*off = hecl::SBig(*off);
|
||||||
|
}
|
||||||
|
for (u32 i = x0_stringCount * 4 ; i<dataLen ; i += 2)
|
||||||
|
{
|
||||||
|
char16_t* chr = reinterpret_cast<char16_t*>(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<u32*>(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];
|
||||||
|
}
|
||||||
|
|
||||||
|
CFactoryFnReturn FStringTableFactory(const SObjectTag&, CInputStream& in, const CVParamTransfer&)
|
||||||
|
{
|
||||||
|
return TToken<CStringTable>::GetIObjObjectFor(std::make_unique<CStringTable>(in));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
#ifndef __URDE_CSTRINGTABLE_HPP__
|
||||||
|
#define __URDE_CSTRINGTABLE_HPP__
|
||||||
|
|
||||||
|
#include "RetroTypes.hpp"
|
||||||
|
#include "IFactory.hpp"
|
||||||
|
|
||||||
|
namespace urde
|
||||||
|
{
|
||||||
|
class CStringTable
|
||||||
|
{
|
||||||
|
static const std::vector<FourCC> skLanguages;
|
||||||
|
static FourCC mCurrentLanguage;
|
||||||
|
u32 x0_stringCount = 0;
|
||||||
|
std::unique_ptr<u8[]> x4_data = 0;
|
||||||
|
u32 m_bufLen;
|
||||||
|
public:
|
||||||
|
CStringTable(CInputStream& in);
|
||||||
|
void LoadStringTable(CInputStream& in);
|
||||||
|
|
||||||
|
std::wstring GetString(s32) const;
|
||||||
|
static void SetLanguage(s32);
|
||||||
|
};
|
||||||
|
|
||||||
|
CFactoryFnReturn FStringTableFactory(const SObjectTag&, CInputStream&, const CVParamTransfer&);
|
||||||
|
}
|
||||||
|
#endif // __URDE_CSTRINGTABLE_HPP__
|
Loading…
Reference in New Issue