From c220e400436703c71adf2b49a04a863b72c41d29 Mon Sep 17 00:00:00 2001 From: Treeki Date: Sun, 17 Nov 2013 20:42:06 +0100 Subject: broken translations and shit, possibly final commit before public release --- bugfixes.yaml | 6 ++++++ include/common.h | 9 ++++++++- include/game.h | 11 +++++++++++ kamek_pal.x | 3 +++ src/koopatlas/core.cpp | 41 +++++++++++++++-------------------------- src/koopatlas/hud.cpp | 18 ++++-------------- src/koopatlas/shop.cpp | 20 +++----------------- src/koopatlas/starcoin.cpp | 12 +++++++----- src/levelinfo.cpp | 6 ------ src/levelinfo.h | 6 +----- src/msgbox.cpp | 35 ++++++----------------------------- src/msgbox.h | 16 +--------------- src/newer.cpp | 22 ++++++++++++++++++++++ src/pregame.cpp | 13 +++---------- src/randomcrap.S | 13 +++++++++++++ 15 files changed, 103 insertions(+), 128 deletions(-) diff --git a/bugfixes.yaml b/bugfixes.yaml index d74ecc9..bc0c130 100644 --- a/bugfixes.yaml +++ b/bugfixes.yaml @@ -372,3 +372,9 @@ hooks: type: patch addr_pal: 0x809EC5B4 data: '38600001' + + - name: JrFloorFireHax + type: branch_insn + branch_type: bl + src_addr_pal: 0x80816370 + target_func: 'JrFloorFireHax' diff --git a/include/common.h b/include/common.h index b002dca..9e90dbc 100644 --- a/include/common.h +++ b/include/common.h @@ -165,5 +165,12 @@ namespace nw4r { namespace db { void Exception_Printf_(const char *msg, ...); }} - +typedef struct { + char gpr; + char fpr; + char reserved[2]; + char *input_arg_area; + char *reg_save_area; +} __va_list[1]; +typedef __va_list va_list; #endif diff --git a/include/game.h b/include/game.h index c0477b7..5adbe0f 100755 --- a/include/game.h +++ b/include/game.h @@ -815,6 +815,8 @@ namespace lyt { Vec2 GetVtxPos() const; + u16 GetExtUserDataNum() const; // 802AC5A0 + ut::LinkListNode parentLink; Pane *parent; @@ -3761,6 +3763,15 @@ class MessageClass { dScript::Res_c *GetBMG(); // 800CDD50 void WriteBMGToTextBox(nw4r::lyt::TextBox *textBox, dScript::Res_c *res, int category, int message, int argCount, ...); // 0x800C9B50 +// My version ignores the Font and Font Scale fields in BMG +void Newer_WriteBMGToTextBox_VAList(nw4r::lyt::TextBox *textBox, dScript::Res_c *res, int category, int message, int argCount, va_list *args); +void Newer_WriteBMGToTextBox(nw4r::lyt::TextBox *textBox, dScript::Res_c *res, int category, int message, int argCount, ...); + +// support functions needed for it +void CheckForUSD1ShadowEntry(nw4r::lyt::TextBox *textBox); // 800C9BF0 +void WriteParsedStringToTextBox(nw4r::lyt::TextBox *textBox, const wchar_t *str, int vaCount, va_list *args, dScript::Res_c *res); + + extern "C" dAc_Py_c* GetSpecificPlayerActor(int number); extern "C" dStageActor_c *CreateActor(u16 classID, int settings, Vec pos, char rot, char layer); extern "C" dStageActor_c *Actor_SearchByID(u32 actorID); diff --git a/kamek_pal.x b/kamek_pal.x index 11b7bf1..3cd6e64 100644 --- a/kamek_pal.x +++ b/kamek_pal.x @@ -167,6 +167,9 @@ SECTIONS { GetBMG__Fv = 0x800CDD50; findStringForMessageID__Q23EGG6MsgResCFii = 0x802D7B50; WriteBMGToTextBox__FPQ34nw4r3lyt7TextBoxPQ27dScript5Res_ciiie = 0x800C9B50; + "WriteParsedStringToTextBox__FPQ34nw4r3lyt7TextBoxPCwiPA1_22@class$418fasthack_cppPQ27dScript5Res_c" = 0x800C9F70; + CheckForUSD1ShadowEntry__FPQ34nw4r3lyt7TextBox = 0x800C9BF0; + GetExtUserDataNum__Q34nw4r3lyt4PaneCFv = 0x802AC5A0; m2d__Anm_c__Load = 0x801644F0; m2d__AnmResHandler_c__Load = 0x80163FA0; diff --git a/src/koopatlas/core.cpp b/src/koopatlas/core.cpp index 40776c8..8712da7 100644 --- a/src/koopatlas/core.cpp +++ b/src/koopatlas/core.cpp @@ -518,6 +518,7 @@ void dScKoopatlas_c::endState_ContinueWait() { void dScKoopatlas_c::executeState_Normal() { + // ghb if (pathManager.completionMessagePending) { OSReport("Going to set CompletionMsg\n"); state.setState(&StateID_CompletionMsg); @@ -1081,37 +1082,21 @@ void dScKoopatlas_c::showSaveWindow() { yesNoWindow->visible = true; } -static const wchar_t *completionMsgs[] = { - L"The most erudite of Buttocks", - L"You've collected all of\nthe \x0B\x014F\xBEEF Star Coins in\n", - L"You have gotten every \x0B\x013B\xBEEF exit\nin", - L"You have gotten everything\nin", - L"You have collected all the\nnecessary \x0B\x014F\xBEEF coins to enter\nthe Special World!", - L"You have collected all the \x0B\x014F\xBEEF Star\nCoins in the game!", - L"You've found every \x0B\x013B\xBEEF exit in the\ngame!", - L"You've completed everything in\nNEWER SUPER MARIO BROS. Wii!\n\nWe present you a new quest.\nTry pressing \x0B\x0122\xBEEF, \x0B\x0123\xBEEF and \x0B\x0125\xBEEF\n on the Star Coin menu." -}; - void dScKoopatlas_c::beginState_CompletionMsg() { + if (pathManager.completionMessageType == 0) + pathManager.completionMessageType = 1; OSReport("CompletionMsg beginning with type %d\n", pathManager.completionMessageType); - static const int ynTypes[8] = { - /*NULL*/ -1, - /*COINS*/ 14, - /*EXITS*/ 7, - /*WORLD*/ 8, - /*COINS EXC W9*/ 9, - /*GLOBAL COINS*/ 11, - /*GLOBAL EXITS*/ 27, - /*EVERYTHING*/ 21 - }; - yesNoWindow->type = ynTypes[pathManager.completionMessageType]; + yesNoWindow->type = 21; yesNoWindow->visible = true; mustFixYesNoText = 10; // hacky shit } void dScKoopatlas_c::endState_CompletionMsg() { + // ghb pathManager.completionMessagePending = false; pathManager.completionMessageType = 0; + //pathManager.completionMessagePending = true; + //pathManager.completionMessageType ++; } void dScKoopatlas_c::executeState_CompletionMsg() { @@ -1121,16 +1106,20 @@ void dScKoopatlas_c::executeState_CompletionMsg() { int type = pathManager.completionMessageType; - const wchar_t *baseText = completionMsgs[type]; + dScript::Res_c *bmg = GetBMG(); + + const wchar_t *baseText = bmg->findStringForMessageID(9000, type); + // Used when we assemble a dynamic message wchar_t text[512]; if (type >= CMP_MSG_COINS && type <= CMP_MSG_WORLD) { // title int w = pathManager.completionMessageWorldNum; + // ghb + //w = 1; int l = ((w == 5) || (w == 7)) ? 101 : 100; - dLevelInfo_c::entry_s *titleEntry = dLevelInfo_c::s_info.searchByDisplayNum(w, l); - const char *title = dLevelInfo_c::s_info.getNameForLevel(titleEntry); + const wchar_t *title = bmg->findStringForMessageID(8000+w, l); // assemble the string @@ -1140,7 +1129,7 @@ void dScKoopatlas_c::executeState_CompletionMsg() { text[pos++] = ' '; while (*title) { - char chr = *(title++); + wchar_t chr = *(title++); if (chr != '-') text[pos++] = chr; } diff --git a/src/koopatlas/hud.cpp b/src/koopatlas/hud.cpp index dceddb8..50899a7 100644 --- a/src/koopatlas/hud.cpp +++ b/src/koopatlas/hud.cpp @@ -227,19 +227,9 @@ void dWMHud_c::loadHeaderInfo() { } // LEVEL NAME - wchar_t convertedLevelName[100]; - const char *sourceLevelName = levelInfo->getNameForLevel(infEntry); - int charCount = 0; - - while (*sourceLevelName != 0 && charCount < 99) { - convertedLevelName[charCount] = *sourceLevelName; - sourceLevelName++; - charCount++; - } - convertedLevelName[charCount] = 0; - - LevelName->SetString(convertedLevelName); - LevelNameS->SetString(convertedLevelName); + dScript::Res_c *bmg = GetBMG(); + Newer_WriteBMGToTextBox(LevelName, bmg, 8000+infEntry->worldSlot+1, infEntry->levelSlot+1, 0); + Newer_WriteBMGToTextBox(LevelNameS, bmg, 8000+infEntry->worldSlot+1, infEntry->levelSlot+1, 0); // a hack because I don't feel like editing the rlyt LevelName->size.x = LevelNameS->size.x = 400.0f; @@ -326,7 +316,7 @@ void dWMHud_c::loadHeaderInfo() { if (LevelName->tagProc != 0) tw.tagProcessor = LevelName->tagProc; - float width = tw.CalcStringWidth(convertedLevelName, charCount); + float width = tw.CalcStringWidth(LevelName->stringBuf, LevelName->stringLength); float totalWidth = width + LevelName->trans.x - 20.0f; if (totalWidth < currentPos) totalWidth = currentPos; diff --git a/src/koopatlas/shop.cpp b/src/koopatlas/shop.cpp index 6f9566e..1ab6458 100644 --- a/src/koopatlas/shop.cpp +++ b/src/koopatlas/shop.cpp @@ -538,23 +538,9 @@ void dWMShop_c::loadInfo() { rightCol.colourise(save->hudHintH, save->hudHintS, save->hudHintL); // find out the shop name - dLevelInfo_c::entry_s *shopNameEntry = - dLevelInfo_c::s_info.searchBySlot(shopKind, 98); - - wchar_t shopName[100]; - // TODO: refactor this a bit - const char *sourceName = dLevelInfo_c::s_info.getNameForLevel(shopNameEntry); - int charCount = 0; - - while (*sourceName != 0 && charCount < 99) { - shopName[charCount] = *sourceName; - sourceName++; - charCount++; - } - shopName[charCount] = 0; - - Title->SetString(shopName); - TitleShadow->SetString(shopName); + dScript::Res_c *bmg = GetBMG(); + Newer_WriteBMGToTextBox(Title, bmg, 8000+shopKind+1, 99, 0); + Newer_WriteBMGToTextBox(TitleShadow, bmg, 8000+shopKind+1, 99, 0); // load the coin count int scCount = getUnspentStarCoinCount(); diff --git a/src/koopatlas/starcoin.cpp b/src/koopatlas/starcoin.cpp index 8cb819b..e81a347 100644 --- a/src/koopatlas/starcoin.cpp +++ b/src/koopatlas/starcoin.cpp @@ -239,6 +239,7 @@ void dWMStarCoin_c::loadInfo() { } void dWMStarCoin_c::loadSectionInfo() { + dScript::Res_c *bmg = GetBMG(); dLevelInfo_c::entry_s *visibleLevels[COLUMN_COUNT][ROW_COUNT]; // reset everything... everything @@ -262,9 +263,9 @@ void dWMStarCoin_c::loadSectionInfo() { SaveBlock *save = GetSaveFile()->GetBlock(-1); dLevelInfo_c *linfo = &dLevelInfo_c::s_info; - dLevelInfo_c::entry_s *names[COLUMN_COUNT]; + const wchar_t *names[COLUMN_COUNT]; for (int i = 0; i < COLUMN_COUNT; i++) - names[i] = linfo->searchByDisplayNum(currentSection, 100+i); + names[i] = bmg->findStringForMessageID(8000+currentSection, 100+i); bool useSubworlds = (COLUMN_COUNT > 1) && names[1]; @@ -321,9 +322,10 @@ void dWMStarCoin_c::loadSectionInfo() { names[1] = 0; // work out the names - WriteAsciiToTextBox(LeftTitle, linfo->getNameForLevel(names[0])); + LeftTitle->SetString(names[0]); + if (names[1]) - WriteAsciiToTextBox(RightTitle, linfo->getNameForLevel(names[1])); + RightTitle->SetString(names[1]); RightTitle->SetVisible(names[1] != 0); // load all level info @@ -351,7 +353,7 @@ void dWMStarCoin_c::loadSectionInfo() { } LevelName[col][row]->SetVisible(true); - WriteAsciiToTextBox(LevelName[col][row], linfo->getNameForLevel(level)); + Newer_WriteBMGToTextBox(LevelName[col][row], bmg, 8000+level->worldSlot+1, level->levelSlot+1, 0); } } diff --git a/src/levelinfo.cpp b/src/levelinfo.cpp index 1b71e70..59bca37 100644 --- a/src/levelinfo.cpp +++ b/src/levelinfo.cpp @@ -33,12 +33,6 @@ void dLevelInfo_c::load(void *buffer) { if (level->levelSlot < 42) SetSomeConditionShit(level->worldSlot, level->levelSlot, level->flags); - - char *name = (char*)getNameForLevel(level); - - for (int i = 0; i < level->nameLength+1; i++) { - name[i] -= 0xD0; - } } } } diff --git a/src/levelinfo.h b/src/levelinfo.h index d0eee1a..e8e4ea7 100644 --- a/src/levelinfo.h +++ b/src/levelinfo.h @@ -19,7 +19,7 @@ public: u8 nameLength; u8 reserved3; u16 flags; - u32 nameOffset; + u32 nameOffset; // NO LONGER USED }; struct section_s { @@ -44,10 +44,6 @@ public: return (section_s*)(((char*)data) + data->sectionOffsets[index]); } - const char *getNameForLevel(entry_s *entry) { - return (const char*)data + entry->nameOffset; - } - static dLevelInfo_c s_info; }; diff --git a/src/msgbox.cpp b/src/msgbox.cpp index 829fcb3..4f8a958 100644 --- a/src/msgbox.cpp +++ b/src/msgbox.cpp @@ -78,22 +78,10 @@ int dMsgBoxManager_c::onDelete() { MessageBoxIsShowing = false; if (canCancel && StageC4::instance) StageC4::instance->_1D = 0; // disable no-pause - msgDataLoader.unload(); return layout.free(); } -/*****************************************************************************/ -// Load Resources -CREATE_STATE_E(dMsgBoxManager_c, LoadRes); - -void dMsgBoxManager_c::executeState_LoadRes() { - if (msgDataLoader.load("/NewerRes/Messages.bin")) { - state.setState(&StateID_Wait); - } else { - } -} - /*****************************************************************************/ // Waiting CREATE_STATE_E(dMsgBoxManager_c, Wait); @@ -111,25 +99,14 @@ void dMsgBoxManager_c::showMessage(int id, bool canCancel, int delay) { } // get the data file - header_s *data = (header_s*)msgDataLoader.buffer; + dScript::Res_c *bmg = GetBMG(); - const wchar_t *title = 0, *msg = 0; - - for (int i = 0; i < data->count; i++) { - if (data->entry[i].id == id) { - title = (const wchar_t*)((u32)data + data->entry[i].titleOffset); - msg = (const wchar_t*)((u32)data + data->entry[i].msgOffset); - break; - } - } - - if (title == 0) { - OSReport("Message Box: Message %08x not found\n", id); - return; - } + nw4r::lyt::TextBox *tb = layout.findTextBoxByName("T_title"); + nw4r::lyt::TextBox *mb = layout.findTextBoxByName("T_msg"); + mb->alignment = (2*3) + 3; - layout.findTextBoxByName("T_title")->SetString(title); - layout.findTextBoxByName("T_msg")->SetString(msg); + Newer_WriteBMGToTextBox(tb, bmg, 110000 + (id >> 8), id & 0xFF, 0); + Newer_WriteBMGToTextBox(mb, bmg, 100000 + (id >> 8), id & 0xFF, 0); this->canCancel = canCancel; this->delay = delay; diff --git a/src/msgbox.h b/src/msgbox.h index 22ae812..f2d0e16 100644 --- a/src/msgbox.h +++ b/src/msgbox.h @@ -7,7 +7,7 @@ class dMsgBoxManager_c : public dStageActor_c { public: void showMessage(int id, bool canCancel=true, int delay=-1); - dMsgBoxManager_c() : state(this, &StateID_LoadRes) { } + dMsgBoxManager_c() : state(this, &StateID_Wait) { } int onCreate(); int onDelete(); @@ -20,7 +20,6 @@ class dMsgBoxManager_c : public dStageActor_c { int afterDraw(int) { return true; } m2d::EmbedLayout_c layout; - dDvdLoader_c msgDataLoader; bool layoutLoaded; bool visible; @@ -31,7 +30,6 @@ class dMsgBoxManager_c : public dStageActor_c { dStateWrapper_c state; USING_STATES(dMsgBoxManager_c); - DECLARE_STATE(LoadRes); DECLARE_STATE(Wait); DECLARE_STATE(BoxAppearWait); DECLARE_STATE(ShownWait); @@ -39,17 +37,5 @@ class dMsgBoxManager_c : public dStageActor_c { static dMsgBoxManager_c *instance; static dMsgBoxManager_c *build(); - - private: - struct entry_s { - u32 id; - u32 titleOffset; - u32 msgOffset; - }; - - struct header_s { - u32 count; - entry_s entry[1]; - }; }; #endif /* MSGBOX_H */ diff --git a/src/newer.cpp b/src/newer.cpp index f1da7fc..4183bf5 100644 --- a/src/newer.cpp +++ b/src/newer.cpp @@ -165,3 +165,25 @@ extern "C" GEIFS *GrabExitInfoForFileSelect(GEIFS *out, SaveBlock *save) { } +void Newer_WriteBMGToTextBox_VAList(nw4r::lyt::TextBox *textBox, dScript::Res_c *res, int category, int message, int argCount, va_list *args) { + GameMgrP->layoutShadowFlag = false; + if (textBox->GetExtUserDataNum()) + CheckForUSD1ShadowEntry(textBox); + + GameMgrP->msgCategory = category; + GameMgrP->msgID = message; + + const wchar_t *str = res->findStringForMessageID(category, message); + WriteParsedStringToTextBox(textBox, str, argCount, args, res); +} +void Newer_WriteBMGToTextBox(nw4r::lyt::TextBox *textBox, dScript::Res_c *res, int category, int message, int argCount, ...) { + va_list vl; + + // from CW PPC cstdarg + ((void)argCount, __builtin_va_info(&vl)); + + Newer_WriteBMGToTextBox_VAList(textBox, res, category, message, argCount, &vl); + + // CW PPC cstdarg defines this to (void)0 + //va_end(vl); +} diff --git a/src/pregame.cpp b/src/pregame.cpp index 6ac04de..df8839a 100644 --- a/src/pregame.cpp +++ b/src/pregame.cpp @@ -66,16 +66,9 @@ void LoadPregameStyleNameAndNumber(m2d::EmbedLayout_c *layout) { // work out the thing now dLevelInfo_c::entry_s *level = dLevelInfo_c::s_info.searchBySlot(CurrentWorld, CurrentLevel); if (level) { - wchar_t convLevelName[160]; - const char *srcLevelName = dLevelInfo_c::s_info.getNameForLevel(level); - int i = 0; - while (i < 159 && srcLevelName[i]) { - convLevelName[i] = srcLevelName[i]; - i++; - } - convLevelName[i] = 0; - LevelNameShadow->SetString(convLevelName); - LevelName->SetString(convLevelName); + dScript::Res_c *bmg = GetBMG(); + Newer_WriteBMGToTextBox(LevelName, bmg, 8000+level->worldSlot+1, level->levelSlot+1, 0); + Newer_WriteBMGToTextBox(LevelNameShadow, bmg, 8000+level->worldSlot+1, level->levelSlot+1, 0); wchar_t levelNumber[32]; wcscpy(levelNumber, L"World "); diff --git a/src/randomcrap.S b/src/randomcrap.S index 4b8d830..2a4efea 100644 --- a/src/randomcrap.S +++ b/src/randomcrap.S @@ -1,5 +1,18 @@ .text +.global JrFloorFireHax +JrFloorFireHax: + stw r0, 0x120(r30) + lwz r4, 4(r30) + clrrwi. r4, r4, 28 + beqlr + li r4, 0 + stw r4, 0x778(r30) + lis r4, 0x100 + stw r4, 0x774(r30) + stw r4, 0x77C(r30) + blr + .global TryAndFixScoreGlitch TryAndFixScoreGlitch: lwz r0, 0x4A10(r3) -- cgit v1.2.3