mirror of
https://github.com/HarbourMasters/Shipwright.git
synced 2025-02-16 15:20:11 -05:00
Implemented PAL language support.
This commit is contained in:
parent
c66c874549
commit
bd5a563dae
@ -12,6 +12,7 @@ REGISTER_ZFILENODE(Text, ZText);
|
|||||||
ZText::ZText(ZFile* nParent) : ZResource(nParent)
|
ZText::ZText(ZFile* nParent) : ZResource(nParent)
|
||||||
{
|
{
|
||||||
RegisterRequiredAttribute("CodeOffset");
|
RegisterRequiredAttribute("CodeOffset");
|
||||||
|
RegisterOptionalAttribute("LangOffset", "0");
|
||||||
}
|
}
|
||||||
|
|
||||||
void ZText::ParseRawData()
|
void ZText::ParseRawData()
|
||||||
@ -20,6 +21,16 @@ void ZText::ParseRawData()
|
|||||||
|
|
||||||
const auto& rawData = parent->GetRawData();
|
const auto& rawData = parent->GetRawData();
|
||||||
uint32_t currentPtr = StringHelper::StrToL(registeredAttributes.at("CodeOffset").value, 16);
|
uint32_t currentPtr = StringHelper::StrToL(registeredAttributes.at("CodeOffset").value, 16);
|
||||||
|
uint32_t langPtr = currentPtr;
|
||||||
|
bool isPalLang = false;
|
||||||
|
|
||||||
|
if (StringHelper::StrToL(registeredAttributes.at("LangOffset").value, 16) != 0)
|
||||||
|
{
|
||||||
|
langPtr = StringHelper::StrToL(registeredAttributes.at("LangOffset").value, 16);
|
||||||
|
|
||||||
|
if (langPtr != currentPtr)
|
||||||
|
isPalLang = true;
|
||||||
|
}
|
||||||
|
|
||||||
std::vector<uint8_t> codeData;
|
std::vector<uint8_t> codeData;
|
||||||
|
|
||||||
@ -34,8 +45,18 @@ void ZText::ParseRawData()
|
|||||||
msgEntry.id = BitConverter::ToInt16BE(codeData, currentPtr + 0);
|
msgEntry.id = BitConverter::ToInt16BE(codeData, currentPtr + 0);
|
||||||
msgEntry.textboxType = (codeData[currentPtr + 2] & 0xF0) >> 4;
|
msgEntry.textboxType = (codeData[currentPtr + 2] & 0xF0) >> 4;
|
||||||
msgEntry.textboxYPos = (codeData[currentPtr + 2] & 0x0F);
|
msgEntry.textboxYPos = (codeData[currentPtr + 2] & 0x0F);
|
||||||
msgEntry.segmentId = (codeData[currentPtr + 4]);
|
|
||||||
msgEntry.msgOffset = BitConverter::ToInt32BE(codeData, currentPtr + 4) & 0x00FFFFFF;
|
if (isPalLang)
|
||||||
|
{
|
||||||
|
msgEntry.segmentId = (codeData[langPtr + 0]);
|
||||||
|
msgEntry.msgOffset = BitConverter::ToInt32BE(codeData, langPtr + 0) & 0x00FFFFFF;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
msgEntry.segmentId = (codeData[langPtr + 4]);
|
||||||
|
msgEntry.msgOffset = BitConverter::ToInt32BE(codeData, langPtr + 4) & 0x00FFFFFF;
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t msgPtr = msgEntry.msgOffset;
|
uint32_t msgPtr = msgEntry.msgOffset;
|
||||||
|
|
||||||
unsigned char c = rawData[msgPtr];
|
unsigned char c = rawData[msgPtr];
|
||||||
@ -82,6 +103,11 @@ void ZText::ParseRawData()
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
currentPtr += 8;
|
currentPtr += 8;
|
||||||
|
|
||||||
|
if (isPalLang)
|
||||||
|
langPtr += 4;
|
||||||
|
else
|
||||||
|
langPtr += 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
int bp2 = 0;
|
int bp2 = 0;
|
||||||
|
5
soh/assets/xml/GC_NMQ_D/text/fra_message_data_static.xml
Normal file
5
soh/assets/xml/GC_NMQ_D/text/fra_message_data_static.xml
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<Root>
|
||||||
|
<File Name="fra_message_data_static">
|
||||||
|
<Text Name="fra_message_data_static" CodeOffset="0x12E4E0" LangOffset="0x134818"/>
|
||||||
|
</File>
|
||||||
|
</Root>
|
5
soh/assets/xml/GC_NMQ_D/text/ger_message_data_static.xml
Normal file
5
soh/assets/xml/GC_NMQ_D/text/ger_message_data_static.xml
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<Root>
|
||||||
|
<File Name="ger_message_data_static">
|
||||||
|
<Text Name="ger_message_data_static" CodeOffset="0x12E4E0" LangOffset="0x132708"/>
|
||||||
|
</File>
|
||||||
|
</Root>
|
@ -0,0 +1,5 @@
|
|||||||
|
<Root>
|
||||||
|
<File Name="fra_message_data_static">
|
||||||
|
<Text Name="fra_message_data_static" CodeOffset="0xF6910" LangOffset="0xFCC48"/>
|
||||||
|
</File>
|
||||||
|
</Root>
|
@ -0,0 +1,5 @@
|
|||||||
|
<Root>
|
||||||
|
<File Name="ger_message_data_static">
|
||||||
|
<Text Name="ger_message_data_static" CodeOffset="0xF6910" LangOffset="0xFAB38"/>
|
||||||
|
</File>
|
||||||
|
</Root>
|
@ -8,27 +8,37 @@
|
|||||||
#include <Text.h>
|
#include <Text.h>
|
||||||
|
|
||||||
extern "C" MessageTableEntry* sNesMessageEntryTablePtr;
|
extern "C" MessageTableEntry* sNesMessageEntryTablePtr;
|
||||||
|
extern "C" MessageTableEntry* sGerMessageEntryTablePtr;
|
||||||
|
extern "C" MessageTableEntry* sFraMessageEntryTablePtr;
|
||||||
extern "C" MessageTableEntry* sStaffMessageEntryTablePtr;
|
extern "C" MessageTableEntry* sStaffMessageEntryTablePtr;
|
||||||
//extern "C" MessageTableEntry* _message_0xFFFC_nes;
|
//extern "C" MessageTableEntry* _message_0xFFFC_nes;
|
||||||
|
|
||||||
|
MessageTableEntry* OTRMessage_LoadTable(const char* filePath, bool isNES) {
|
||||||
|
auto file = std::static_pointer_cast<Ship::Text>(OTRGlobals::Instance->context->GetResourceManager()->LoadResource(filePath));
|
||||||
|
|
||||||
|
if (file == nullptr)
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
MessageTableEntry* table = (MessageTableEntry*)malloc(sizeof(MessageTableEntry) * file->messages.size());
|
||||||
|
|
||||||
|
for (int i = 0; i < file->messages.size(); i++) {
|
||||||
|
table[i].textId = file->messages[i].id;
|
||||||
|
table[i].typePos = (file->messages[i].textboxType << 4) | file->messages[i].textboxYPos;
|
||||||
|
table[i].segment = file->messages[i].msg.c_str();
|
||||||
|
table[i].msgSize = file->messages[i].msg.size();
|
||||||
|
|
||||||
|
if (isNES && file->messages[i].id == 0xFFFC)
|
||||||
|
_message_0xFFFC_nes = (char*)file->messages[i].msg.c_str();
|
||||||
|
}
|
||||||
|
|
||||||
|
return table;
|
||||||
|
}
|
||||||
|
|
||||||
extern "C" void OTRMessage_Init()
|
extern "C" void OTRMessage_Init()
|
||||||
{
|
{
|
||||||
auto file = std::static_pointer_cast<Ship::Text>(OTRGlobals::Instance->context->GetResourceManager()->LoadResource("text/nes_message_data_static/nes_message_data_static"));
|
sNesMessageEntryTablePtr = OTRMessage_LoadTable("text/nes_message_data_static/nes_message_data_static", true);
|
||||||
|
sGerMessageEntryTablePtr = OTRMessage_LoadTable("text/ger_message_data_static/ger_message_data_static", false);
|
||||||
sNesMessageEntryTablePtr = (MessageTableEntry*)malloc(sizeof(MessageTableEntry) * file->messages.size());
|
sFraMessageEntryTablePtr = OTRMessage_LoadTable("text/fra_message_data_static/fra_message_data_static", false);
|
||||||
|
|
||||||
for (int i = 0; i < file->messages.size(); i++)
|
|
||||||
{
|
|
||||||
sNesMessageEntryTablePtr[i].textId = file->messages[i].id;
|
|
||||||
sNesMessageEntryTablePtr[i].typePos = (file->messages[i].textboxType << 4) | file->messages[i].textboxYPos;
|
|
||||||
sNesMessageEntryTablePtr[i].segment = file->messages[i].msg.c_str();
|
|
||||||
sNesMessageEntryTablePtr[i].msgSize = file->messages[i].msg.size();
|
|
||||||
|
|
||||||
if (file->messages[i].id == 0xFFFC)
|
|
||||||
{
|
|
||||||
_message_0xFFFC_nes = (char*)file->messages[i].msg.c_str();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
auto file2 = std::static_pointer_cast<Ship::Text>(OTRGlobals::Instance->context->GetResourceManager()->LoadResource("text/staff_message_data_static/staff_message_data_static"));
|
auto file2 = std::static_pointer_cast<Ship::Text>(OTRGlobals::Instance->context->GetResourceManager()->LoadResource("text/staff_message_data_static/staff_message_data_static"));
|
||||||
|
|
||||||
|
@ -33,42 +33,12 @@ s16 sMessageHasSetSfx = false;
|
|||||||
u16 sOcarinaSongBitFlags = 0; // ocarina bit flags
|
u16 sOcarinaSongBitFlags = 0; // ocarina bit flags
|
||||||
|
|
||||||
MessageTableEntry* sNesMessageEntryTablePtr;
|
MessageTableEntry* sNesMessageEntryTablePtr;
|
||||||
|
MessageTableEntry* sGerMessageEntryTablePtr;
|
||||||
|
MessageTableEntry* sFraMessageEntryTablePtr;
|
||||||
MessageTableEntry* sStaffMessageEntryTablePtr;
|
MessageTableEntry* sStaffMessageEntryTablePtr;
|
||||||
|
|
||||||
char* _message_0xFFFC_nes;
|
char* _message_0xFFFC_nes;
|
||||||
|
|
||||||
//MessageTableEntry sNesMessageEntryTable[] = {
|
|
||||||
//#define DEFINE_MESSAGE(textId, type, yPos, nesMessage, gerMessage, fraMessage) \
|
|
||||||
// { textId, (_SHIFTL(type, 4, 8) | _SHIFTL(yPos, 0, 8)), _message_##textId##_nes },
|
|
||||||
//#define DEFINE_MESSAGE_FFFC
|
|
||||||
//#include "text/message_data.h"
|
|
||||||
//#undef DEFINE_MESSAGE_FFFC
|
|
||||||
//#undef DEFINE_MESSAGE
|
|
||||||
// { 0xFFFF, 0, NULL },
|
|
||||||
//};
|
|
||||||
//
|
|
||||||
//const char* sGerMessageEntryTable[] = {
|
|
||||||
//#define DEFINE_MESSAGE(textId, type, yPos, nesMessage, gerMessage, fraMessage) _message_##textId##_ger,
|
|
||||||
//#include "text/message_data.h"
|
|
||||||
//#undef DEFINE_MESSAGE
|
|
||||||
// NULL,
|
|
||||||
//};
|
|
||||||
//
|
|
||||||
//const char* sFraMessageEntryTable[] = {
|
|
||||||
//#define DEFINE_MESSAGE(textId, type, yPos, nesMessage, gerMessage, fraMessage) _message_##textId##_fra,
|
|
||||||
//#include "text/message_data.h"
|
|
||||||
//#undef DEFINE_MESSAGE
|
|
||||||
// NULL,
|
|
||||||
//};
|
|
||||||
//
|
|
||||||
//MessageTableEntry sStaffMessageEntryTable[] = {
|
|
||||||
//#define DEFINE_MESSAGE(textId, type, yPos, staffMessage) \
|
|
||||||
// { textId, (_SHIFTL(type, 4, 8) | _SHIFTL(yPos, 0, 8)), _message_##textId##_staff },
|
|
||||||
//#include "text/message_data_staff.h"
|
|
||||||
//#undef DEFINE_MESSAGE
|
|
||||||
// { 0xFFFF, 0, NULL },
|
|
||||||
//};
|
|
||||||
|
|
||||||
//MessageTableEntry* sNesMessageEntryTablePtr = sNesMessageEntryTable;
|
//MessageTableEntry* sNesMessageEntryTablePtr = sNesMessageEntryTable;
|
||||||
//const char** sGerMessageEntryTablePtr = sGerMessageEntryTable;
|
//const char** sGerMessageEntryTablePtr = sGerMessageEntryTable;
|
||||||
//const char** sFraMessageEntryTablePtr = sFraMessageEntryTable;
|
//const char** sFraMessageEntryTablePtr = sFraMessageEntryTable;
|
||||||
@ -310,69 +280,46 @@ void Message_FindMessage(GlobalContext* globalCtx, u16 textId) {
|
|||||||
Font* font;
|
Font* font;
|
||||||
const char* seg;
|
const char* seg;
|
||||||
|
|
||||||
|
if (gSaveContext.language == LANGUAGE_GER)
|
||||||
if (gSaveContext.language == LANGUAGE_ENG) {
|
messageTableEntry = sGerMessageEntryTablePtr;
|
||||||
seg = messageTableEntry->segment;
|
else if (gSaveContext.language == LANGUAGE_FRA)
|
||||||
|
messageTableEntry = sFraMessageEntryTablePtr;
|
||||||
|
|
||||||
while (messageTableEntry->textId != 0xFFFF) {
|
// If PAL languages are not present in the OTR file, default to English
|
||||||
font = &globalCtx->msgCtx.font;
|
if (messageTableEntry == NULL)
|
||||||
|
messageTableEntry = sNesMessageEntryTablePtr;
|
||||||
|
|
||||||
if (messageTableEntry->textId == textId) {
|
seg = messageTableEntry->segment;
|
||||||
foundSeg = messageTableEntry->segment;
|
|
||||||
font->charTexBuf[0] = messageTableEntry->typePos;
|
while (messageTableEntry->textId != 0xFFFF) {
|
||||||
//messageTableEntry++;
|
font = &globalCtx->msgCtx.font;
|
||||||
nextSeg = messageTableEntry->segment;
|
|
||||||
font->msgOffset = messageTableEntry->segment;
|
if (messageTableEntry->textId == textId) {
|
||||||
font->msgLength = messageTableEntry->msgSize;
|
foundSeg = messageTableEntry->segment;
|
||||||
// "Message found!!!"
|
font->charTexBuf[0] = messageTableEntry->typePos;
|
||||||
osSyncPrintf(" メッセージが,見つかった!!! = %x "
|
|
||||||
"(data=%x) (data0=%x) (data1=%x) (data2=%x) (data3=%x)\n",
|
nextSeg = messageTableEntry->segment;
|
||||||
textId, font->msgOffset, font->msgLength, foundSeg, seg, nextSeg);
|
font->msgOffset = messageTableEntry->segment;
|
||||||
return;
|
font->msgLength = messageTableEntry->msgSize;
|
||||||
}
|
|
||||||
messageTableEntry++;
|
// "Message found!!!"
|
||||||
}
|
osSyncPrintf(" メッセージが,見つかった!!! = %x "
|
||||||
} else {
|
"(data=%x) (data0=%x) (data1=%x) (data2=%x) (data3=%x)\n",
|
||||||
//languageSegmentTable = (gSaveContext.language == LANGUAGE_GER) ? sGerMessageEntryTablePtr : sFraMessageEntryTablePtr; // OTRTODO
|
textId, font->msgOffset, font->msgLength, foundSeg, seg, nextSeg);
|
||||||
seg = messageTableEntry->segment;
|
return;
|
||||||
|
|
||||||
while (messageTableEntry->textId != 0xFFFF) {
|
|
||||||
font = &globalCtx->msgCtx.font;
|
|
||||||
|
|
||||||
if (messageTableEntry->textId == textId) {
|
|
||||||
foundSeg = *languageSegmentTable;
|
|
||||||
font->charTexBuf[0] = messageTableEntry->typePos;
|
|
||||||
languageSegmentTable++;
|
|
||||||
nextSeg = *languageSegmentTable;
|
|
||||||
font->msgOffset = foundSeg - seg;
|
|
||||||
font->msgLength = nextSeg - foundSeg;
|
|
||||||
// "Message found!!!"
|
|
||||||
osSyncPrintf(" メッセージが,見つかった!!! = %x "
|
|
||||||
"(data=%x) (data0=%x) (data1=%x) (data2=%x) (data3=%x)\n",
|
|
||||||
textId, font->msgOffset, font->msgLength, foundSeg, seg, nextSeg);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
messageTableEntry++;
|
|
||||||
languageSegmentTable++;
|
|
||||||
}
|
}
|
||||||
|
messageTableEntry++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// "Message not found!!!"
|
// "Message not found!!!"
|
||||||
osSyncPrintf(" メッセージが,見つからなかった!!! = %x\n", textId);
|
osSyncPrintf(" メッセージが,見つからなかった!!! = %x\n", textId);
|
||||||
font = &globalCtx->msgCtx.font;
|
font = &globalCtx->msgCtx.font;
|
||||||
messageTableEntry = sNesMessageEntryTablePtr;
|
messageTableEntry = sNesMessageEntryTablePtr;
|
||||||
|
|
||||||
if (gSaveContext.language == LANGUAGE_ENG) {
|
foundSeg = messageTableEntry->segment;
|
||||||
foundSeg = messageTableEntry->segment;
|
font->charTexBuf[0] = messageTableEntry->typePos;
|
||||||
font->charTexBuf[0] = messageTableEntry->typePos;
|
messageTableEntry++;
|
||||||
messageTableEntry++;
|
nextSeg = messageTableEntry->segment;
|
||||||
nextSeg = messageTableEntry->segment;
|
|
||||||
} else {
|
|
||||||
//languageSegmentTable = (gSaveContext.language == LANGUAGE_GER) ? sGerMessageEntryTablePtr : sFraMessageEntryTablePtr; // OTRTODO
|
|
||||||
foundSeg = *languageSegmentTable;
|
|
||||||
font->charTexBuf[0] = messageTableEntry->typePos;
|
|
||||||
languageSegmentTable++;
|
|
||||||
nextSeg = *languageSegmentTable;
|
|
||||||
}
|
|
||||||
font->msgOffset = foundSeg - seg;
|
font->msgOffset = foundSeg - seg;
|
||||||
font->msgLength = nextSeg - foundSeg;
|
font->msgLength = nextSeg - foundSeg;
|
||||||
}
|
}
|
||||||
@ -391,7 +338,6 @@ void Message_FindCreditsMessage(GlobalContext* globalCtx, u16 textId) {
|
|||||||
if (messageTableEntry->textId == textId) {
|
if (messageTableEntry->textId == textId) {
|
||||||
foundSeg = messageTableEntry->segment;
|
foundSeg = messageTableEntry->segment;
|
||||||
font->charTexBuf[0] = messageTableEntry->typePos;
|
font->charTexBuf[0] = messageTableEntry->typePos;
|
||||||
//messageTableEntry++;
|
|
||||||
nextSeg = messageTableEntry->segment;
|
nextSeg = messageTableEntry->segment;
|
||||||
font->msgOffset = messageTableEntry->segment;
|
font->msgOffset = messageTableEntry->segment;
|
||||||
font->msgLength = messageTableEntry->msgSize;
|
font->msgLength = messageTableEntry->msgSize;
|
||||||
@ -1145,7 +1091,7 @@ void Message_DrawText(GlobalContext* globalCtx, Gfx** gfxP) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (msgCtx->textDelayTimer == 0) {
|
if (msgCtx->textDelayTimer == 0) {
|
||||||
msgCtx->textDrawPos = i + 1;
|
msgCtx->textDrawPos = i + CVar_GetS32("gTextSpeed", 1);
|
||||||
msgCtx->textDelayTimer = msgCtx->textDelay;
|
msgCtx->textDelayTimer = msgCtx->textDelay;
|
||||||
} else {
|
} else {
|
||||||
msgCtx->textDelayTimer--;
|
msgCtx->textDelayTimer--;
|
||||||
@ -1640,26 +1586,10 @@ void Message_OpenText(GlobalContext* globalCtx, u16 textId) {
|
|||||||
//DmaMgr_SendRequest1(font->msgBuf, (uintptr_t)(_staff_message_data_staticSegmentRomStart + 4 + font->msgOffset),
|
//DmaMgr_SendRequest1(font->msgBuf, (uintptr_t)(_staff_message_data_staticSegmentRomStart + 4 + font->msgOffset),
|
||||||
//font->msgLength, "../z_message_PAL.c", 1954);
|
//font->msgLength, "../z_message_PAL.c", 1954);
|
||||||
} else {
|
} else {
|
||||||
if (gSaveContext.language == LANGUAGE_ENG)
|
Message_FindMessage(globalCtx, textId);
|
||||||
{
|
msgCtx->msgLength = font->msgLength;
|
||||||
Message_FindMessage(globalCtx, textId);
|
char* src = (uintptr_t)font->msgOffset;
|
||||||
msgCtx->msgLength = font->msgLength;
|
memcpy(font->msgBuf, src, font->msgLength);
|
||||||
char* src = (uintptr_t)font->msgOffset;
|
|
||||||
memcpy(font->msgBuf, src, font->msgLength);
|
|
||||||
} else if (gSaveContext.language == LANGUAGE_GER) {
|
|
||||||
// OTRTODO
|
|
||||||
//Message_FindMessage(globalCtx, textId);
|
|
||||||
//msgCtx->msgLength = font->msgLength;
|
|
||||||
//DmaMgr_SendRequest1(font->msgBuf, (uintptr_t)(_ger_message_data_staticSegmentRomStart + font->msgOffset),
|
|
||||||
//font->msgLength, "../z_message_PAL.c", 1978);
|
|
||||||
} else
|
|
||||||
{
|
|
||||||
// OTRTODO
|
|
||||||
//Message_FindMessage(globalCtx, textId);
|
|
||||||
//msgCtx->msgLength = font->msgLength;
|
|
||||||
//DmaMgr_SendRequest1(font->msgBuf, (uintptr_t)(_fra_message_data_staticSegmentRomStart + font->msgOffset),
|
|
||||||
//font->msgLength, "../z_message_PAL.c", 1990);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
msgCtx->textBoxProperties = font->charTexBuf[0];
|
msgCtx->textBoxProperties = font->charTexBuf[0];
|
||||||
|
Loading…
Reference in New Issue
Block a user