Char16 refactor and GuiSys bug fixes

This commit is contained in:
Jack Andersen 2017-01-23 21:41:33 -10:00
parent f8853fbccf
commit 7a60151d3e
31 changed files with 262 additions and 242 deletions

View File

@ -16,7 +16,7 @@ struct ISTRG : BigYAML
virtual size_t count() const=0;
virtual std::string getUTF8(const FourCC& lang, size_t idx) const=0;
virtual std::wstring getUTF16(const FourCC& lang, size_t idx) const=0;
virtual std::u16string getUTF16(const FourCC& lang, size_t idx) const=0;
virtual hecl::SystemString getSystemString(const FourCC& lang, size_t idx) const=0;
virtual int32_t lookupIdx(const std::string& name) const=0;

View File

@ -6,6 +6,7 @@
#include "ScriptObjects/SpecialFunction.hpp"
#include "ScriptObjects/DoorArea.hpp"
#include "Runtime/RetroTypes.hpp"
#include "Runtime/World/ScriptObjectSupport.hpp"
namespace DataSpec
{
@ -207,7 +208,7 @@ bool MLVL::Cook(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPat
std::vector<Scan> scans;
for (std::unique_ptr<IScriptObject>& obj : layer.objects)
{
if (obj->type == 0x13)
if (obj->type == int(urde::EScriptObjectType::MemoryRelay))
{
MemoryRelay& memRelay = static_cast<MemoryRelay&>(*obj);
for (IScriptObject::Connection& conn : memRelay.connections)
@ -221,7 +222,7 @@ bool MLVL::Cook(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPat
}
savw.relays.push_back(memRelay.id);
}
else if (obj->type == 0x3A)
else if (obj->type == int(urde::EScriptObjectType::SpecialFunction))
{
SpecialFunction& specialFunc = static_cast<SpecialFunction&>(*obj);
if (specialFunc.function == ESpecialFunctionType::CinematicSkip)
@ -234,7 +235,7 @@ bool MLVL::Cook(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPat
layer.layer = specialFunc.layerSwitch.layerIdx;
}
}
else if (obj->type == 0x3)
else if (obj->type == int(urde::EScriptObjectType::Door))
{
DoorArea& doorArea = static_cast<DoorArea&>(*obj);
savw.doors.push_back(doorArea.id);

View File

@ -38,7 +38,7 @@ void STRG::_read(athena::io::IStreamReader& reader)
langs.reserve(skLanguages.size());
for (const std::pair<FourCC, atUint32>& lang : readLangs)
{
std::vector<std::wstring> strs;
std::vector<std::u16string> strs;
reader.seek(tablesStart + lang.second, athena::SeekOrigin::Begin);
reader.readUint32Big(); // table size
atUint32 langStart = reader.position();
@ -47,7 +47,7 @@ void STRG::_read(athena::io::IStreamReader& reader)
atUint32 strOffset = reader.readUint32Big();
atUint32 tmpOffset = reader.position();
reader.seek(langStart + strOffset, athena::SeekOrigin::Begin);
strs.emplace_back(reader.readWStringBig());
strs.emplace_back(reader.readU16StringBig());
reader.seek(tmpOffset, athena::SeekOrigin::Begin);
}
langs.emplace_back(lang.first, strs);
@ -55,7 +55,7 @@ void STRG::_read(athena::io::IStreamReader& reader)
langMap.clear();
langMap.reserve(langCount);
for (std::pair<FourCC, std::vector<std::wstring>>& item : langs)
for (std::pair<FourCC, std::vector<std::u16string>>& item : langs)
langMap.emplace(item.first, &item.second);
}
@ -81,7 +81,7 @@ void STRG::write(athena::io::IStreamWriter& writer) const
writer.writeUint32Big(strCount);
atUint32 offset = 0;
for (const std::pair<FourCC, std::vector<std::wstring>>& lang : langs)
for (const std::pair<FourCC, std::vector<std::u16string>>& lang : langs)
{
DNAFourCC(lang.first).write(writer);
writer.writeUint32Big(offset);
@ -97,7 +97,7 @@ void STRG::write(athena::io::IStreamWriter& writer) const
}
}
for (const std::pair<FourCC, std::vector<std::wstring>>& lang : langs)
for (const std::pair<FourCC, std::vector<std::u16string>>& lang : langs)
{
atUint32 langStrCount = lang.second.size();
atUint32 tableSz = strCount * 4;
@ -123,7 +123,7 @@ void STRG::write(athena::io::IStreamWriter& writer) const
for (atUint32 s=0 ; s<strCount ; ++s)
{
if (s < langStrCount)
writer.writeWStringBig(lang.second[s]);
writer.writeU16StringBig(lang.second[s]);
else
writer.writeUByte(0);
}
@ -137,7 +137,7 @@ size_t STRG::binarySize(size_t __isz) const
size_t strCount = STRG::count();
__isz += langs.size() * strCount * 4;
for (const std::pair<FourCC, std::vector<std::wstring>>& lang : langs)
for (const std::pair<FourCC, std::vector<std::u16string>>& lang : langs)
{
atUint32 langStrCount = lang.second.size();
for (atUint32 s=0 ; s<strCount ; ++s)
@ -197,9 +197,9 @@ void STRG::read(athena::io::YAMLDocReader& reader)
if (lang.first == "DNAType")
continue;
std::vector<std::wstring> strs;
std::vector<std::u16string> strs;
for (const auto& str : lang.second->m_seqChildren)
strs.emplace_back(hecl::UTF8ToWide(str->m_scalarString));
strs.emplace_back(hecl::UTF8ToChar16(str->m_scalarString));
langs.emplace_back(FourCC(lang.first.c_str()), strs);
}
@ -214,8 +214,8 @@ void STRG::write(athena::io::YAMLDocWriter& writer) const
for (const auto& lang : langs)
{
writer.enterSubVector(lang.first.toString().c_str());
for (const std::wstring& str : lang.second)
writer.writeWString(nullptr, str);
for (const std::u16string& str : lang.second)
writer.writeU16String(nullptr, str);
writer.leaveSubVector();
}
}

View File

@ -16,8 +16,8 @@ struct STRG : ISTRG
DECL_YAML
Delete expl;
void _read(athena::io::IStreamReader& reader);
std::vector<std::pair<FourCC, std::vector<std::wstring>>> langs;
std::unordered_map<FourCC, std::vector<std::wstring>*> langMap;
std::vector<std::pair<FourCC, std::vector<std::u16string>>> langs;
std::unordered_map<FourCC, std::vector<std::u16string>*> langMap;
inline int32_t lookupIdx(const std::string& name) const {return -1;}
@ -36,15 +36,15 @@ struct STRG : ISTRG
{
auto search = langMap.find(lang);
if (search != langMap.end())
return hecl::WideToUTF8(search->second->at(idx));
return hecl::Char16ToUTF8(search->second->at(idx));
return std::string();
}
inline std::wstring getUTF16(const FourCC& lang, size_t idx) const
inline std::u16string getUTF16(const FourCC& lang, size_t idx) const
{
auto search = langMap.find(lang);
if (search != langMap.end())
return search->second->at(idx);
return std::wstring();
return std::u16string();
}
inline hecl::SystemString getSystemString(const FourCC& lang, size_t idx) const
{
@ -53,7 +53,7 @@ struct STRG : ISTRG
#if HECL_UCS2
return search->second->at(idx);
#else
return hecl::WideToUTF8(search->second->at(idx));
return hecl::Char16ToUTF8(search->second->at(idx));
#endif
return hecl::SystemString();
}

View File

@ -40,16 +40,16 @@ void STRG::_read(athena::io::IStreamReader& reader)
langs.reserve(langCount);
for (FourCC& lang : readLangs)
{
std::vector<std::wstring> strs;
std::vector<std::u16string> strs;
reader.seek(strCount * 4);
for (atUint32 s=0 ; s<strCount ; ++s)
strs.emplace_back(reader.readWStringBig());
strs.emplace_back(reader.readU16StringBig());
langs.emplace_back(lang, strs);
}
langMap.clear();
langMap.reserve(langCount);
for (std::pair<FourCC, std::vector<std::wstring>>& item : langs)
for (std::pair<FourCC, std::vector<std::u16string>>& item : langs)
langMap.emplace(item.first, &item.second);
}
@ -75,7 +75,7 @@ void STRG::write(athena::io::IStreamWriter& writer) const
writer.writeUint32Big(strCount);
atUint32 offset = 0;
for (const std::pair<DNAFourCC, std::vector<std::wstring>>& lang : langs)
for (const std::pair<DNAFourCC, std::vector<std::u16string>>& lang : langs)
{
lang.first.write(writer);
writer.writeUint32Big(offset);
@ -114,7 +114,7 @@ void STRG::write(athena::io::IStreamWriter& writer) const
for (const std::pair<std::string, int32_t>& name : names)
writer.writeString(name.first);
for (const std::pair<DNAFourCC, std::vector<std::wstring>>& lang : langs)
for (const std::pair<DNAFourCC, std::vector<std::u16string>>& lang : langs)
{
offset = strCount * 4;
atUint32 langStrCount = lang.second.size();
@ -130,7 +130,7 @@ void STRG::write(athena::io::IStreamWriter& writer) const
for (atUint32 s=0 ; s<strCount ; ++s)
{
if (s < langStrCount)
writer.writeWStringBig(lang.second[s]);
writer.writeU16StringBig(lang.second[s]);
else
writer.writeUByte(0);
}
@ -149,7 +149,7 @@ size_t STRG::binarySize(size_t __isz) const
__isz += name.first.size() + 1;
size_t strCount = STRG::count();
for (const std::pair<DNAFourCC, std::vector<std::wstring>>& lang : langs)
for (const std::pair<DNAFourCC, std::vector<std::u16string>>& lang : langs)
{
atUint32 langStrCount = lang.second.size();
__isz += strCount * 4;
@ -207,9 +207,9 @@ void STRG::read(athena::io::YAMLDocReader& reader)
langs.clear();
for (const auto& lang : root->m_mapChildren)
{
std::vector<std::wstring> strs;
std::vector<std::u16string> strs;
for (const auto& str : lang.second->m_seqChildren)
strs.emplace_back(hecl::UTF8ToWide(str->m_scalarString));
strs.emplace_back(hecl::UTF8ToChar16(str->m_scalarString));
langs.emplace_back(FourCC(lang.first.c_str()), strs);
}
@ -221,7 +221,7 @@ void STRG::read(athena::io::YAMLDocReader& reader)
langMap.clear();
langMap.reserve(langs.size());
for (std::pair<FourCC, std::vector<std::wstring>>& item : langs)
for (std::pair<FourCC, std::vector<std::u16string>>& item : langs)
langMap.emplace(item.first, &item.second);
}
@ -230,8 +230,8 @@ void STRG::write(athena::io::YAMLDocWriter& writer) const
for (const auto& lang : langs)
{
writer.enterSubVector(lang.first.toString().c_str());
for (const std::wstring& str : lang.second)
writer.writeWString(nullptr, str);
for (const std::u16string& str : lang.second)
writer.writeU16String(nullptr, str);
writer.leaveSubVector();
}
if (names.size())

View File

@ -15,8 +15,8 @@ struct STRG : ISTRG
DECL_YAML
Delete expl;
void _read(athena::io::IStreamReader& reader);
std::vector<std::pair<FourCC, std::vector<std::wstring>>> langs;
std::unordered_map<FourCC, std::vector<std::wstring>*> langMap;
std::vector<std::pair<FourCC, std::vector<std::u16string>>> langs;
std::unordered_map<FourCC, std::vector<std::u16string>*> langMap;
std::map<std::string, int32_t> names;
inline int32_t lookupIdx(const std::string& name) const
@ -42,15 +42,15 @@ struct STRG : ISTRG
{
auto search = langMap.find(lang);
if (search != langMap.end())
return hecl::WideToUTF8(search->second->at(idx));
return hecl::Char16ToUTF8(search->second->at(idx));
return std::string();
}
inline std::wstring getUTF16(const FourCC& lang, size_t idx) const
inline std::u16string getUTF16(const FourCC& lang, size_t idx) const
{
auto search = langMap.find(lang);
if (search != langMap.end())
return search->second->at(idx);
return std::wstring();
return std::u16string();
}
inline hecl::SystemString getSystemString(const FourCC& lang, size_t idx) const
{
@ -59,7 +59,7 @@ struct STRG : ISTRG
#if HECL_UCS2
return search->second->at(idx);
#else
return hecl::WideToUTF8(search->second->at(idx));
return hecl::Char16ToUTF8(search->second->at(idx));
#endif
return hecl::SystemString();
}

View File

@ -45,12 +45,12 @@ struct STRG : ISTRG
return search->second->at(idx);
return std::string();
}
inline std::wstring getUTF16(const FourCC& lang, size_t idx) const
inline std::u16string getUTF16(const FourCC& lang, size_t idx) const
{
auto search = langMap.find(lang);
if (search != langMap.end())
return hecl::UTF8ToWide(search->second->at(idx));
return std::wstring();
return hecl::UTF8ToChar16(search->second->at(idx));
return std::u16string();
}
inline hecl::SystemString getSystemString(const FourCC& lang, size_t idx) const
{

View File

@ -80,7 +80,7 @@ CPersistentOptions::CPersistentOptions(CBitStreamReader& stream)
for (const auto& world : memWorlds)
{
TLockedToken<CSaveWorld> saveWorld =
g_SimplePool->GetObj(SObjectTag{FOURCC('SAVW'), world.first});
g_SimplePool->GetObj(SObjectTag{FOURCC('SAVW'), world.second.GetSaveWorldAssetId()});
cinematicCount += saveWorld->GetCinematicCount();
}
@ -92,7 +92,7 @@ CPersistentOptions::CPersistentOptions(CBitStreamReader& stream)
for (const auto& world : memWorlds)
{
TLockedToken<CSaveWorld> saveWorld =
g_SimplePool->GetObj(SObjectTag{FOURCC('SAVW'), world.first});
g_SimplePool->GetObj(SObjectTag{FOURCC('SAVW'), world.second.GetSaveWorldAssetId()});
auto stateIt = cinematicStates.cbegin();
for (TEditorId cineId : saveWorld->GetCinematics())

View File

@ -278,7 +278,7 @@ ECardResult CMemoryCardSys::CCardFileInfo::PumpCardTransfer()
result = GetStatus(stat);
if (result != ECardResult::READY)
return result;
result = CMemoryCardSys::SetStatus(m_handle, stat);
result = CMemoryCardSys::SetStatus(m_handle.slot, m_handle.getFileNo(), stat);
if (result != ECardResult::READY)
return result;
return ECardResult::BUSY;
@ -294,7 +294,7 @@ ECardResult CMemoryCardSys::CCardFileInfo::PumpCardTransfer()
ECardResult CMemoryCardSys::CCardFileInfo::GetStatus(kabufuda::CardStat& stat) const
{
ECardResult result = CMemoryCardSys::GetStatus(m_handle, stat);
ECardResult result = CMemoryCardSys::GetStatus(m_handle.slot, m_handle.getFileNo(), stat);
if (result != ECardResult::READY)
return result;
@ -438,11 +438,11 @@ ECardResult CMemoryCardSys::CloseFile(CardFileHandle& info)
g_OpResults[int(info.slot)] = err;
return err;
}
info.handle.reset();
card.closeFile(info.handle);
return ECardResult::READY;
}
ECardResult CMemoryCardSys::ReadFile(const CardFileHandle& info, void* buf, s32 length, s32 offset)
ECardResult CMemoryCardSys::ReadFile(CardFileHandle& info, void* buf, s32 length, s32 offset)
{
kabufuda::Card& card = g_CardStates[int(info.slot)];
if (CardResult err = card.getError())
@ -450,13 +450,13 @@ ECardResult CMemoryCardSys::ReadFile(const CardFileHandle& info, void* buf, s32
g_OpResults[int(info.slot)] = err;
return err;
}
card.seek(info, offset, kabufuda::SeekOrigin::Begin);
card.read(info, buf, length);
card.seek(info.handle, offset, kabufuda::SeekOrigin::Begin);
card.read(info.handle, buf, length);
g_OpResults[int(info.slot)] = ECardResult::READY;
return ECardResult::READY;
}
ECardResult CMemoryCardSys::WriteFile(const CardFileHandle& info, const void* buf, s32 length, s32 offset)
ECardResult CMemoryCardSys::WriteFile(CardFileHandle& info, const void* buf, s32 length, s32 offset)
{
kabufuda::Card& card = g_CardStates[int(info.slot)];
if (CardResult err = card.getError())
@ -464,8 +464,8 @@ ECardResult CMemoryCardSys::WriteFile(const CardFileHandle& info, const void* bu
g_OpResults[int(info.slot)] = err;
return err;
}
card.seek(info, offset, kabufuda::SeekOrigin::Begin);
card.write(info, buf, length);
card.seek(info.handle, offset, kabufuda::SeekOrigin::Begin);
card.write(info.handle, buf, length);
g_OpResults[int(info.slot)] = ECardResult::READY;
return ECardResult::READY;
}
@ -501,29 +501,29 @@ ECardResult CMemoryCardSys::GetResultCode(kabufuda::ECardSlot port)
return g_OpResults[int(port)];
}
ECardResult CMemoryCardSys::GetStatus(const CardFileHandle& info, CardStat& statOut)
ECardResult CMemoryCardSys::GetStatus(kabufuda::ECardSlot port, int fileNo, CardStat& statOut)
{
kabufuda::Card& card = g_CardStates[int(info.slot)];
kabufuda::Card& card = g_CardStates[int(port)];
if (CardResult err = card.getError())
{
g_OpResults[int(info.slot)] = err;
g_OpResults[int(port)] = err;
return err;
}
ECardResult result = card.getStatus(info, statOut);
g_OpResults[int(info.slot)] = result;
ECardResult result = card.getStatus(fileNo, statOut);
g_OpResults[int(port)] = result;
return result;
}
ECardResult CMemoryCardSys::SetStatus(const CardFileHandle& info, const CardStat& stat)
ECardResult CMemoryCardSys::SetStatus(kabufuda::ECardSlot port, int fileNo, const CardStat& stat)
{
kabufuda::Card& card = g_CardStates[int(info.slot)];
kabufuda::Card& card = g_CardStates[int(port)];
if (CardResult err = card.getError())
{
g_OpResults[int(info.slot)] = err;
g_OpResults[int(port)] = err;
return err;
}
ECardResult result = card.setStatus(info, stat);
g_OpResults[int(info.slot)] = result;
ECardResult result = card.setStatus(fileNo, stat);
g_OpResults[int(port)] = result;
return result;
}

View File

@ -32,10 +32,10 @@ public:
const TLockedToken<CStringTable>& GetWorldName() const { return x2c_worldName; }
const TLockedToken<CSaveWorld>& GetSaveWorld() const { return x3c_saveWorld; }
const wchar_t* GetFrontEndName() const
const char16_t* GetFrontEndName() const
{
if (!x2c_worldName)
return L"";
return u"";
return x2c_worldName->GetString(0);
}
};
@ -79,11 +79,9 @@ public:
struct CardFileHandle
{
kabufuda::ECardSlot slot;
std::unique_ptr<kabufuda::IFileHandle> handle;
kabufuda::FileHandle handle;
CardFileHandle(kabufuda::ECardSlot slot) : slot(slot) {}
kabufuda::IFileHandle* operator->() const { return handle.get(); }
operator std::unique_ptr<kabufuda::IFileHandle>&() { return handle; }
operator const std::unique_ptr<kabufuda::IFileHandle>&() const { return handle; }
int getFileNo() const { return handle.getFileNo(); }
};
using CardStat = kabufuda::CardStat;
@ -134,7 +132,7 @@ public:
void LockIconToken(ResId iconTxtr, kabufuda::EAnimationSpeed speed, CSimplePool& sp);
kabufuda::ECardSlot GetCardPort() const { return m_handle.slot; }
int GetFileNo() const { return m_handle->getFileNo(); }
int GetFileNo() const { return m_handle.getFileNo(); }
u32 CalculateBannerDataSize() const;
u32 CalculateTotalDataSize() const;
void BuildCardBuffer();
@ -162,13 +160,13 @@ public:
static ECardResult OpenFile(kabufuda::ECardSlot port, const char* name, CardFileHandle& info);
static ECardResult FastOpenFile(kabufuda::ECardSlot port, int fileNo, CardFileHandle& info);
static ECardResult CloseFile(CardFileHandle& info);
static ECardResult ReadFile(const CardFileHandle& info, void* buf, s32 length, s32 offset);
static ECardResult WriteFile(const CardFileHandle& info, const void* buf, s32 length, s32 offset);
static ECardResult ReadFile(CardFileHandle& info, void* buf, s32 length, s32 offset);
static ECardResult WriteFile(CardFileHandle& info, const void* buf, s32 length, s32 offset);
static ECardResult GetNumFreeBytes(kabufuda::ECardSlot port, s32& freeBytes, s32& freeFiles);
static ECardResult GetSerialNo(kabufuda::ECardSlot port, u64& serialOut);
static ECardResult GetResultCode(kabufuda::ECardSlot port);
static ECardResult GetStatus(const CardFileHandle& info, CardStat& statOut);
static ECardResult SetStatus(const CardFileHandle& info, const CardStat& stat);
static ECardResult GetStatus(kabufuda::ECardSlot port, int fileNo, CardStat& statOut);
static ECardResult SetStatus(kabufuda::ECardSlot port, int fileNo, const CardStat& stat);
static ECardResult DeleteFile(kabufuda::ECardSlot port, const char* name);
static ECardResult FastDeleteFile(kabufuda::ECardSlot port, int fileNo);
static ECardResult Rename(kabufuda::ECardSlot port, const char* oldName, const char* newName);

View File

@ -119,7 +119,7 @@ std::shared_ptr<CGuiWidget> CGuiTextPane::Create(CGuiFrame* frame, CInputStream&
fontCol, outlineCol, extentX, extentY);
ret->ParseBaseInfo(frame, in, parms);
ret->InitializeBuffers();
ret->TextSupport()->SetText(L"?\?(?\?)");
ret->TextSupport()->SetText(u"?\?(?\?)");
return ret;
}

