Turned the Owl Text Inversion into a toggle

Instead of replacing the Kokiri Owl Text at boot, a new Text Entry is added for it
This commit is contained in:
earthcrafterman 2022-05-15 21:07:34 -04:00
commit 972a560bba
4 changed files with 41 additions and 28 deletions

View file

@ -679,6 +679,8 @@ namespace SohImGui {
Tooltip("Allows equiping the tunic and boots to c-buttons"); Tooltip("Allows equiping the tunic and boots to c-buttons");
EnhancementCheckbox("MM Bunny Hood", "gMMBunnyHood"); EnhancementCheckbox("MM Bunny Hood", "gMMBunnyHood");
Tooltip("Wearing the Bunny Hood grants a speed increase like in Majora's Mask"); Tooltip("Wearing the Bunny Hood grants a speed increase like in Majora's Mask");
EnhancementCheckbox("Better Owl", "gBetterOwl");
Tooltip("The default response to Kaepora Gaebora is always that you understood what he said");
ImGui::EndMenu(); ImGui::EndMenu();
} }

View file

@ -11,6 +11,7 @@ extern "C" MessageTableEntry* sNesMessageEntryTablePtr;
extern "C" MessageTableEntry* sGerMessageEntryTablePtr; extern "C" MessageTableEntry* sGerMessageEntryTablePtr;
extern "C" MessageTableEntry* sFraMessageEntryTablePtr; extern "C" MessageTableEntry* sFraMessageEntryTablePtr;
extern "C" MessageTableEntry* sStaffMessageEntryTablePtr; extern "C" MessageTableEntry* sStaffMessageEntryTablePtr;
extern "C" const u16 sKaeporaPatchIndex = 0x71B3;
//extern "C" MessageTableEntry* _message_0xFFFC_nes; //extern "C" MessageTableEntry* _message_0xFFFC_nes;
MessageTableEntry* OTRMessage_LoadTable(const char* filePath, bool isNES) { MessageTableEntry* OTRMessage_LoadTable(const char* filePath, bool isNES) {
@ -19,13 +20,12 @@ MessageTableEntry* OTRMessage_LoadTable(const char* filePath, bool isNES) {
if (file == nullptr) if (file == nullptr)
return nullptr; return nullptr;
MessageTableEntry* table = (MessageTableEntry*)malloc(sizeof(MessageTableEntry) * file->messages.size()); MessageTableEntry* table = (MessageTableEntry*)malloc(sizeof(MessageTableEntry) * (file->messages.size() + 1));
char* kaeporaPatch;
for (int i = 0; i < file->messages.size(); i++) { for (int i = 0; i < file->messages.size(); i++) {
if (file->messages[i].id == 0x2066) { if (file->messages[i].id == 0x2066) {
kaeporaPatch = (char*)malloc(sizeof(char) * file->messages[i].msg.size()); char* kaeporaPatch = (char*)malloc(sizeof(char) * file->messages[i].msg.size());
kaeporaPatch = (char*)file->messages[i].msg.c_str(); file->messages[i].msg.copy(kaeporaPatch, file->messages[i].msg.size(), 0);
kaeporaPatch[26] = 'Y'; kaeporaPatch[26] = 'Y';
kaeporaPatch[27] = 'e'; kaeporaPatch[27] = 'e';
@ -33,21 +33,17 @@ MessageTableEntry* OTRMessage_LoadTable(const char* filePath, bool isNES) {
kaeporaPatch[29] = 1; kaeporaPatch[29] = 1;
kaeporaPatch[30] = 'N'; kaeporaPatch[30] = 'N';
kaeporaPatch[31] = 'o'; kaeporaPatch[31] = 'o';
break;
}
}
for (int i = 0; i < file->messages.size(); i++) { table[file->messages.size()].textId = sKaeporaPatchIndex;
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].textId = file->messages[i].id;
table[i].typePos = (file->messages[i].textboxType << 4) | file->messages[i].textboxYPos; 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(); table[i].msgSize = file->messages[i].msg.size();
if (kaeporaPatch != "" && (file->messages[i].id == 0x2066 || file->messages[i].id == 0x607B ||
file->messages[i].id == 0x10C2 || file->messages[i].id == 0x10C6 || file->messages[i].id == 0x206A)) {
table[i].segment = kaeporaPatch;
} else {
table[i].segment = file->messages[i].msg.c_str();
}
if (isNES && file->messages[i].id == 0xFFFC) if (isNES && file->messages[i].id == 0xFFFC)
_message_0xFFFC_nes = (char*)file->messages[i].msg.c_str(); _message_0xFFFC_nes = (char*)file->messages[i].msg.c_str();

View file

@ -36,6 +36,7 @@ MessageTableEntry* sNesMessageEntryTablePtr;
MessageTableEntry* sGerMessageEntryTablePtr; MessageTableEntry* sGerMessageEntryTablePtr;
MessageTableEntry* sFraMessageEntryTablePtr; MessageTableEntry* sFraMessageEntryTablePtr;
MessageTableEntry* sStaffMessageEntryTablePtr; MessageTableEntry* sStaffMessageEntryTablePtr;
const u16 sKaeporaPatchIndex;
char* _message_0xFFFC_nes; char* _message_0xFFFC_nes;
@ -272,6 +273,12 @@ void Message_FindMessage(GlobalContext* globalCtx, u16 textId) {
const char** languageSegmentTable; const char** languageSegmentTable;
Font* font; Font* font;
const char* seg; const char* seg;
u16 bufferId = textId;
if (CVar_GetS32("gBetterOwl", 0) != 0 && (bufferId == 0x2066 || bufferId == 0x607B ||
bufferId == 0x10C2 || bufferId == 0x10C6 || bufferId == 0x206A))
{
bufferId = sKaeporaPatchIndex;
}
if (gSaveContext.language == LANGUAGE_GER) if (gSaveContext.language == LANGUAGE_GER)
messageTableEntry = sGerMessageEntryTablePtr; messageTableEntry = sGerMessageEntryTablePtr;
@ -287,7 +294,7 @@ void Message_FindMessage(GlobalContext* globalCtx, u16 textId) {
while (messageTableEntry->textId != 0xFFFF) { while (messageTableEntry->textId != 0xFFFF) {
font = &globalCtx->msgCtx.font; font = &globalCtx->msgCtx.font;
if (messageTableEntry->textId == textId) { if (messageTableEntry->textId == bufferId) {
foundSeg = messageTableEntry->segment; foundSeg = messageTableEntry->segment;
font->charTexBuf[0] = messageTableEntry->typePos; font->charTexBuf[0] = messageTableEntry->typePos;
@ -298,14 +305,14 @@ void Message_FindMessage(GlobalContext* globalCtx, u16 textId) {
// "Message found!!!" // "Message found!!!"
osSyncPrintf(" メッセージが,見つかった!!! = %x " osSyncPrintf(" メッセージが,見つかった!!! = %x "
"(data=%x) (data0=%x) (data1=%x) (data2=%x) (data3=%x)\n", "(data=%x) (data0=%x) (data1=%x) (data2=%x) (data3=%x)\n",
textId, font->msgOffset, font->msgLength, foundSeg, seg, nextSeg); bufferId, font->msgOffset, font->msgLength, foundSeg, seg, nextSeg);
return; return;
} }
messageTableEntry++; messageTableEntry++;
} }
// "Message not found!!!" // "Message not found!!!"
osSyncPrintf(" メッセージが,見つからなかった!!! = %x\n", textId); osSyncPrintf(" メッセージが,見つからなかった!!! = %x\n", bufferId);
font = &globalCtx->msgCtx.font; font = &globalCtx->msgCtx.font;
messageTableEntry = sNesMessageEntryTablePtr; messageTableEntry = sNesMessageEntryTablePtr;

View file

@ -61,8 +61,8 @@ typedef enum {
} EnOwlType; } EnOwlType;
typedef enum { typedef enum {
/* 0x00 */ OWL_OK, /* 0x00 */ OWL_REPEAT,
/* 0x01 */ OWL_REPEAT /* 0x01 */ OWL_OK
} EnOwlMessageChoice; } EnOwlMessageChoice;
const ActorInit En_Owl_InitVars = { const ActorInit En_Owl_InitVars = {
@ -366,7 +366,8 @@ void func_80ACA7E0(EnOwl* this, GlobalContext* globalCtx) {
void EnOwl_ConfirmKokiriMessage(EnOwl* this, GlobalContext* globalCtx) { void EnOwl_ConfirmKokiriMessage(EnOwl* this, GlobalContext* globalCtx) {
if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_CHOICE && Message_ShouldAdvance(globalCtx)) { if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_CHOICE && Message_ShouldAdvance(globalCtx)) {
switch (globalCtx->msgCtx.choiceIndex) { uint8_t index = CVar_GetS32("gBetterOwl", 0) == 0 ? globalCtx->msgCtx.choiceIndex : (1 - globalCtx->msgCtx.choiceIndex);
switch (index) {
case OWL_REPEAT: case OWL_REPEAT:
Message_ContinueTextbox(globalCtx, 0x2065); Message_ContinueTextbox(globalCtx, 0x2065);
break; break;
@ -393,7 +394,8 @@ void EnOwl_WaitOutsideKokiri(EnOwl* this, GlobalContext* globalCtx) {
void func_80ACA998(EnOwl* this, GlobalContext* globalCtx) { void func_80ACA998(EnOwl* this, GlobalContext* globalCtx) {
if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_CHOICE && Message_ShouldAdvance(globalCtx)) { if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_CHOICE && Message_ShouldAdvance(globalCtx)) {
switch (globalCtx->msgCtx.choiceIndex) { uint8_t index = CVar_GetS32("gBetterOwl", 0) == 0 ? globalCtx->msgCtx.choiceIndex : (1 - globalCtx->msgCtx.choiceIndex);
switch (index) {
case OWL_REPEAT: case OWL_REPEAT:
Message_ContinueTextbox(globalCtx, 0x2069); Message_ContinueTextbox(globalCtx, 0x2069);
this->actionFunc = func_80ACAA54; this->actionFunc = func_80ACAA54;
@ -437,7 +439,8 @@ void EnOwl_WaitHyruleCastle(EnOwl* this, GlobalContext* globalCtx) {
void func_80ACAB88(EnOwl* this, GlobalContext* globalCtx) { void func_80ACAB88(EnOwl* this, GlobalContext* globalCtx) {
if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_CHOICE && Message_ShouldAdvance(globalCtx)) { if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_CHOICE && Message_ShouldAdvance(globalCtx)) {
switch (globalCtx->msgCtx.choiceIndex) { uint8_t index = CVar_GetS32("gBetterOwl", 0) == 0 ? globalCtx->msgCtx.choiceIndex : (1 - globalCtx->msgCtx.choiceIndex);
switch (index) {
case OWL_REPEAT: case OWL_REPEAT:
// obtained zelda's letter // obtained zelda's letter
if (gSaveContext.eventChkInf[4] & 1) { if (gSaveContext.eventChkInf[4] & 1) {
@ -478,7 +481,8 @@ void EnOwl_WaitKakariko(EnOwl* this, GlobalContext* globalCtx) {
void func_80ACAD34(EnOwl* this, GlobalContext* globalCtx) { void func_80ACAD34(EnOwl* this, GlobalContext* globalCtx) {
if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_CHOICE && Message_ShouldAdvance(globalCtx)) { if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_CHOICE && Message_ShouldAdvance(globalCtx)) {
switch (globalCtx->msgCtx.choiceIndex) { uint8_t index = CVar_GetS32("gBetterOwl", 0) == 0 ? globalCtx->msgCtx.choiceIndex : (1 - globalCtx->msgCtx.choiceIndex);
switch (index) {
case OWL_REPEAT: case OWL_REPEAT:
Message_ContinueTextbox(globalCtx, 0x206F); Message_ContinueTextbox(globalCtx, 0x206F);
this->actionFunc = func_80ACADF0; this->actionFunc = func_80ACADF0;
@ -514,7 +518,8 @@ void EnOwl_WaitGerudo(EnOwl* this, GlobalContext* globalCtx) {
void func_80ACAEB8(EnOwl* this, GlobalContext* globalCtx) { void func_80ACAEB8(EnOwl* this, GlobalContext* globalCtx) {
if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_CHOICE && Message_ShouldAdvance(globalCtx)) { if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_CHOICE && Message_ShouldAdvance(globalCtx)) {
switch (globalCtx->msgCtx.choiceIndex) { uint8_t index = CVar_GetS32("gBetterOwl", 0) == 0 ? globalCtx->msgCtx.choiceIndex : (1 - globalCtx->msgCtx.choiceIndex);
switch (index) {
case OWL_REPEAT: case OWL_REPEAT:
Message_ContinueTextbox(globalCtx, 0x2071); Message_ContinueTextbox(globalCtx, 0x2071);
this->actionFunc = func_80ACAF74; this->actionFunc = func_80ACAF74;
@ -634,7 +639,8 @@ void EnOwl_WaitDeathMountainShortcut(EnOwl* this, GlobalContext* globalCtx) {
void func_80ACB344(EnOwl* this, GlobalContext* globalCtx) { void func_80ACB344(EnOwl* this, GlobalContext* globalCtx) {
if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_CHOICE && Message_ShouldAdvance(globalCtx)) { if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_CHOICE && Message_ShouldAdvance(globalCtx)) {
switch (globalCtx->msgCtx.choiceIndex) { uint8_t index = CVar_GetS32("gBetterOwl", 0) == 0 ? globalCtx->msgCtx.choiceIndex : (1 - globalCtx->msgCtx.choiceIndex);
switch (index) {
case OWL_REPEAT: case OWL_REPEAT:
Message_ContinueTextbox(globalCtx, 0x607A); Message_ContinueTextbox(globalCtx, 0x607A);
break; break;
@ -657,7 +663,8 @@ void func_80ACB3E0(EnOwl* this, GlobalContext* globalCtx) {
void func_80ACB440(EnOwl* this, GlobalContext* globalCtx) { void func_80ACB440(EnOwl* this, GlobalContext* globalCtx) {
if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_CHOICE && Message_ShouldAdvance(globalCtx)) { if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_CHOICE && Message_ShouldAdvance(globalCtx)) {
switch (globalCtx->msgCtx.choiceIndex) { uint8_t index = CVar_GetS32("gBetterOwl", 0) == 0 ? globalCtx->msgCtx.choiceIndex : (1 - globalCtx->msgCtx.choiceIndex);
switch (index) {
case OWL_REPEAT: case OWL_REPEAT:
Message_ContinueTextbox(globalCtx, 0x10C1); Message_ContinueTextbox(globalCtx, 0x10C1);
this->actionFunc = func_80ACB4FC; this->actionFunc = func_80ACB4FC;
@ -692,7 +699,8 @@ void EnOwl_WaitLWPreSaria(EnOwl* this, GlobalContext* globalCtx) {
void func_80ACB5C4(EnOwl* this, GlobalContext* globalCtx) { void func_80ACB5C4(EnOwl* this, GlobalContext* globalCtx) {
if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_CHOICE && Message_ShouldAdvance(globalCtx)) { if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_CHOICE && Message_ShouldAdvance(globalCtx)) {
switch (globalCtx->msgCtx.choiceIndex) { uint8_t index = CVar_GetS32("gBetterOwl", 0) == 0 ? globalCtx->msgCtx.choiceIndex : (1 - globalCtx->msgCtx.choiceIndex);
switch (index) {
case OWL_REPEAT: case OWL_REPEAT:
Message_ContinueTextbox(globalCtx, 0x10C5); Message_ContinueTextbox(globalCtx, 0x10C5);
this->actionFunc = func_80ACB680; this->actionFunc = func_80ACB680;