diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 34aec6c54..f515b133c 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -40,6 +40,7 @@ const std::string Randomizer::hintMessageTableID = "RandomizerHints"; const std::string Randomizer::merchantMessageTableID = "RandomizerMerchants"; const std::string Randomizer::rupeeMessageTableID = "RandomizerRupees"; const std::string Randomizer::NaviRandoMessageTableID = "RandomizerNavi"; +const std::string Randomizer::IceTrapRandoMessageTableID = "RandomizerIceTrap"; static const char* englishRupeeNames[80] = { "Rupees", "Bitcoin", "Bananas", "Cornflakes", "Gummybears", "Floopies", "Dollars", @@ -4824,16 +4825,9 @@ void CreateGetItemMessages(std::vector messageEntries) { CustomMessageManager* customMessageManager = CustomMessageManager::Instance; customMessageManager->AddCustomMessageTable(Randomizer::getItemMessageTableID); for (GetItemMessage messageEntry : messageEntries) { - if (messageEntry.giid == RG_ICE_TRAP) { - customMessageManager->CreateMessage(Randomizer::getItemMessageTableID, messageEntry.giid, - { TEXTBOX_TYPE_BLUE, TEXTBOX_POS_BOTTOM, messageEntry.english, - messageEntry.german, messageEntry.french }); - } else { - customMessageManager->CreateGetItemMessage(Randomizer::getItemMessageTableID, messageEntry.giid, - messageEntry.iid, - { TEXTBOX_TYPE_BLUE, TEXTBOX_POS_BOTTOM, messageEntry.english, - messageEntry.german, messageEntry.french }); - } + customMessageManager->CreateGetItemMessage(Randomizer::getItemMessageTableID, messageEntry.giid, messageEntry.iid, + { TEXTBOX_TYPE_BLUE, TEXTBOX_POS_BOTTOM, messageEntry.english, + messageEntry.german, messageEntry.french }); } } @@ -4989,12 +4983,115 @@ void CreateNaviRandoMessages() { } } +CustomMessageMinimal IceTrapMessages[NUM_ICE_TRAP_MESSAGES] = { + { "You are a %bFOOL%w!", + "Du bist ein %bDUMMKOPF%w!", + "%bPauvre fou%w..." }, + + { "You are a %bFOWL%w!", + "Du bist eine %bFrostbeule%w!", + "Tu es un %bglaçon%w, Harry!" }, + + { "%bFOOL%w!", + "%bDUMMKOPF%w!", + "%bSot%w que tu es." }, + + { "You just got %bPUNKED%w!", + "Du wurdest %beiskalt%w erwischt!", + "Ça me %bglace%w le sang!" }, + + { "Stay %bfrosty%w, @.", + "Es läuft dir %beiskalt%w den Rücken&hinunter, @.", + "%bReste au frais%w, @." }, + + { "Take a %bchill pill%w, @.", + "Bleib %bcool%w, @.", + "Et c'est la douche %bfroide%w!" }, + + { "%bWinter%w is coming.", + "Der %bWinter%w naht.", + "L'%bhiver%w vient." }, + + { "%bICE%w to see you, @.", + "Alles %bcool%w im Pool?", + "%bGlacier%w!" }, + + { "Feeling a little %rhot%w under the collar?&%bLet's fix that%w.", + "%bAbkühlung gefällig%w?", + "%Ça en jette un %bfroid%w." }, + + { "It's a %bcold day%w in the Evil Realm.", + "Es ist ein %kalter%w Tag im Herzen&von Hyrule.", + "Est-ce que tu as déjà eu des sueurs&%bfroides%w?" }, + + { "Getting %bcold feet%w?", + "Bekommst du etwa %bkalte%w Füße?", + "La vengeance est un plat qui se mange&%bfroid%w!" }, + + { "Say hello to the %bZoras%w for me!", + "Sag den %bZoras%w viele Grüße von mir!", + "Dit bonjour aux %bZoras%w pour moi!" }, + + { "Can you keep a %bcool head%w?", + "Bewahre einen %bkühlen%w! Kopf.", + "Il faut parfois savoir garder la tête&%bfroide%w!" }, + + { "Ganondorf used %bIce Trap%w!&It's super effective!", + "Ganondorf setzt %bEisstrahl%w ein.&Das ist sehr effektiv!", + "Ganondorf utilise %bPiège de Glace%w!&C'est super efficace!" }, + + { "Allow me to break the %bice%w!", + "Ein Lächeln ist der beste Weg,&um das %bEis%w zu brechen!", + "Laisse moi briser la %bglace%w!" }, + + { "%bCold pun%w.", + "%bEiskalt%w lässt du meine Seele&erfrier'n.", + "Balance man...,&Cadence man...,&Trace la %bglace%w...,&c'est le Cooooolllll Rasta!" }, + + { "The %bTitanic%w would be scared of you,&@.", + "Die %bTitanic%w hätte Angst vor dir,&@.", + "Le %bTitanic%w aurait peur de toi,&@." }, + + { "Oh no!", + "Oh nein!", + "Oh non!" }, + + { "What killed the dinosaurs?&The %bICE%w age!", + "Was die Dinosaurier getötet hat?&Die %bEiszeit%w!", + "Qu'est-ce qui a tué les dinosaures?&L'ère %bglacière%w!" }, + + { "Knock knock. Who's there? Ice. Ice&who? Ice see that you're a %bFOOL%w.", + "Nachts ist es %bkälter%w als draußen.", + "L'imbécile réfléchit uniquement quand il&s'observe dans la %bglace%w." }, + + { "Never gonna %bgive you up%w. Never&gonna %blet you down%w. Never gonna&run around and %bhurt you%w.", + "Never gonna %bgive you up%w. Never&gonna %blet you down%w. Never gonna&run around and %bhurt you%w.", + "Never gonna %bgive you up%w. Never&gonna %blet you down%w. Never gonna&run around and %bhurt you%w." }, + + { "Thank you %b@%w!&But your item is in another castle!", + "Danke %b@%w!&Aber der Gegenstand ist in&einem anderem Schloss!", + "Merci %b@%w!&Mais ton objet est dans un autre&château!" }, + + { "%bFREEZE%w! Don't move!", + " Kalt. Kalt. Kälter. %bEISKALT%w!", + "J'espère que ça ne te fait ni chaud, ni&%bfroid%w." }, + +}; + +void CreateIceTrapRandoMessages() { + CustomMessageManager* customMessageManager = CustomMessageManager::Instance; + customMessageManager->AddCustomMessageTable(Randomizer::IceTrapRandoMessageTableID); + for (u8 i = 0; i <= (NUM_ICE_TRAP_MESSAGES - 1); i++) { + customMessageManager->CreateMessage(Randomizer::IceTrapRandoMessageTableID, i, + { TEXTBOX_TYPE_BLACK, TEXTBOX_POS_BOTTOM, IceTrapMessages[i].english, + IceTrapMessages[i].german, IceTrapMessages[i].french }); + } +} + void Randomizer::CreateCustomMessages() { // RANDTODO: Translate into french and german and replace GIMESSAGE_UNTRANSLATED // with GIMESSAGE(getItemID, itemID, english, german, french). const std::vector getItemMessages = { - GIMESSAGE(RG_ICE_TRAP, ITEM_NONE, "\x08\x06\x30You are a %bFOWL%w!", - "\x08\x06\x15 Du bist ein %bDUMMKOPF%w!", "\x08\x06\x50%bIDIOT%w"), GIMESSAGE_NO_GERMAN( RG_BOTTLE_WITH_BLUE_FIRE, ITEM_BLUE_FIRE, "You got a %rBottle with Blue &Fire%w! Use it to melt Red Ice!", "Vous obtenez une %rBouteille avec&une Flamme Bleue%w! Utilisez-la&pour faire fondre la %rGlace&Rouge%w!"), @@ -5115,6 +5212,7 @@ void Randomizer::CreateCustomMessages() { CreateGetItemMessages(getItemMessages); CreateRupeeMessages(); CreateNaviRandoMessages(); + CreateIceTrapRandoMessages(); } class ExtendedVanillaTableInvalidItemIdException: public std::exception { diff --git a/soh/soh/Enhancements/randomizer/randomizer.h b/soh/soh/Enhancements/randomizer/randomizer.h index 9833aa303..53ecbf1f1 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.h +++ b/soh/soh/Enhancements/randomizer/randomizer.h @@ -9,6 +9,7 @@ #include #define NUM_NAVI_MESSAGES 19 +#define NUM_ICE_TRAP_MESSAGES 23 class Randomizer { private: @@ -35,6 +36,7 @@ class Randomizer { static const std::string merchantMessageTableID; static const std::string rupeeMessageTableID; static const std::string NaviRandoMessageTableID; + static const std::string IceTrapRandoMessageTableID; // Public for now to be accessed by SaveManager, will be made private again soon :tm: std::unordered_map trialsRequired; diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 981de88fc..c64890caa 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1660,6 +1660,11 @@ extern "C" CustomMessageEntry Randomizer_GetNaviMessage() { return CustomMessageManager::Instance->RetrieveMessage(Randomizer::NaviRandoMessageTableID, naviTextId); } +extern "C" CustomMessageEntry Randomizer_GetIceTrapMessage() { + u16 iceTrapTextId = rand() % NUM_ICE_TRAP_MESSAGES; + return CustomMessageManager::Instance->RetrieveMessage(Randomizer::IceTrapRandoMessageTableID, iceTrapTextId); +} + extern "C" CustomMessageEntry Randomizer_GetAltarMessage() { return (LINK_IS_ADULT) ? CustomMessageManager::Instance->RetrieveMessage(Randomizer::hintMessageTableID, TEXT_ALTAR_ADULT) @@ -1768,8 +1773,12 @@ extern "C" int CustomMessage_RetrieveIfExists(GlobalContext* globalCtx) { CustomMessageEntry messageEntry; if (gSaveContext.n64ddFlag) { if (textId == TEXT_RANDOMIZER_CUSTOM_ITEM) { - messageEntry = - Randomizer_GetCustomGetItemMessage(GET_PLAYER(globalCtx)); + Player* player = GET_PLAYER(globalCtx); + if (player->getItemEntry.getItemId == RG_ICE_TRAP) { + messageEntry = Randomizer_GetIceTrapMessage(); + } else { + messageEntry = Randomizer_GetCustomGetItemMessage(player); + } } else if (textId == TEXT_RANDOMIZER_GOSSIP_STONE_HINTS && Randomizer_GetSettingValue(RSK_GOSSIP_STONE_HINTS) != 0 && (Randomizer_GetSettingValue(RSK_GOSSIP_STONE_HINTS) == 1 || (Randomizer_GetSettingValue(RSK_GOSSIP_STONE_HINTS) == 2 && diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 1a0877373..bda3792ff 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -6240,6 +6240,8 @@ s32 func_8083E5A8(Player* this, GlobalContext* globalCtx) { this->actor.colChkInfo.damage = 0; func_80837C0C(globalCtx, this, 3, 0.0f, 0.0f, 0, 20); Player_SetPendingFlag(this, globalCtx); + Message_StartTextbox(globalCtx, 0xF8, NULL); + Audio_PlayFanfare(NA_BGM_SMALL_ITEM_GET); this->getItemId = GI_NONE; this->getItemEntry = (GetItemEntry) GET_ITEM_NONE; return 1;