View File

@ -145,9 +145,9 @@ void CGuiTextSupport::CheckAndRebuildTextBuffer()
g_TextExecuteBuf->AddColor(EColorType::Main, x24_fontColor);
g_TextExecuteBuf->AddColor(EColorType::Outline, x28_outlineColor);
std::wstring initStr;
std::u16string initStr;
if ((x5c_fontId & 0xffff) != 0xffff)
initStr = hecl::WideFormat(L"&font=%08X;", u32(x5c_fontId));
initStr = hecl::Char16Format(L"&font=%08X;", u32(x5c_fontId));
initStr += x0_string;
g_TextParser->ParseText(*g_TextExecuteBuf, initStr.c_str(), initStr.size());
@ -231,7 +231,7 @@ void CGuiTextSupport::SetFontColor(const zeus::CColor& col)
}
}
void CGuiTextSupport::AddText(const std::wstring& str)
void CGuiTextSupport::AddText(const std::u16string& str)
{
if (x60_renderBuf)
{
@ -243,7 +243,7 @@ void CGuiTextSupport::AddText(const std::wstring& str)
ClearRenderBuffer();
}
void CGuiTextSupport::SetText(const std::wstring& str, bool multipage)
void CGuiTextSupport::SetText(const std::u16string& str, bool multipage)
{
if (x0_string.compare(str))
{
@ -258,7 +258,7 @@ void CGuiTextSupport::SetText(const std::wstring& str, bool multipage)
void CGuiTextSupport::SetText(const std::string& str, bool multipage)
{
SetText(hecl::UTF8ToWide(str), multipage);
SetText(hecl::UTF8ToChar16(str), multipage);
}
bool CGuiTextSupport::_GetIsTextSupportFinishedLoading() const

View File

@ -77,7 +77,7 @@ public:
class CGuiTextSupport
{
friend class CGuiTextPane;
std::wstring x0_string;
std::u16string x0_string;
float x10_curTimeMod900 = 0.f;
CGuiTextProperties x14_props;
zeus::CColor x24_fontColor;
@ -125,8 +125,8 @@ public:
void SetGeometryColor(const zeus::CColor& col);
void SetOutlineColor(const zeus::CColor& col);
void SetFontColor(const zeus::CColor& col);
void AddText(const std::wstring& str);
void SetText(const std::wstring& str, bool multipage=false);
void AddText(const std::u16string& str);
void SetText(const std::u16string& str, bool multipage=false);
void SetText(const std::string& str, bool multipage=false);
bool GetIsTextSupportFinishedLoading() const;
};

View File

@ -321,7 +321,7 @@ void CBlockInstruction::PageInvoke(CFontRenderState& state, CTextRenderBuffer* b
void CWordInstruction::InvokeLTR(CFontRenderState& state) const
{
CRasterFont* font = state.x48_font.GetObj();
wchar_t space = L' ';
char16_t space = u' ';
int w, h;
font->GetSize(state.x0_drawStrOpts, w, h, &space, 1);

View File

@ -132,9 +132,9 @@ public:
class CTextInstruction : public CInstruction
{
std::wstring x4_str; /* used to be a placement-new sized allocation */
std::u16string x4_str; /* used to be a placement-new sized allocation */
public:
CTextInstruction(const wchar_t* str, int len) : x4_str(str, len) {}
CTextInstruction(const char16_t* str, int len) : x4_str(str, len) {}
void Invoke(CFontRenderState& state, CTextRenderBuffer* buf) const;
};

View File

@ -41,7 +41,7 @@ CRasterFont::CRasterFont(urde::CInputStream& in, urde::IObjectStore& store)
for (u32 i = 0 ; i < glyphCount ; ++i)
{
wchar_t chr = in.readUint16Big();
char16_t chr = in.readUint16Big();
float startU = in.readFloatBig();
float startV = in.readFloatBig();
float endU = in.readFloatBig();
@ -66,8 +66,8 @@ CRasterFont::CRasterFont(urde::CInputStream& in, urde::IObjectStore& store)
for (u32 i = 0 ; i < kernCount ; ++i)
{
wchar_t first = in.readUint16Big();
wchar_t second = in.readUint16Big();
char16_t first = in.readUint16Big();
char16_t second = in.readUint16Big();
s32 howMuch = in.readUint32Big();
x1c_kerning.emplace_back(first, second, howMuch);
}
@ -78,14 +78,14 @@ CRasterFont::CRasterFont(urde::CInputStream& in, urde::IObjectStore& store)
void CRasterFont::SinglePassDrawString(const CDrawStringOptions& opts, int x, int y, int& xout, int& yout,
CTextRenderBuffer* renderBuf,
const wchar_t* str, s32 length) const
const char16_t* str, s32 length) const
{
if (!x0_initialized)
return;
const wchar_t* chr = str;
const char16_t* chr = str;
const CGlyph* prevGlyph = nullptr;
while (*chr != '\0')
while (*chr != u'\0')
{
const CGlyph* glyph = GetGlyph(*chr);
if (glyph)
@ -130,7 +130,8 @@ void CRasterFont::DrawSpace(const CDrawStringOptions& opts, int x, int y, int& x
yout = y;
}
void CRasterFont::DrawString(const CDrawStringOptions& opts, int x, int y, int& xout, int& yout, CTextRenderBuffer* renderBuf, const wchar_t* str, int len) const
void CRasterFont::DrawString(const CDrawStringOptions& opts, int x, int y, int& xout, int& yout,
CTextRenderBuffer* renderBuf, const char16_t* str, int len) const
{
if (!x0_initialized)
return;
@ -152,15 +153,15 @@ void CRasterFont::DrawString(const CDrawStringOptions& opts, int x, int y, int&
SinglePassDrawString(opts, x, y, xout, yout, renderBuf, str, len);
}
void CRasterFont::GetSize(const CDrawStringOptions& opts, int& width, int& height, const wchar_t* str, int len) const
void CRasterFont::GetSize(const CDrawStringOptions& opts, int& width, int& height, const char16_t* str, int len) const
{
width = 0;
height = 0;
const wchar_t* chr = str;
const char16_t* chr = str;
const CGlyph* prevGlyph = nullptr;
int prevWidth = 0;
while (*chr != L'\0')
while (*chr != u'\0')
{
const CGlyph* glyph = GetGlyph(*chr);

View File

@ -55,18 +55,18 @@ public:
class CKernPair
{
private:
wchar_t x0_first;
wchar_t x2_second;
char16_t x0_first;
char16_t x2_second;
s32 x4_howMuch;
public:
CKernPair() = default;
CKernPair(wchar_t first, wchar_t second, s32 howMuch)
CKernPair(char16_t first, char16_t second, s32 howMuch)
: x0_first(first), x2_second(second), x4_howMuch(howMuch)
{}
wchar_t GetFirst() const { return x0_first; }
wchar_t GetSecond() const { return x2_second; }
char16_t GetFirst() const { return x0_first; }
char16_t GetSecond() const { return x2_second; }
s32 GetHowMuch() const { return x4_howMuch; }
};
@ -92,7 +92,7 @@ class CRasterFont
bool x0_initialized = false;
s32 x4_monoWidth = 16;
s32 x8_monoHeight = 16;
std::vector<std::pair<wchar_t, CGlyph>> xc_glyphs;
std::vector<std::pair<char16_t, CGlyph>> xc_glyphs;
std::vector<CKernPair> x1c_kerning;
EColorType x2c_mode = EColorType::Main;
CFontInfo x30_fontInfo;
@ -100,7 +100,7 @@ class CRasterFont
s32 x8c_baseline;
s32 x90_lineMargin = 0;
const CGlyph* InternalGetGlyph(wchar_t chr) const
const CGlyph* InternalGetGlyph(char16_t chr) const
{
u32 i = 0;
for (; i < xc_glyphs.size(); ++i)
@ -135,17 +135,17 @@ public:
void SinglePassDrawString(const CDrawStringOptions&, int x, int y, int& xout, int& yout,
CTextRenderBuffer* renderBuf,
const wchar_t* str, s32 len) const;
const char16_t* str, s32 len) const;
void DrawSpace(const CDrawStringOptions& opts, int x, int y, int& xout, int& yout, int len) const;
void DrawString(const CDrawStringOptions& opts, int x, int y, int& xout, int& yout,
CTextRenderBuffer* renderBuf,
const wchar_t* str, int len) const;
const CGlyph* GetGlyph(wchar_t chr) const
const char16_t* str, int len) const;
const CGlyph* GetGlyph(char16_t chr) const
{
return InternalGetGlyph(chr);
}
void GetSize(const CDrawStringOptions& opts, int& width, int& height,
const wchar_t* str, int len) const;
const char16_t* str, int len) const;
TToken<CTexture>& GetTexture() { return x80_texture; }
};

View File

@ -70,13 +70,13 @@ void CStringTable::LoadStringTable(CInputStream &in)
}
}
const wchar_t* CStringTable::GetString(s32 str) const
const char16_t* CStringTable::GetString(s32 str) const
{
if (str < 0 || u32(str) >= x0_stringCount)
return L"Invalid";
return u"Invalid";
u32 off = *reinterpret_cast<u32*>(x4_data.get() + str * 4);
return reinterpret_cast<wchar_t*>(x4_data.get() + off);
return reinterpret_cast<char16_t*>(x4_data.get() + off);
}
void CStringTable::SetLanguage(s32 lang)

View File

@ -17,7 +17,7 @@ public:
CStringTable(CInputStream& in);
void LoadStringTable(CInputStream& in);
const wchar_t* GetString(s32) const;
const char16_t* GetString(s32) const;
static void SetLanguage(s32);
};

View File

@ -133,21 +133,21 @@ std::vector<CToken> CTextExecuteBuffer::GetAssets() const
return ret;
}
void CTextExecuteBuffer::AddString(const wchar_t* str, int count)
void CTextExecuteBuffer::AddString(const char16_t* str, int count)
{
if (!xa4_curLine)
StartNewLine();
const wchar_t* charCur = str;
const wchar_t* wordCur = str;
const char16_t* charCur = str;
const char16_t* wordCur = str;
for (int ac=0 ; *charCur && (ac < count || count == -1) ; ++charCur, ++ac)
{
if (*charCur == L'\n' || *charCur == L' ')
if (*charCur == u'\n' || *charCur == u' ')
{
AddStringFragment(wordCur, charCur - wordCur);
wordCur = charCur + 1;
if (*charCur == L'\n')
if (*charCur == u'\n')
{
StartNewLine();
}
@ -155,7 +155,7 @@ void CTextExecuteBuffer::AddString(const wchar_t* str, int count)
{
StartNewWord();
int w, h;
wchar_t space = L' ';
char16_t space = u' ';
x18_textState.x48_font.GetObj()->GetSize(x18_textState.x0_drawStrOpts,
w, h, &space, 1);
if (xa0_curBlock->x14_direction == ETextDirection::Horizontal)
@ -176,14 +176,14 @@ void CTextExecuteBuffer::AddString(const wchar_t* str, int count)
AddStringFragment(wordCur, charCur - wordCur);
}
void CTextExecuteBuffer::AddStringFragment(const wchar_t* str, int len)
void CTextExecuteBuffer::AddStringFragment(const char16_t* str, int len)
{
if (xa0_curBlock->x14_direction == ETextDirection::Horizontal)
for (int i=0 ; i<len ;)
i += WrapOneLTR(str + i, len - i);
}
int CTextExecuteBuffer::WrapOneLTR(const wchar_t* str, int len)
int CTextExecuteBuffer::WrapOneLTR(const char16_t* str, int len)
{
if (!x18_textState.x48_font)
return len;
@ -204,7 +204,7 @@ int CTextExecuteBuffer::WrapOneLTR(const wchar_t* str, int len)
}
if (w + xa4_curLine->x8_curX > xa0_curBlock->xc_blockExtentX && len > 1)
{
const wchar_t* strEnd = str + len;
const char16_t* strEnd = str + len;
int aRank = 5;
do

View File

@ -46,9 +46,9 @@ public:
InstList::const_iterator pgEnd) const;
std::list<CTextRenderBuffer> BuildRenderBufferPages(const zeus::CVector2i& extent) const;
std::vector<CToken> GetAssets() const;
void AddString(const wchar_t* str, int len);
void AddStringFragment(const wchar_t* str, int len);
int WrapOneLTR(const wchar_t* str, int len);
void AddString(const char16_t* str, int len);
void AddStringFragment(const char16_t* str, int len);
int WrapOneLTR(const char16_t* str, int len);
void MoveWordLTR();
void StartNewLine();
void StartNewWord();

View File

@ -5,7 +5,17 @@
namespace urde
{
CTextColor CTextParser::ParseColor(const wchar_t* str, int len)
static float u16stof(char16_t* str)
{
wchar_t wstr[16];
int i;
for (i=0 ; i<15 && str[i] != u'\0' ; ++i)
wstr[i] = str[i];
wstr[i+1] = L'\0';
return std::wcstof(wstr, nullptr);
}
CTextColor CTextParser::ParseColor(const char16_t* str, int len)
{
u8 r = GetColorValue(str + 1);
u8 g = GetColorValue(str + 3);
@ -16,30 +26,30 @@ CTextColor CTextParser::ParseColor(const wchar_t* str, int len)
return CTextColor(r, g, b, a);
}
u8 CTextParser::GetColorValue(const wchar_t* str)
u8 CTextParser::GetColorValue(const char16_t* str)
{
return (FromHex(str[0]) << 4) + FromHex(str[1]);
}
u32 CTextParser::FromHex(wchar_t ch)
u32 CTextParser::FromHex(char16_t ch)
{
if (ch >= L'0' && ch <= L'9')
return ch - L'0';
if (ch >= u'0' && ch <= u'9')
return ch - u'0';
if (ch >= L'A' && ch <= L'F')
return ch - L'A' + 10;
if (ch >= u'A' && ch <= u'F')
return ch - u'A' + 10;
if (ch >= L'a' && ch <= L'f')
return ch - L'a' + 10;
if (ch >= u'a' && ch <= u'f')
return ch - u'a' + 10;
return 0;
}
s32 CTextParser::ParseInt(const wchar_t* str, int len, bool signVal)
s32 CTextParser::ParseInt(const char16_t* str, int len, bool signVal)
{
bool neg = false;
int procCur = 0;
if (signVal && len && *str == L'-')
if (signVal && len && *str == u'-')
{
neg = true;
procCur = 1;
@ -50,14 +60,14 @@ s32 CTextParser::ParseInt(const wchar_t* str, int len, bool signVal)
{
val *= 10;
wchar_t ch = str[procCur];
val += ch - L'0';
val += ch - u'0';
++procCur;
}
return neg ? -val : val;
}
bool CTextParser::Equals(const wchar_t* str, int len, const wchar_t* other)
bool CTextParser::Equals(const char16_t* str, int len, const char16_t* other)
{
int i=0;
for (; *other && i<len ; ++i, ++str, ++other)
@ -65,10 +75,10 @@ bool CTextParser::Equals(const wchar_t* str, int len, const wchar_t* other)
if (*str != *other)
return false;
}
return other[i] == L'\0';
return other[i] == u'\0';
}
bool CTextParser::BeginsWith(const wchar_t* str, int len, const wchar_t* other)
bool CTextParser::BeginsWith(const char16_t* str, int len, const char16_t* other)
{
int i=0;
for (; *other && i<len ; ++i, ++str, ++other)
@ -79,52 +89,52 @@ bool CTextParser::BeginsWith(const wchar_t* str, int len, const wchar_t* other)
return true;
}
void CTextParser::ParseTag(CTextExecuteBuffer& out, const wchar_t* str, int len)
void CTextParser::ParseTag(CTextExecuteBuffer& out, const char16_t* str, int len)
{
if (BeginsWith(str, len, L"font="))
if (BeginsWith(str, len, u"font="))
{
TToken<CRasterFont> font = GetFont(str + 5, len - 5);
out.AddFont(font);
}
else if (BeginsWith(str, len, L"image="))
else if (BeginsWith(str, len, u"image="))
{
CFontImageDef image = GetImage(str + 6, len - 6);
out.AddImage(image);
}
else if (BeginsWith(str, len, L"fg-color="))
else if (BeginsWith(str, len, u"fg-color="))
{
CTextColor color = ParseColor(str + 9, len - 9);
out.AddColor(EColorType::Foreground, color);
}
else if (BeginsWith(str, len, L"main-color="))
else if (BeginsWith(str, len, u"main-color="))
{
CTextColor color = ParseColor(str + 11, len - 11);
out.AddColor(EColorType::Main, color);
}
else if (BeginsWith(str, len, L"geometry-color="))
else if (BeginsWith(str, len, u"geometry-color="))
{
CTextColor color = ParseColor(str + 15, len - 15);
out.AddColor(EColorType::Geometry, color);
}
else if (BeginsWith(str, len, L"outline-color="))
else if (BeginsWith(str, len, u"outline-color="))
{
CTextColor color = ParseColor(str + 14, len - 14);
out.AddColor(EColorType::Outline, color);
}
else if (BeginsWith(str, len, L"color"))
else if (BeginsWith(str, len, u"color"))
{
const wchar_t* valCur = str + 7;
const char16_t* valCur = str + 7;
len -= 7;
int val = str[6] - L'0';
if (str[7] >= L'0' && str[7] <= L'9')
int val = str[6] - u'0';
if (str[7] >= u'0' && str[7] <= u'9')
{
++valCur;
--len;
val *= 10;
val += str[7] - L'0';
val += str[7] - u'0';
}
if (Equals(valCur + 10, len - 10, L"no"))
if (Equals(valCur + 10, len - 10, u"no"))
out.AddRemoveColorOverride(val);
else
{
@ -132,80 +142,80 @@ void CTextParser::ParseTag(CTextExecuteBuffer& out, const wchar_t* str, int len)
out.AddColorOverride(val, color);
}
}
else if (BeginsWith(str, len, L"line-spacing="))
else if (BeginsWith(str, len, u"line-spacing="))
{
out.AddLineSpacing(ParseInt(str + 13, len - 13, true) / 100.0);
}
else if (BeginsWith(str, len, L"line-extra-space="))
else if (BeginsWith(str, len, u"line-extra-space="))
{
out.AddLineSpacing(ParseInt(str + 17, len - 17, true));
}
else if (BeginsWith(str, len, L"just="))
else if (BeginsWith(str, len, u"just="))
{
if (Equals(str + 5, len - 5, L"left"))
if (Equals(str + 5, len - 5, u"left"))
out.AddJustification(EJustification::Left);
else if (Equals(str + 5, len - 5, L"center"))
else if (Equals(str + 5, len - 5, u"center"))
out.AddJustification(EJustification::Center);
else if (Equals(str + 5, len - 5, L"right"))
else if (Equals(str + 5, len - 5, u"right"))
out.AddJustification(EJustification::Right);
else if (Equals(str + 5, len - 5, L"full"))
else if (Equals(str + 5, len - 5, u"fulu"))
out.AddJustification(EJustification::Full);
else if (Equals(str + 5, len - 5, L"nleft"))
else if (Equals(str + 5, len - 5, u"nleft"))
out.AddJustification(EJustification::NLeft);
else if (Equals(str + 5, len - 5, L"ncenter"))
else if (Equals(str + 5, len - 5, u"ncenter"))
out.AddJustification(EJustification::NCenter);
else if (Equals(str + 5, len - 5, L"nright"))
else if (Equals(str + 5, len - 5, u"nright"))
out.AddJustification(EJustification::NRight);
}
else if (BeginsWith(str, len, L"vjust="))
else if (BeginsWith(str, len, u"vjust="))
{
if (Equals(str + 6, len - 6, L"top"))
if (Equals(str + 6, len - 6, u"top"))
out.AddVerticalJustification(EVerticalJustification::Top);
else if (Equals(str + 6, len - 6, L"center"))
else if (Equals(str + 6, len - 6, u"center"))
out.AddVerticalJustification(EVerticalJustification::Center);
else if (Equals(str + 6, len - 6, L"bottom"))
else if (Equals(str + 6, len - 6, u"bottom"))
out.AddVerticalJustification(EVerticalJustification::Bottom);
else if (Equals(str + 6, len - 6, L"full"))
else if (Equals(str + 6, len - 6, u"fulu"))
out.AddVerticalJustification(EVerticalJustification::Full);
else if (Equals(str + 6, len - 6, L"ntop"))
else if (Equals(str + 6, len - 6, u"ntop"))
out.AddVerticalJustification(EVerticalJustification::NTop);
else if (Equals(str + 6, len - 6, L"ncenter"))
else if (Equals(str + 6, len - 6, u"ncenter"))
out.AddVerticalJustification(EVerticalJustification::NCenter);
else if (Equals(str + 6, len - 6, L"nbottom"))
else if (Equals(str + 6, len - 6, u"nbottom"))
out.AddVerticalJustification(EVerticalJustification::NBottom);
}
else if (Equals(str, len, L"push"))
else if (Equals(str, len, u"push"))
{
out.AddPushState();
}
else if (Equals(str, len, L"pop"))
else if (Equals(str, len, u"pop"))
{
out.AddPopState();
}
}
CFontImageDef CTextParser::GetImage(const wchar_t* str, int len)
CFontImageDef CTextParser::GetImage(const char16_t* str, int len)
{
int commaCount = 0;
for (int i=0 ; i<len ; ++i)
if (str[i] == L',')
if (str[i] == u',')
++commaCount;
if (commaCount)
{
std::wstring iterable(str, len);
std::u16string iterable(str, len);
size_t tokenPos;
size_t commaPos;
commaPos = iterable.find(L',');
iterable[commaPos] = L'\0';
commaPos = iterable.find(u',');
iterable[commaPos] = u'\0';
tokenPos = commaPos + 1;
auto AdvanceCommaPos = [&]()
{
commaPos = iterable.find(L',', tokenPos);
if (commaPos == std::wstring::npos)
commaPos = iterable.find(u',', tokenPos);
if (commaPos == std::u16string::npos)
commaPos = iterable.size();
iterable[commaPos] = L'\0';
iterable[commaPos] = u'\0';
};
auto AdvanceTokenPos = [&]()
@ -213,11 +223,11 @@ CFontImageDef CTextParser::GetImage(const wchar_t* str, int len)
tokenPos = commaPos + 1;
};
if (BeginsWith(str, len, L"A"))
if (BeginsWith(str, len, u"A"))
{
/* Animated texture array */
AdvanceCommaPos();
float interval = std::wcstof(&iterable[tokenPos], nullptr);
float interval = u16stof(&iterable[tokenPos]);
AdvanceTokenPos();
std::vector<TToken<CTexture>> texs;
@ -232,19 +242,19 @@ CFontImageDef CTextParser::GetImage(const wchar_t* str, int len)
return CFontImageDef(std::move(texs), interval, zeus::CVector2f(1.f, 1.f));
}
else if (BeginsWith(str, len, L"SA"))
else if (BeginsWith(str, len, u"SA"))
{
/* Scaled and animated texture array */
AdvanceCommaPos();
float interval = std::wcstof(&iterable[tokenPos], nullptr);
float interval = u16stof(&iterable[tokenPos]);
AdvanceTokenPos();
AdvanceCommaPos();
float scaleX = std::wcstof(&iterable[tokenPos], nullptr);
float scaleX = u16stof(&iterable[tokenPos]);
AdvanceTokenPos();
AdvanceCommaPos();
float scaleY = std::wcstof(&iterable[tokenPos], nullptr);
float scaleY = u16stof(&iterable[tokenPos]);
AdvanceTokenPos();
std::vector<TToken<CTexture>> texs;
@ -259,15 +269,15 @@ CFontImageDef CTextParser::GetImage(const wchar_t* str, int len)
return CFontImageDef(std::move(texs), interval, zeus::CVector2f(scaleX, scaleY));
}
else if (BeginsWith(str, len, L"SI"))
else if (BeginsWith(str, len, u"SI"))
{
/* Scaled single texture */
AdvanceCommaPos();
float scaleX = std::wcstof(&iterable[tokenPos], nullptr);
float scaleX = u16stof(&iterable[tokenPos]);
AdvanceTokenPos();
AdvanceCommaPos();
float scaleY = std::wcstof(&iterable[tokenPos], nullptr);
float scaleY = u16stof(&iterable[tokenPos]);
AdvanceTokenPos();
AdvanceCommaPos();
@ -283,7 +293,7 @@ CFontImageDef CTextParser::GetImage(const wchar_t* str, int len)
return CFontImageDef(std::move(tex), zeus::CVector2f(1.f, 1.f));
}
ResId CTextParser::GetAssetIdFromString(const wchar_t* str)
ResId CTextParser::GetAssetIdFromString(const char16_t* str)
{
u8 r = GetColorValue(str);
u8 g = GetColorValue(str + 2);
@ -292,27 +302,27 @@ ResId CTextParser::GetAssetIdFromString(const wchar_t* str)
return (r << 24) | (g << 16) | (b << 8) | a;
}
TToken<CRasterFont> CTextParser::GetFont(const wchar_t* str, int len)
TToken<CRasterFont> CTextParser::GetFont(const char16_t* str, int len)
{
return x0_store.GetObj({SBIG('FONT'), GetAssetIdFromString(str)});
}
void CTextParser::ParseText(CTextExecuteBuffer& out, const wchar_t* str, int len)
void CTextParser::ParseText(CTextExecuteBuffer& out, const char16_t* str, int len)
{
for (int b=0, e=0 ; str[e] && (len == -1 || e < len) ;)
{
if (str[e] != L'&')
if (str[e] != u'&')
{
++e;
continue;
}
if ((len == -1 || e+1 < len) && str[e+1] != L'&')
if ((len == -1 || e+1 < len) && str[e+1] != u'&')
{
out.AddString(str + b, e - b);
++e;
b = e;
while (str[e] && (len == -1 || e < len) && str[e] != L';')
while (str[e] && (len == -1 || e < len) && str[e] != u';')
++e;
ParseTag(out, str + e, e - b);

View File

@ -12,20 +12,20 @@ class CTextParser
{
IObjectStore& x0_store;
static CTextColor ParseColor(const wchar_t* str, int len);
static u8 GetColorValue(const wchar_t* str);
static u32 FromHex(wchar_t ch);
static s32 ParseInt(const wchar_t* str, int len, bool signVal);
static ResId GetAssetIdFromString(const wchar_t* str);
static bool Equals(const wchar_t* str, int len, const wchar_t* other);
static bool BeginsWith(const wchar_t* str, int len, const wchar_t* other);
void ParseTag(CTextExecuteBuffer& out, const wchar_t* str, int len);
CFontImageDef GetImage(const wchar_t* str, int len);
TToken<CRasterFont> GetFont(const wchar_t* str, int len);
static CTextColor ParseColor(const char16_t* str, int len);
static u8 GetColorValue(const char16_t* str);
static u32 FromHex(char16_t ch);
static s32 ParseInt(const char16_t* str, int len, bool signVal);
static ResId GetAssetIdFromString(const char16_t* str);
static bool Equals(const char16_t* str, int len, const char16_t* other);
static bool BeginsWith(const char16_t* str, int len, const char16_t* other);
void ParseTag(CTextExecuteBuffer& out, const char16_t* str, int len);
CFontImageDef GetImage(const char16_t* str, int len);
TToken<CRasterFont> GetFont(const char16_t* str, int len);
public:
CTextParser(IObjectStore& store) : x0_store(store) {}
void ParseText(CTextExecuteBuffer& out, const wchar_t* str, int len);
void ParseText(CTextExecuteBuffer& out, const char16_t* str, int len);
};
}

View File

@ -286,7 +286,7 @@ void CFrontEndUI::SNewFileSelectFrame::DeactivateNewGamePopup()
x64_fileSelections[x20_tablegroup_fileselect->GetUserSelection()].
x0_base->SetColor(zeus::CColor::skWhite);
x60_textpane_cancel->TextSupport()->SetText(L"");
x60_textpane_cancel->TextSupport()->SetText(u"");
}
void CFrontEndUI::SNewFileSelectFrame::ActivateNewGamePopup()
@ -339,7 +339,7 @@ void CFrontEndUI::SNewFileSelectFrame::ResetFrame()
for (int i=2 ; i>=0 ; --i)
x20_tablegroup_fileselect->GetWorkerWidget(i)->SetIsSelectable(true);
x60_textpane_cancel->TextSupport()->SetText(L"");
x60_textpane_cancel->TextSupport()->SetText(u"");
}
void CFrontEndUI::SNewFileSelectFrame::ActivateErase()
@ -383,7 +383,7 @@ void CFrontEndUI::SNewFileSelectFrame::ClearFrameContents()
option.x2c_chRate = SFileMenuOption::ComputeRandom();
option.x28_curField = -1;
for (int j=0 ; j<4 ; ++j)
option.x4_textpanes[j].SetPairText(L"");
option.x4_textpanes[j].SetPairText(u"");
}
StartTextAnimating(x28_textpane_erase.x0_panes[0], g_MainStringTable->GetString(38), 60.f);
@ -439,7 +439,7 @@ void CFrontEndUI::SNewFileSelectFrame::SetupFrameContents()
{
if (++option.x28_curField < 4)
{
std::wstring str;
std::u16string str;
SGuiTextPair& populatePair = option.x4_textpanes[option.x28_curField];
const CGameState::GameFileStateInfo* data = x4_saveUI->GetGameData(i);
@ -449,8 +449,8 @@ void CFrontEndUI::SNewFileSelectFrame::SetupFrameContents()
// Completion percent
if (data)
{
std::wstring fileStr = g_MainStringTable->GetString(data->x20_hardMode ? 106 : 39);
str = fileStr + hecl::WideFormat(L" %02d%%", data->x18_itemPercent);
std::u16string fileStr = g_MainStringTable->GetString(data->x20_hardMode ? 106 : 39);
str = fileStr + hecl::Char16Format(L" %02d%%", data->x18_itemPercent);
break;
}
str = g_MainStringTable->GetString(36);
@ -475,7 +475,7 @@ void CFrontEndUI::SNewFileSelectFrame::SetupFrameContents()
if (data)
{
auto pt = std::div(data->x0_playTime, 3600);
str = hecl::WideFormat(L"%02d:%02d", pt.quot, pt.rem / 60);
str = hecl::Char16Format(L"%02d:%02d", pt.quot, pt.rem / 60);
}
str = g_MainStringTable->GetString(52);
break;
@ -614,7 +614,7 @@ CFrontEndUI::SFileMenuOption CFrontEndUI::SNewFileSelectFrame::FindFileSelectOpt
return ret;
}
void CFrontEndUI::SNewFileSelectFrame::StartTextAnimating(CGuiTextPane* text, const std::wstring& str, float chRate)
void CFrontEndUI::SNewFileSelectFrame::StartTextAnimating(CGuiTextPane* text, const std::u16string& str, float chRate)
{
text->TextSupport()->SetText(str);
text->TextSupport()->SetTypeWriteEffectOptions(true, 0.1f, chRate);
@ -710,17 +710,17 @@ void CFrontEndUI::SFusionBonusFrame::SGBALinkFrame::SetUIText(EUIType tp)
break;
}
std::wstring instructionsStr;
std::u16string instructionsStr;
if (instructions != -1)
instructionsStr = g_MainStringTable->GetString(instructions);
xc_textpane_instructions.SetPairText(instructionsStr);
std::wstring yesStr;
std::u16string yesStr;
if (yes != -1)
yesStr = g_MainStringTable->GetString(yes);
x14_textpane_yes->TextSupport()->SetText(yesStr);
std::wstring noStr;
std::u16string noStr;
if (no != -1)
noStr = g_MainStringTable->GetString(no);
x18_textpane_no->TextSupport()->SetText(noStr);
@ -947,7 +947,7 @@ void CFrontEndUI::SFusionBonusFrame::Update(float dt, CSaveUI* saveUI)
x2c_tablegroup_fusionsuit->SetIsVisible(showFusionSuitProceed);
x24_loadedFrame->FindWidget("textpane_proceed")->SetIsVisible(showFusionSuitProceed);
std::wstring instructionStr;
std::u16string instructionStr;
if (x28_tablegroup_options->GetUserSelection() == 1)
{
/* Fusion Suit */
@ -1022,7 +1022,7 @@ void CFrontEndUI::SFusionBonusFrame::DoCancel(CGuiTableGroup* caller)
x8_action = EAction::GoBack;
x28_tablegroup_options->SetUserSelection(0);
x2c_tablegroup_fusionsuit->SetIsActive(false);
x30_textpane_instructions.SetPairText(L"");
x30_textpane_instructions.SetPairText(u"");
SetTableColors(x28_tablegroup_options);
}
}
@ -1090,7 +1090,7 @@ void CFrontEndUI::SFusionBonusFrame::DoAdvance(CGuiTableGroup* caller)
}
}
void CFrontEndUI::SGuiTextPair::SetPairText(const std::wstring& str)
void CFrontEndUI::SGuiTextPair::SetPairText(const std::u16string& str)
{
x0_panes[0]->TextSupport()->SetText(str);
x0_panes[1]->TextSupport()->SetText(str);
@ -1104,7 +1104,7 @@ CFrontEndUI::SGuiTextPair CFrontEndUI::FindTextPanePair(CGuiFrame* frame, const
return ret;
}
void CFrontEndUI::FindAndSetPairText(CGuiFrame* frame, const char* name, const std::wstring& str)
void CFrontEndUI::FindAndSetPairText(CGuiFrame* frame, const char* name, const std::u16string& str)
{
CGuiTextPane* w1 = static_cast<CGuiTextPane*>(frame->FindWidget(name));
w1->TextSupport()->SetText(str);
@ -1557,7 +1557,7 @@ void CFrontEndUI::SOptionsFrontEndFrame::SetRightUIText()
}
else
{
FindTextPanePair(x1c_loadedFrame, name).SetPairText(L"");
FindTextPanePair(x1c_loadedFrame, name).SetPairText(u"");
x28_tablegroup_rightmenu->GetWorkerWidget(i)->SetIsSelectable(false);
}
}

View File

@ -78,10 +78,10 @@ public:
struct SGuiTextPair
{
CGuiTextPane* x0_panes[2] = {};
void SetPairText(const std::wstring& str);
void SetPairText(const std::u16string& str);
};
static SGuiTextPair FindTextPanePair(CGuiFrame* frame, const char* name);
static void FindAndSetPairText(CGuiFrame* frame, const char* name, const std::wstring& str);
static void FindAndSetPairText(CGuiFrame* frame, const char* name, const std::u16string& str);
struct SFileMenuOption
{
@ -168,7 +168,7 @@ public:
void DoFileMenuAdvance(CGuiTableGroup* caller);
static SFileMenuOption FindFileSelectOption(CGuiFrame* frame, int idx);
static void StartTextAnimating(CGuiTextPane* text, const std::wstring& str, float chRate);
static void StartTextAnimating(CGuiTextPane* text, const std::u16string& str, float chRate);
};
struct SFusionBonusFrame

View File

@ -29,7 +29,7 @@ ECardResult CMemoryCardDriver::SFileInfo::Close()
ECardResult CMemoryCardDriver::SFileInfo::StartRead()
{
CMemoryCardSys::CardStat stat = {};
ECardResult result = CMemoryCardSys::GetStatus(x0_fileInfo, stat);
ECardResult result = CMemoryCardSys::GetStatus(x0_fileInfo.slot, x0_fileInfo.getFileNo(), stat);
if (result != ECardResult::READY)
return result;
@ -78,7 +78,7 @@ ECardResult CMemoryCardDriver::SFileInfo::FileRead()
ECardResult CMemoryCardDriver::SFileInfo::GetSaveDataOffset(u32& offOut)
{
CMemoryCardSys::CardStat stat = {};
ECardResult result = CMemoryCardSys::GetStatus(x0_fileInfo, stat);
ECardResult result = CMemoryCardSys::GetStatus(x0_fileInfo.slot, x0_fileInfo.getFileNo(), stat);
if (result != ECardResult::READY)
{
offOut = -1;
@ -189,7 +189,8 @@ void CMemoryCardDriver::ReadFinished()
{
CMemoryCardSys::CardStat stat = {};
SFileInfo& fileInfo = x100_mcFileInfos[x194_fileIdx].second;
if (CMemoryCardSys::GetStatus(fileInfo.x0_fileInfo, stat) != ECardResult::READY)
if (CMemoryCardSys::GetStatus(fileInfo.x0_fileInfo.slot,
fileInfo.x0_fileInfo.getFileNo(), stat) != ECardResult::READY)
{
NoCardFound();
return;
@ -201,7 +202,8 @@ void CMemoryCardDriver::ReadFinished()
r.readBytesToBuf(x30_systemData, 174);
for (int i=0 ; i<3 ; ++i)
xe4_fileSlots[i] = LoadSaveFile(r);
if (header.x4_savePresent[i])
xe4_fileSlots[i] = LoadSaveFile(r);
if (x19d_inGame)
ImportPersistentOptions();
@ -245,7 +247,8 @@ void CMemoryCardDriver::IndexFiles()
else if (result == ECardResult::READY)
{
CMemoryCardSys::CardStat stat = {};
if (CMemoryCardSys::GetStatus(info.second.x0_fileInfo, stat) ==
if (CMemoryCardSys::GetStatus(info.second.x0_fileInfo.slot,
info.second.x0_fileInfo.getFileNo(), stat) ==
ECardResult::READY)
{
u32 comment = stat.GetCommentAddr();
@ -278,11 +281,13 @@ void CMemoryCardDriver::IndexFiles()
if (x100_mcFileInfos[1].first == EFileState::File)
{
CMemoryCardSys::CardStat stat = {};
if (CMemoryCardSys::GetStatus(x100_mcFileInfos[0].second.x0_fileInfo, stat) ==
if (CMemoryCardSys::GetStatus(x100_mcFileInfos[0].second.x0_fileInfo.slot,
x100_mcFileInfos[0].second.x0_fileInfo.getFileNo(), stat) ==
ECardResult::READY)
{
u32 timeA = stat.GetTime();
if (CMemoryCardSys::GetStatus(x100_mcFileInfos[1].second.x0_fileInfo, stat) ==
if (CMemoryCardSys::GetStatus(x100_mcFileInfos[1].second.x0_fileInfo.slot,
x100_mcFileInfos[1].second.x0_fileInfo.getFileNo(), stat) ==
ECardResult::READY)
{
u32 timeB = stat.GetTime();

View File

@ -74,6 +74,7 @@ private:
struct SFileInfo
{
CMemoryCardSys::CardFileHandle x0_fileInfo;
std::string x14_name;
std::vector<u8> x24_saveFileData;
std::vector<u8> x34_saveData;
@ -81,7 +82,7 @@ private:
kabufuda::ECardResult Open();
kabufuda::ECardResult Close();
kabufuda::ECardSlot GetFileCardPort() const { return x0_fileInfo.slot; }
int GetFileNo() const { return x0_fileInfo->getFileNo(); }
int GetFileNo() const { return x0_fileInfo.getFileNo(); }
kabufuda::ECardResult StartRead();
kabufuda::ECardResult TryFileRead();
kabufuda::ECardResult FileRead();

View File

@ -30,7 +30,7 @@ void CSaveUI::ResetCardDriver()
CIOWin::EMessageReturn CSaveUI::Update(float dt)
{
if (PumpLoad())
if (!PumpLoad())
return CIOWin::EMessageReturn::Normal;
x50_loadedFrame->Update(dt);
@ -61,6 +61,10 @@ CIOWin::EMessageReturn CSaveUI::Update(float dt)
x6c_cardDriver->IndexFiles();
}
}
else
{
x6c_cardDriver->IndexFiles();
}
}
else if (x6c_cardDriver->x10_state == EState::Ready)
{
@ -304,30 +308,30 @@ void CSaveUI::SetUIText()
default: break;
}
std::wstring msgAStr;
std::u16string msgAStr;
if (msgA != -1)
msgAStr = x38_strgMemoryCard->GetString(msgA);
std::wstring msgBStr;
std::u16string msgBStr;
if (msgB != -1)
msgBStr = x38_strgMemoryCard->GetString(msgB);
x54_textpane_message->TextSupport()->SetText(msgAStr + msgBStr);
std::wstring opt0Str;
std::u16string opt0Str;
if (opt0 != -1)
opt0Str = x38_strgMemoryCard->GetString(opt0);
x5c_textpane_choice0->TextSupport()->SetText(opt0Str);
std::wstring opt1Str;
std::u16string opt1Str;
if (opt1 != -1)
opt1Str = x38_strgMemoryCard->GetString(opt1);
x60_textpane_choice1->TextSupport()->SetText(opt1Str);
std::wstring opt2Str;
std::u16string opt2Str;
if (opt2 != -1)
opt2Str = x38_strgMemoryCard->GetString(opt2);
x64_textpane_choice2->TextSupport()->SetText(opt2Str);
std::wstring opt3Str;
std::u16string opt3Str;
x68_textpane_choice3->TextSupport()->SetText(opt3Str);
x5c_textpane_choice0->SetIsSelectable(opt0 != -1);

View File

@ -389,7 +389,7 @@ void CWorldTransManager::EnableTransition(ResId fontId, ResId stringId, bool b1,
x8_textData->SetTypeWriteEffectOptions(true, chFadeTime, chFadeRate);
xc_strTable = g_SimplePool->GetObj(SObjectTag{FOURCC('STRG'), stringId});
x8_textData->SetText(L"");
x8_textData->SetText(u"");
}
void CWorldTransManager::DisableTransition()

2
hecl

@ -1 +1 @@
Subproject commit df935c31c1f5c21519ed432c128dd7b1541cd972
Subproject commit 767d2a471138dfa7f68e3254fdb942151b02cb78

@ -1 +1 @@
Subproject commit 3121f67f4da34f64bcef3aecab1d269fc5a4e035
Subproject commit 408ac735b4741d2d4b27e1cf985c3f69098025be