mirror of
https://github.com/HarbourMasters/Shipwright.git
synced 2024-08-13 17:03:47 -04:00
b5dc097587
Haven't removed where rando stores the hints for itself and the ganon and altar hints are still pulled from the randomizer class' local storage, but gossip stone hints are pulled from the custom message table now.
115 lines
5.3 KiB
C++
115 lines
5.3 KiB
C++
#include "OTRGlobals.h"
|
||
#include "ResourceMgr.h"
|
||
#include "Scene.h"
|
||
#include "Utils/StringHelper.h"
|
||
#include "global.h"
|
||
#include "vt.h"
|
||
#include <Text.h>
|
||
#include <soh/Enhancements/custom_message/CustomMessage.h>
|
||
|
||
extern "C" MessageTableEntry* sNesMessageEntryTablePtr;
|
||
extern "C" MessageTableEntry* sGerMessageEntryTablePtr;
|
||
extern "C" MessageTableEntry* sFraMessageEntryTablePtr;
|
||
extern "C" MessageTableEntry* sStaffMessageEntryTablePtr;
|
||
//extern "C" MessageTableEntry* _message_0xFFFC_nes;
|
||
|
||
const std::string customMessageTableID = "BaseGameOverrides";
|
||
|
||
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;
|
||
|
||
// Allocate room for an additional message
|
||
MessageTableEntry* table = (MessageTableEntry*)malloc(sizeof(MessageTableEntry) * (file->messages.size() + 1));
|
||
|
||
for (int i = 0; i < file->messages.size(); i++) {
|
||
// Look for Owl Text
|
||
if (file->messages[i].id == 0x2066) {
|
||
// Create a new message based on the Owl Text
|
||
char* kaeporaPatch = (char*)malloc(sizeof(char) * file->messages[i].msg.size());
|
||
file->messages[i].msg.copy(kaeporaPatch, file->messages[i].msg.size(), 0);
|
||
|
||
// Swap the order of yes and no in this new message
|
||
if (filePath == "text/nes_message_data_static/nes_message_data_static") {
|
||
kaeporaPatch[26] = 'Y';
|
||
kaeporaPatch[27] = 'e';
|
||
kaeporaPatch[28] = 's';
|
||
kaeporaPatch[29] = 1;
|
||
kaeporaPatch[30] = 'N';
|
||
kaeporaPatch[31] = 'o';
|
||
} else if (filePath == "text/ger_message_data_static/ger_message_data_static") {
|
||
kaeporaPatch[30] = 'J';
|
||
kaeporaPatch[31] = 'a';
|
||
kaeporaPatch[32] = '!';
|
||
kaeporaPatch[33] = 1;
|
||
kaeporaPatch[34] = 'N';
|
||
kaeporaPatch[35] = 'e';
|
||
kaeporaPatch[36] = 'i';
|
||
kaeporaPatch[37] = 'n';
|
||
} else {
|
||
kaeporaPatch[26] = 'O';
|
||
kaeporaPatch[27] = 'u';
|
||
kaeporaPatch[28] = 'i';
|
||
kaeporaPatch[29] = 1;
|
||
kaeporaPatch[30] = 'N';
|
||
kaeporaPatch[31] = 'o';
|
||
kaeporaPatch[32] = 'n';
|
||
}
|
||
|
||
// load data into message
|
||
table[file->messages.size()].textId = 0x71B3;
|
||
table[file->messages.size()].typePos = (file->messages[i].textboxType << 4) | file->messages[i].textboxYPos;
|
||
table[file->messages.size()].segment = kaeporaPatch;
|
||
table[file->messages.size()].msgSize = file->messages[i].msg.size();
|
||
}
|
||
|
||
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()
|
||
{
|
||
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);
|
||
sFraMessageEntryTablePtr = OTRMessage_LoadTable("text/fra_message_data_static/fra_message_data_static", false);
|
||
|
||
auto file2 = std::static_pointer_cast<Ship::Text>(OTRGlobals::Instance->context->GetResourceManager()->LoadResource("text/staff_message_data_static/staff_message_data_static"));
|
||
|
||
sStaffMessageEntryTablePtr = (MessageTableEntry*)malloc(sizeof(MessageTableEntry) * file2->messages.size());
|
||
|
||
for (int i = 0; i < file2->messages.size(); i++)
|
||
{
|
||
sStaffMessageEntryTablePtr[i].textId = file2->messages[i].id;
|
||
sStaffMessageEntryTablePtr[i].typePos = (file2->messages[i].textboxType << 4) | file2->messages[i].textboxYPos;
|
||
sStaffMessageEntryTablePtr[i].segment = file2->messages[i].msg.c_str();
|
||
sStaffMessageEntryTablePtr[i].msgSize = file2->messages[i].msg.size();
|
||
}
|
||
|
||
CustomMessage::Instance->AddCustomMessageTable(customMessageTableID);
|
||
CustomMessage::Instance->CreateGetItemMessage(
|
||
customMessageTableID, (GetItemID)0x00B4, ITEM_SKULL_TOKEN,
|
||
{
|
||
TEXTBOX_TYPE_BLUE, TEXTBOX_POS_BOTTOM,
|
||
"You got a %rGold Skulltula Token%w!&You've collected %r\x19%w tokens&in total!\x0E\x3C",
|
||
"Du erh<72>lst ein %rGoldene&Skulltula-Symbol%w! Du hast&insgesamt %r\x19%w symbol gesammelt!\x0E\x3C",
|
||
"Vous obtenez un %rSymbole de&Skulltula d'or%w! Vous avez&collect<63> %r\x19\%w symboles en tout!\x0E\x3C"
|
||
}
|
||
);
|
||
CustomMessage::Instance->CreateGetItemMessage(
|
||
customMessageTableID, (GetItemID)0x00B5, ITEM_SKULL_TOKEN,
|
||
{
|
||
TEXTBOX_TYPE_BLUE, TEXTBOX_POS_BOTTOM,
|
||
"You got a %rGold Skulltula Token%w!&You've collected %r\x19%w tokens&in total!",
|
||
"Du erh<72>lst ein %rGoldene&Skulltula-Symbol%w! Du hast&insgesamt %r\x19%w symbol gesammelt!",
|
||
"Vous obtenez un %rSymbole de&Skulltula d'or%w! Vous avez&collect<63> %r\x19\%w symboles en tout!" });
|
||
} |