Formatting and fixing bad merge conflict resolutions

This commit is contained in:
Christopher Leggett 2025-04-02 11:45:22 -04:00
commit ba7ffc9166
No known key found for this signature in database
GPG key ID: F2121C0AF9938ABF
18 changed files with 614 additions and 407 deletions

View file

@ -7,8 +7,8 @@ extern "C" {
#define RAND_GET_OPTION(rsk) OTRGlobals::Instance->gRandoContext->GetOption(rsk)
void BuildSkulltulaMessage(uint16_t* textId, bool* loadFromMessageTable) {
CustomMessage msg = CustomMessage(
"You got a %rGold Skulltula Token%w!&You've collected %r[[gsCount]]%w tokens&in total!",
CustomMessage msg =
CustomMessage("You got a %rGold Skulltula Token%w!&You've collected %r[[gsCount]]%w tokens&in total!",
"Ein %rGoldenes Skulltula-Symbol%w!&Du hast nun insgesamt %r[[gsCount]]&%wGoldene "
"Skulltula-Symbole&gesammelt!",
"Vous obtenez un %rSymbole de&Skulltula d'or%w! Vous avez&collecté %r[[gsCount]]%w symboles en "
@ -37,8 +37,7 @@ void BuildHeartContainerMessage(uint16_t* textId, bool* loadFromMessageTable) {
CustomMessage msg = CustomMessage(
"You got a %rHeart Container%w!&You've collected %r[[heartContainerCount]]%w containers&in total!",
"Ein %rHerzcontainer%w!&Du hast nun insgesamt %r[[heartContainerCount]]%w&Herzcontainer gesammelt!",
"Vous obtenez un %rCoeur&d'Energie%w! Vous en avez&collecté %r[[heartContainerCount]]%w en tout!"
);
"Vous obtenez un %rCoeur&d'Energie%w! Vous en avez&collecté %r[[heartContainerCount]]%w en tout!");
msg.Replace("[[heartContainerCount]]", std::to_string(gSaveContext.ship.stats.heartContainers + 1));
msg.AutoFormat(ITEM_HEART_CONTAINER);
msg.LoadIntoFont();
@ -46,12 +45,11 @@ void BuildHeartContainerMessage(uint16_t* textId, bool* loadFromMessageTable) {
}
void BuildHeartPieceMessage(uint16_t* textId, bool* loadFromMessageTable) {
CustomMessage msg = CustomMessage(
"You got a %rHeart Piece%w!&You've collected %r[[heartPieceCount]]%w pieces&in total!",
CustomMessage msg =
CustomMessage("You got a %rHeart Piece%w!&You've collected %r[[heartPieceCount]]%w pieces&in total!",
"Ein %rHerzteil%w!&Du hast nun insgesamt %r[[heartPieceCount]]%w&Herzteile gesammelt!",
"Vous obtenez un %rQuart de&Coeur%w! Vous en avez collecté&%r[[heartPieceCount]]%w en tout!",
TEXTBOX_TYPE_BLUE
);
TEXTBOX_TYPE_BLUE);
msg.Replace("[[heartPieceCount]]", std::to_string(gSaveContext.ship.stats.heartPieces + 1));
msg.AutoFormat(ITEM_HEART_PIECE);
msg.LoadIntoFont();
@ -59,19 +57,24 @@ void BuildHeartPieceMessage(uint16_t* textId, bool* loadFromMessageTable) {
}
void InjectItemCounts_Register() {
COND_ID_HOOK(OnOpenText, TEXT_GS_FREEZE, CVarGetInteger(CVAR_ENHANCEMENT("InjectItemCounts.GoldSkulltula"), 0), BuildSkulltulaMessage);
COND_ID_HOOK(OnOpenText, TEXT_GS_NO_FREEZE, CVarGetInteger(CVAR_ENHANCEMENT("InjectItemCounts.GoldSkulltula"), 0), BuildSkulltulaMessage);
COND_ID_HOOK(OnOpenText, TEXT_HEART_CONTAINER, CVarGetInteger(CVAR_ENHANCEMENT("InjectItemCounts.HeartContainer"), 0), BuildHeartContainerMessage);
COND_ID_HOOK(OnOpenText, TEXT_GS_FREEZE, CVarGetInteger(CVAR_ENHANCEMENT("InjectItemCounts.GoldSkulltula"), 0),
BuildSkulltulaMessage);
COND_ID_HOOK(OnOpenText, TEXT_GS_NO_FREEZE, CVarGetInteger(CVAR_ENHANCEMENT("InjectItemCounts.GoldSkulltula"), 0),
BuildSkulltulaMessage);
COND_ID_HOOK(OnOpenText, TEXT_HEART_CONTAINER,
CVarGetInteger(CVAR_ENHANCEMENT("InjectItemCounts.HeartContainer"), 0), BuildHeartContainerMessage);
// Heart Pieces don't have documented text IDs after the first one, but
// there are 3 more in between TEXT_HEART_PIECE and TEXT_HEART_CONTAINER.
COND_ID_HOOK(OnOpenText, TEXT_HEART_PIECE, CVarGetInteger(CVAR_ENHANCEMENT("InjectItemCounts.HeartPiece"), 0), BuildHeartPieceMessage);
COND_ID_HOOK(OnOpenText, TEXT_HEART_PIECE + 1, CVarGetInteger(CVAR_ENHANCEMENT("InjectItemCounts.HeartPiece"), 0), BuildHeartPieceMessage);
COND_ID_HOOK(OnOpenText, TEXT_HEART_PIECE + 2, CVarGetInteger(CVAR_ENHANCEMENT("InjectItemCounts.HeartPiece"), 0), BuildHeartPieceMessage);
COND_ID_HOOK(OnOpenText, TEXT_HEART_PIECE + 3, CVarGetInteger(CVAR_ENHANCEMENT("InjectItemCounts.HeartPiece"), 0), BuildHeartPieceMessage);
COND_ID_HOOK(OnOpenText, TEXT_HEART_PIECE, CVarGetInteger(CVAR_ENHANCEMENT("InjectItemCounts.HeartPiece"), 0),
BuildHeartPieceMessage);
COND_ID_HOOK(OnOpenText, TEXT_HEART_PIECE + 1, CVarGetInteger(CVAR_ENHANCEMENT("InjectItemCounts.HeartPiece"), 0),
BuildHeartPieceMessage);
COND_ID_HOOK(OnOpenText, TEXT_HEART_PIECE + 2, CVarGetInteger(CVAR_ENHANCEMENT("InjectItemCounts.HeartPiece"), 0),
BuildHeartPieceMessage);
COND_ID_HOOK(OnOpenText, TEXT_HEART_PIECE + 3, CVarGetInteger(CVAR_ENHANCEMENT("InjectItemCounts.HeartPiece"), 0),
BuildHeartPieceMessage);
}
static RegisterShipInitFunc initFunc(InjectItemCounts_Register, {
CVAR_ENHANCEMENT("InjectItemCounts.GoldSkulltula"),
static RegisterShipInitFunc initFunc(InjectItemCounts_Register, { CVAR_ENHANCEMENT("InjectItemCounts.GoldSkulltula"),
CVAR_ENHANCEMENT("InjectItemCounts.HeartContainer"),
CVAR_ENHANCEMENT("InjectItemCounts.HeartPiece")
});
CVAR_ENHANCEMENT("InjectItemCounts.HeartPiece") });

View file

@ -4,36 +4,36 @@ extern "C" {
#include <variables.h>
}
//RANDOTODO: Port the rest of the behavior associated with this option here.
// RANDOTODO: Port the rest of the behavior associated with this option here.
void BuildShopDescMessage(uint16_t* textId, bool* loadFromMessageTable) {
CustomMessage msg = CustomMessage(
"\x08%rBombchu 10 pieces 99 Rupees&%wThis looks like a toy mouse, but&it's actually a "
CustomMessage msg =
CustomMessage("\x08%rBombchu 10 pieces 99 Rupees&%wThis looks like a toy mouse, but&it's actually a "
"self-propelled time&bomb!\x09\x0A",
"\x08%rKrabbelmine 10 Stück 99 Rubine&%wDas ist eine praktische Zeitbombe,&die Du als "
"Distanzwaffe&einsetzen kannst!\x09\x0A",
"\x08%rMissile 10 unités 99 Rubis&%wProfilée comme une souris&mécanique, cette arme est "
"&destructrice!!!\x09\x0A"
);
"&destructrice!!!\x09\x0A");
msg.AutoFormat();
msg.LoadIntoFont();
*loadFromMessageTable = false;
}
void BuildShopPromptMessage(uint16_t* textId, bool* loadFromMessageTable) {
CustomMessage msg = CustomMessage(
"\x08Bombchu 10 pieces 99 Rupees\x09&&\x1B%gBuy&Don't buy%w",
CustomMessage msg = CustomMessage("\x08Bombchu 10 pieces 99 Rupees\x09&&\x1B%gBuy&Don't buy%w",
"\x08Krabbelmine 10 Stück 99 Rubine\x09&&\x1B%gKaufen!&Nicht kaufen!%w",
"\x08Missiles 10 unités 99 Rubis\x09&&\x1B%gAcheter&Ne pas acheter%w"
);
"\x08Missiles 10 unités 99 Rubis\x09&&\x1B%gAcheter&Ne pas acheter%w");
msg.AutoFormat();
msg.LoadIntoFont();
*loadFromMessageTable = false;
}
void BetterBombchuShopping_Register() {
COND_ID_HOOK(OnOpenText, TEXT_BUY_BOMBCHUS_10_DESC, IS_RANDO || CVarGetInteger(CVAR_ENHANCEMENT("BetterBombchuShopping"), 0), BuildShopDescMessage);
COND_ID_HOOK(OnOpenText, TEXT_BUY_BOMBCHUS_10_PROMPT, IS_RANDO || CVarGetInteger(CVAR_ENHANCEMENT("BetterBombchuShopping"), 0), BuildShopPromptMessage);
COND_ID_HOOK(OnOpenText, TEXT_BUY_BOMBCHUS_10_DESC,
IS_RANDO || CVarGetInteger(CVAR_ENHANCEMENT("BetterBombchuShopping"), 0), BuildShopDescMessage);
COND_ID_HOOK(OnOpenText, TEXT_BUY_BOMBCHUS_10_PROMPT,
IS_RANDO || CVarGetInteger(CVAR_ENHANCEMENT("BetterBombchuShopping"), 0), BuildShopPromptMessage);
}
static RegisterShipInitFunc initFunc(BetterBombchuShopping_Register, { "IS_RANDO", CVAR_ENHANCEMENT("BetterBombchuShopping") });
static RegisterShipInitFunc initFunc(BetterBombchuShopping_Register,
{ "IS_RANDO", CVAR_ENHANCEMENT("BetterBombchuShopping") });

View file

@ -7,18 +7,17 @@ extern "C" {
// RANDOTODO: Port the rest of the behavior for this enhancement here.
void BuildNightGuardMessage(uint16_t* textId, bool* loadFromMessageTable) {
CustomMessage msg = CustomMessage(
"You look bored. Wanna go out for a&walk?\x1B&%gYes&No%w",
CustomMessage msg = CustomMessage("You look bored. Wanna go out for a&walk?\x1B&%gYes&No%w",
"Du siehst gelangweilt aus.&Willst Du einen Spaziergang machen?\x1B&%gJa&Nein%w",
"Tu as l'air de t'ennuyer. Tu veux&aller faire un tour?\x1B&%gOui&Non%w"
);
"Tu as l'air de t'ennuyer. Tu veux&aller faire un tour?\x1B&%gOui&Non%w");
msg.AutoFormat();
msg.LoadIntoFont();
*loadFromMessageTable = false;
}
void MarketSneak_Register() {
COND_ID_HOOK(OnOpenText, TEXT_MARKET_GUARD_NIGHT, CVarGetInteger(CVAR_ENHANCEMENT("MarketSneak"), 0), BuildNightGuardMessage);
COND_ID_HOOK(OnOpenText, TEXT_MARKET_GUARD_NIGHT, CVarGetInteger(CVAR_ENHANCEMENT("MarketSneak"), 0),
BuildNightGuardMessage);
}
static RegisterShipInitFunc initFunc(MarketSneak_Register, { CVAR_ENHANCEMENT("MarketSneak") });

View file

@ -11,16 +11,17 @@ void BuildQuitFishingMessage(uint16_t* textId, bool* loadFromMessageTable) {
// a brand new one. Might not be worth it.
CustomMessage msg = CustomMessage(
"Hey! Hey!&You can't take the rod out of here!&I'm serious!^Do you want to quit?&\x1B&%gYes&No%w",
"Hey! Hey!&Du kannst die Angel doch nicht&einfach mitnehmen!&Ganz im Ernst!^Möchtest Du aufhören?&\x1B&%gJa&Nein%w",
"Holà! Holà!&Les cannes ne sortent pas d'ici!&Je suis sérieux!^Voulez-vous arrêter?&\x1B&%gOui&Non%w"
);
"Hey! Hey!&Du kannst die Angel doch nicht&einfach mitnehmen!&Ganz im Ernst!^Möchtest Du "
"aufhören?&\x1B&%gJa&Nein%w",
"Holà! Holà!&Les cannes ne sortent pas d'ici!&Je suis sérieux!^Voulez-vous arrêter?&\x1B&%gOui&Non%w");
msg.AutoFormat();
msg.LoadIntoFont();
*loadFromMessageTable = false;
}
void QuitFishingAtDoor_Register() {
COND_ID_HOOK(OnOpenText, TEXT_FISHERMAN_LEAVE, CVarGetInteger(CVAR_ENHANCEMENT("QuitFishingAtDoor"), 0), BuildQuitFishingMessage);
COND_ID_HOOK(OnOpenText, TEXT_FISHERMAN_LEAVE, CVarGetInteger(CVAR_ENHANCEMENT("QuitFishingAtDoor"), 0),
BuildQuitFishingMessage);
}
static RegisterShipInitFunc initFunc(QuitFishingAtDoor_Register, { CVAR_ENHANCEMENT("QuitFishingAtDoor") });

View file

@ -263,7 +263,8 @@ bool CustomMessage::operator!=(const CustomMessage& operand) const {
int CopyStringToCharBuffer(const std::string& inputStr, char* buffer, const int maxBufferSize) {
if (!inputStr.empty()) {
// Prevent potential horrible overflow due to implicit conversion of maxBufferSize to an unsigned. Prevents negatives.
// Prevent potential horrible overflow due to implicit conversion of maxBufferSize to an unsigned. Prevents
// negatives.
memset(buffer, 0, std::max<int>(0, maxBufferSize));
// Gaurentee that this value will be greater than 0, regardless of passed variables.
const int copiedCharLen = std::min<int>(std::max<int>(0, maxBufferSize - 1), inputStr.length());
@ -344,7 +345,7 @@ void CustomMessage::AutoFormat() {
}
void CustomMessage::AutoFormat(ItemID iid) {
for (std::string &str : messages) {
for (std::string& str : messages) {
str.insert(0, ITEM_OBTAINED(iid));
}
AutoFormat();
@ -416,8 +417,8 @@ static size_t NextLineLength(const std::string* textStr, const size_t lastNewlin
// Skip colour control characters.
nextPosJump = 2;
} else if (textStr->at(currentPos) == '\x1E') {
//For the high score char, we have to take the next Char, then use that to get a worst case scenario.
if (textStr->at(currentPos+1) == '\x01'){
// For the high score char, we have to take the next Char, then use that to get a worst case scenario.
if (textStr->at(currentPos + 1) == '\x01') {
totalPixelWidth += 28;
}
nextPosJump = 2;
@ -431,11 +432,13 @@ static size_t NextLineLength(const std::string* textStr, const size_t lastNewlin
totalPixelWidth += pixelWidthTable[textStr->substr(currentPos, 2)];
nextPosJump = 2;
} else {
SPDLOG_DEBUG("Table does not contain " + textStr->substr(currentPos, 1) + "/" + textStr->substr(currentPos, 2));
SPDLOG_DEBUG("Table does not contain " + textStr->substr(currentPos, 1) + "/" +
textStr->substr(currentPos, 2));
SPDLOG_DEBUG("Full string: " + *textStr);
nextPosJump = 1;
}
}
}
}
size_t CustomMessage::FindNEWLINE(std::string& str, size_t lastNewline) const {

View file

@ -50,15 +50,16 @@ class CustomMessage {
TextBoxType type_ = TEXTBOX_TYPE_BLACK, TextBoxPosition position_ = TEXTBOX_POS_BOTTOM);
CustomMessage(Text text, TextBoxType type_ = TEXTBOX_TYPE_BLACK, TextBoxPosition position_ = TEXTBOX_POS_BOTTOM);
static std::string MESSAGE_END() ;
static std::string ITEM_OBTAINED(uint8_t x) ;
static std::string NEWLINE() ;
static std::string COLOR(std::string x) ;
static std::string POINTS(std::string x) ;//HIGH_SCORE is also a macro
static std::string WAIT_FOR_INPUT() ;
static std::string PLAYER_NAME() ;
static std::string MESSAGE_END();
static std::string ITEM_OBTAINED(uint8_t x);
static std::string NEWLINE();
static std::string COLOR(std::string x);
static std::string POINTS(std::string x); // HIGH_SCORE is also a macro
static std::string WAIT_FOR_INPUT();
static std::string PLAYER_NAME();
static std::string TWO_WAY_CHOICE();
CustomMessage LoadVanillaMessageTableEntry(uint16_t textId);
const std::string GetEnglish(MessageFormat format = MF_FORMATTED) const;
const std::string GetFrench(MessageFormat format = MF_FORMATTED) const;
const std::string GetGerman(MessageFormat format = MF_FORMATTED) const;

View file

@ -67,4 +67,4 @@ DEFINE_HOOK(OnSetGameLanguage, ());
DEFINE_HOOK(OnFileDropped, (std::string filePath));
DEFINE_HOOK(OnAssetAltChange, ());
DEFINE_HOOK(OnKaleidoUpdate, ());
DEFINE_HOOK(OnOpenText, (uint16_t* textId, bool* loadFromMessageTable));
DEFINE_HOOK(OnOpenText, (uint16_t * textId, bool* loadFromMessageTable));

View file

@ -5,6 +5,7 @@
#include "z64save.h"
#include "objects/object_gi_compass/object_gi_compass.h"
#include "objects/object_gi_map/object_gi_map.h"
#include "soh/OTRGlobals.h"
extern "C" {
extern SaveContext gSaveContext;

View file

@ -50,14 +50,12 @@ static CustomMessage FireTempleGoronMessages[NUM_GORON_MESSAGES] = {
"Merci, mais je me sens plus en&sécurité ici...^...^...^...^...^Hmm...^...Tout compte fait, je vais y "
"aller.&A plus tard.",
},
{
"Do you know about %b\x9f%w?&It's this weird symbol that's been&in my dreams lately...^Apparently, you "
{ "Do you know about %b\x9f%w?&It's this weird symbol that's been&in my dreams lately...^Apparently, you "
"pressed it %b[[a_btn]]%w times.^Wow.",
"Weißt Du über %b\x9f%w Bescheid?&Es sind Symbole, die mir&in letzter Zeit öfter in&meinen Träumen "
"erschienen sind...^Es scheint, dass Du sie schon&%b[[a_btn]]%w mal betätigt hast.^Faszinierend...",
"Tu as déjà entendu parler du&symbole %b\x9f%w?&C'est un symbole bizarre qui est&apparu dans mes rêves "
"dernièrement...^Apparemment, tu as appuyé dessus&%b[[a_btn]]%w fois.^Wow..."
},
"dernièrement...^Apparemment, tu as appuyé dessus&%b[[a_btn]]%w fois.^Wow..." },
{
"\x13\x1A"
"Boy, you must be hot!&Get yourself a bottle of&%rLon Lon Milk%w right away and cool&down, for only %g30%w "

View file

@ -14,10 +14,10 @@ extern PlayState* gPlayState;
#define RAND_GET_OPTION(rsk) OTRGlobals::Instance->gRandoContext->GetOption(rsk)
void BuildHintStoneMessage(uint16_t* textId, bool* loadFromMessageTable) {
if (
(RAND_GET_OPTION(RSK_GOSSIP_STONE_HINTS).Is(RO_GOSSIP_STONES_NEED_TRUTH) && Player_GetMask(gPlayState) == PLAYER_MASK_TRUTH) ||
(RAND_GET_OPTION(RSK_GOSSIP_STONE_HINTS).Is(RO_GOSSIP_STONES_NEED_STONE) && CHECK_QUEST_ITEM(QUEST_STONE_OF_AGONY) == 0)
) {
if ((RAND_GET_OPTION(RSK_GOSSIP_STONE_HINTS).Is(RO_GOSSIP_STONES_NEED_TRUTH) &&
Player_GetMask(gPlayState) == PLAYER_MASK_TRUTH) ||
(RAND_GET_OPTION(RSK_GOSSIP_STONE_HINTS).Is(RO_GOSSIP_STONES_NEED_STONE) &&
CHECK_QUEST_ITEM(QUEST_STONE_OF_AGONY) == 0)) {
return;
}
CustomMessage msg;
@ -31,11 +31,11 @@ void BuildHintStoneMessage(uint16_t* textId, bool* loadFromMessageTable) {
int numOfActorLists = sizeof(gPlayState->actorCtx.actorLists) / sizeof(gPlayState->actorCtx.actorLists[0]);
for (int i = 0; i < numOfActorLists; i++) {
if (gPlayState->actorCtx.actorLists[i].length) {
if (
gPlayState->actorCtx.actorLists[i].head->id == 10 &&
Rando::StaticData::grottoChestParamsToHint.contains(gPlayState->actorCtx.actorLists[i].head->params)
) {
stoneHint = Rando::StaticData::grottoChestParamsToHint[gPlayState->actorCtx.actorLists[i].head->params];
if (gPlayState->actorCtx.actorLists[i].head->id == 10 &&
Rando::StaticData::grottoChestParamsToHint.contains(
gPlayState->actorCtx.actorLists[i].head->params)) {
stoneHint =
Rando::StaticData::grottoChestParamsToHint[gPlayState->actorCtx.actorLists[i].head->params];
}
}
}
@ -50,7 +50,8 @@ void BuildHintStoneMessage(uint16_t* textId, bool* loadFromMessageTable) {
}
void RegisterGossipStoneHints() {
COND_ID_HOOK(OnOpenText, TEXT_RANDOMIZER_GOSSIP_STONE_HINTS, RAND_GET_OPTION(RSK_GOSSIP_STONE_HINTS).IsNot(RO_GOSSIP_STONES_NONE), BuildHintStoneMessage);
COND_ID_HOOK(OnOpenText, TEXT_RANDOMIZER_GOSSIP_STONE_HINTS,
RAND_GET_OPTION(RSK_GOSSIP_STONE_HINTS).IsNot(RO_GOSSIP_STONES_NONE), BuildHintStoneMessage);
}
static RegisterShipInitFunc initFunc(RegisterGossipStoneHints, { "IS_RANDO" });

View file

@ -62,7 +62,7 @@ static const char* const englishIceTrapMessages[169] = {
"Would you like #ice# with that?",
"You have obtained the #Ice# Medallion!",
"Quick, do a #Zora# impression!",
"One item #on the rocks#!",//would be better if it could display the name of the item
"One item #on the rocks#!", // would be better if it could display the name of the item
"How much does a polar bear weigh?&Enough to break the #ice#.",
"You got Din's #Ice#!",
"You got Nayru's #Cold#!",
@ -125,12 +125,13 @@ static const char* const englishIceTrapMessages[169] = {
"STOP!&You violated the #Thaw#!",
"I wanted to give you a treasure, but it looks like you got #cold feet#.",
"You told me you wanted to deliver #just ice# to Ganondorf!",
"You got the triforce!&This ancient artifact of divine power can grant any- wait, no, sorry, it's just an ice trap. My bad.",
"You got the triforce!&This ancient artifact of divine power can grant any- wait, no, sorry, it's just an ice "
"trap. My bad.",
"Time to #cool off#!",
"The #Ice Cavern# sends its regards.",
"Loading item, please #wait#...",
"Mash A+B to not #die#.",
"Sorry, your item is in another location.", //would be better if it could have the name of the item
"Sorry, your item is in another location.", // would be better if it could have the name of the item
"You only wish this was %gGreg%w.",
"Do you want to drink a hot chocolate?",
"The #cold# never bothered me anyway.",
@ -151,7 +152,7 @@ static const char* const englishIceTrapMessages[169] = {
"Remember, there may be some momentary #discomfort#.",
"In a perfect world #ice traps# like me would not exist, but this is not a perfect world.",
"Gee, it sure is #cold# around here.",
"You tested the item with your #ice detector#, it beeped.", //would be better if it could have the name of the item
"You tested the item with your #ice detector#, it beeped.", // would be better if it could have the name of the item
"You have found the way of the zero. The #sub-zero#.",
"Mweep... mweep... mweep...",
"Scum, #freezebag#! I mean #freeze#, scumbag!",
@ -170,19 +171,22 @@ static const char* const englishIceTrapMessages[169] = {
"Hydration break! Hey, who #froze# my water?",
"Oops, wrong #item model#.",
"Whoops! You have to put the item #in your inventory#.",
"You dropped the item, shattering it into #shards of ice#!", //would be better if it could have the name of the item
"You dropped the item, shattering it into #shards of ice#!", // would be better if it could have the name of the
// item
"Is this... golden age Simpsons?&BECAUSE I'M ABOUT TO #CHOKE A CHILD#.",
"You are the weakest @, #goodbye#!",
"Ugh... Why did we even randomize #this item#?",
"The #Frost Moon# is rising...",
"According to all known laws of physics and biology, there is no way that @ should be able to survive #getting fully encased in ice#. The cells in @'s body would all die by the time they #unthaw#. Of course, this is a video game, so @ survives anyway... #Probably#.",
"According to all known laws of physics and biology, there is no way that @ should be able to survive #getting "
"fully encased in ice#. The cells in @'s body would all die by the time they #unthaw#. Of course, this is a video "
"game, so @ survives anyway... #Probably#.",
"Okay, so stop me if you've heard this one - a gamer and a bottle of #liquid nitrogen# walk into a milk bar...",
"Lástima, es una #trampa de hielo#...&&Nobody expects the Spanish #ice trap#!",
"Gee, it sure is #BURR#ing around here.",
"Navi? Oh! I thought she was called #Névé#!",
"It's fine, @ knew this was a #trap#, they're just using it to take damage intentionally to manipulate RNG.",
"Unfortunately, the item has #stopped#.", //would be better if it could have the name of the item
"This item is #not available# in your country.", //would be better if it could have the name of the item
"Unfortunately, the item has #stopped#.", // would be better if it could have the name of the item
"This item is #not available# in your country.", // would be better if it could have the name of the item
"#Ice# try. #;)#",
"D'oh, I #missed#!",
"Where is my #super suit#?",
@ -241,12 +245,13 @@ static const char* const frenchIceTrapMessages[83] = {
"J'espère que ça ne te fait ni chaud, ni #froid#.",
"Je voulais t'offrir un trésor, mais il semble que tu aies eu #froid aux pieds#",
"Tu m'as dit que tu voulais livrer #de la glace# à Ganondorf!",
"Tu as obtenu la Triforce!&Cet ancien artefact divin peut exaucer n'importe quel... ah non, désolé, c'est juste un piège de glace.",
"Tu as obtenu la Triforce!&Cet ancien artefact divin peut exaucer n'importe quel... ah non, désolé, c'est juste un "
"piège de glace.",
"Il est temps de #te rafraîchir#!",
"La #Caverne Polaire# te passe le bonjour.",
"Chargement de l'objet, veuillez #patienter#...",
"Martèle A+B pour ne pas #mourir#.",
"Désolé, ton objet est à un autre endroit.", //would be better if it could have the name of the item
"Désolé, ton objet est à un autre endroit.", // would be better if it could have the name of the item
"Tu espérais que ce soit %gGreg%w.",
"Tu veux boire un chocolat chaud?",
"Le #froid# ne m'a jamais dérangé, de toute façon.",
@ -267,7 +272,8 @@ static const char* const frenchIceTrapMessages[83] = {
"Souviens-toi, il pourrait y avoir un léger #inconfort#.",
"Dans un monde parfait, les #pièges de glace# comme moi n'existeraient pas, mais ce n'est pas un monde parfait.",
"Mon dieu qu'il fait #froid# ici.",
"Tu as testé l'objet avec ton #détecteur de glace#, il a bipé.", //would be better if it could have the name of the item
"Tu as testé l'objet avec ton #détecteur de glace#, il a bipé.", // would be better if it could have the name of the
// item
"Tu as découvert le chemin du zéro. Le #sub-zéro#.",
"Mweep... mweep... mweep...",
"Gelé, #sac à glace#! Je veux dire #gèle-toi#, racaille!",
@ -286,16 +292,21 @@ static const char* const frenchIceTrapMessages[83] = {
"Pause hydratation ! Hé, qui a #gelé# mon eau?",
"Oups, mauvais #modèle d'objet#.",
"Oups! Tu dois mettre l'objet #dans ton inventaire#.",
"Tu as fait tomber l'objet, le brisant en #éclats de glace#!", //would be better if it could have the name of the item
"Tu as fait tomber l'objet, le brisant en #éclats de glace#!", // would be better if it could have the name of the
// item
"Tu es le maillon faible @, #au revoir#!",
"Ugh... Pourquoi avons-nous même randomisé #cet objet#?",
"La #Lune de Givre# se lève...",
"Selon toutes les lois connues de la physique et de la biologie, @ ne devrait pas survivre à #être complètement enfermé dans la glace#. Les cellules de @ mourraient avant qu'elles ne #dégèlent#. Mais c'est un jeu vidéo, alors @ survit... #Probablement#.",
"OK, arrête-moi si tu l'as déjà entendue - un joueur et une bouteille de #nitrogène liquide# entrent dans un bar à lait...",
"Selon toutes les lois connues de la physique et de la biologie, @ ne devrait pas survivre à #être complètement "
"enfermé dans la glace#. Les cellules de @ mourraient avant qu'elles ne #dégèlent#. Mais c'est un jeu vidéo, alors "
"@ survit... #Probablement#.",
"OK, arrête-moi si tu l'as déjà entendue - un joueur et une bouteille de #nitrogène liquide# entrent dans un bar à "
"lait...",
"Lástima, c'est un #piège de glace#...&&Personne ne s'attend à un #piège de glace espagnol#!",
"Mon dieu qu'il fait #GLAGLA# ici.",
"C'est bon, @ savait que c'était un #piège#, il l'utilise juste pour prendre des dégâts intentionnellement et manipuler la RNG.",
"Cet objet n'est #pas disponible# dans votre pays.", //would be better if it could have the name of the item
"C'est bon, @ savait que c'était un #piège#, il l'utilise juste pour prendre des dégâts intentionnellement et "
"manipuler la RNG.",
"Cet objet n'est #pas disponible# dans votre pays.", // would be better if it could have the name of the item
"#Bonne# tentative. #;)#",
"Où est mon #Super Costume#?",
"#La revanche du Titanic#.",
@ -306,16 +317,10 @@ void BuildIceTrapMessage(CustomMessage& msg) {
msg = CustomMessage(
/*english*/ "This year for Christmas, all you get is #COAL#!",
/*german*/ "This year for Christmas, all you get is #COAL#!",
/*french*/ "Pour Noël, cette année, tu n'auras que du #CHARBON#! %rJoyeux Noël%w!",
{ QM_BLUE }
);
/*french*/ "Pour Noël, cette année, tu n'auras que du #CHARBON#! %rJoyeux Noël%w!", { QM_BLUE });
} else {
msg = CustomMessage(
RandomElement(englishIceTrapMessages),
RandomElement(germanIceTrapMessages),
RandomElement(frenchIceTrapMessages),
{ QM_BLUE, QM_BLUE, QM_BLUE }
);
msg = CustomMessage(RandomElement(englishIceTrapMessages), RandomElement(germanIceTrapMessages),
RandomElement(frenchIceTrapMessages), { QM_BLUE, QM_BLUE, QM_BLUE });
}
msg.AutoFormat();
@ -330,19 +335,26 @@ void BuildTriforcePieceMessage(CustomMessage& msg) {
if (percentageCollected <= 0.25) {
msg = { "You found a %yTriforce Piece%w!&%g[[current]]%w down, %c[[remaining]]%w to go. It's a start!",
"Ein %yTriforce-Splitter%w! Du hast&%g[[current]]%w von %c[[required]]%w gefunden. Es ist ein&Anfang!",
"Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g[[current]]%w, il en&reste %c[[remaining]]%w à trouver. C'est un début!" };
"Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g[[current]]%w, il en&reste "
"%c[[remaining]]%w à trouver. C'est un début!" };
} else if (percentageCollected <= 0.5) {
msg = { "You found a %yTriforce Piece%w!&%g[[current]]%w down, %c[[remaining]]%w to go. Progress!",
"Ein %yTriforce-Splitter%w! Du hast&%g[[current]]%w von %c[[required]]%w gefunden. Es geht voran!",
"Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g[[current]]%w, il en&reste %c[[remaining]]%w à trouver. Ça avance!" };
"Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g[[current]]%w, il en&reste "
"%c[[remaining]]%w à trouver. Ça avance!" };
} else if (percentageCollected <= 0.75) {
msg = { "You found a %yTriforce Piece%w!&%g[[current]]%w down, %c[[remaining]]%w to go. Over half-way&there!",
"Ein %yTriforce-Splitter%w! Du hast&schon %g[[current]]%w von %c[[required]]%w gefunden. Schon&über die Hälfte!",
"Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g[[current]]%w, il en&reste %c[[remaining]]%w à trouver. Il en reste un&peu moins que la moitié!" };
"Ein %yTriforce-Splitter%w! Du hast&schon %g[[current]]%w von %c[[required]]%w gefunden. Schon&über "
"die Hälfte!",
"Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g[[current]]%w, il en&reste "
"%c[[remaining]]%w à trouver. Il en reste un&peu moins que la moitié!" };
} else if (percentageCollected < 1.0) {
msg = { "You found a %yTriforce Piece%w!&%g[[current]]%w down, %c[[remaining]]%w to go. Almost done!",
msg = {
"You found a %yTriforce Piece%w!&%g[[current]]%w down, %c[[remaining]]%w to go. Almost done!",
"Ein %yTriforce-Splitter%w! Du hast&schon %g[[current]]%w von %c[[required]]%w gefunden. Fast&geschafft!",
"Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g[[current]]%w, il en&reste %c[[remaining]]%w à trouver. C'est presque&terminé!" };
"Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g[[current]]%w, il en&reste %c[[remaining]]%w "
"à trouver. C'est presque&terminé!"
};
} else if (current == required) {
msg = { "You completed the %yTriforce of&Courage%w! %gGG%w!",
"Das %yTriforce des Mutes%w! Du hast&alle Splitter gefunden. %gGut gemacht%w!",
@ -350,7 +362,8 @@ void BuildTriforcePieceMessage(CustomMessage& msg) {
} else {
msg = { "You found a spare %yTriforce Piece%w!&You only needed %c[[required]]%w, but you have %g[[current]]%w!",
"Ein übriger %yTriforce-Splitter%w! Du&hast nun %g[[current]]%w von %c[[required]]%w nötigen gefunden.",
"Vous avez trouvé un %yFragment de&Triforce%w en plus! Vous n'aviez besoin&que de %c[[required]]%w, mais vous en avez %g[[current]]%w en&tout!" };
"Vous avez trouvé un %yFragment de&Triforce%w en plus! Vous n'aviez besoin&que de %c[[required]]%w, "
"mais vous en avez %g[[current]]%w en&tout!" };
}
msg.Replace("[[current]]", std::to_string(current));
msg.Replace("[[remaining]]", std::to_string(remaining));
@ -360,13 +373,15 @@ void BuildTriforcePieceMessage(CustomMessage& msg) {
void BuildCustomItemMessage(Player* player, CustomMessage& msg) {
int16_t rgid;
msg = CustomMessage("You found the %g[[name]]%w!", "Du erhältst das %g[[name]]%w!", "Vous ebtenez %g[[name]]%w!", TEXTBOX_TYPE_BLUE);
msg = CustomMessage("You found the %g[[name]]%w!", "Du erhältst das %g[[name]]%w!", "Vous ebtenez %g[[name]]%w!",
TEXTBOX_TYPE_BLUE);
if (player->getItemEntry.objectId != OBJECT_INVALID) {
rgid = player->getItemEntry.getItemId;
} else {
rgid = player->getItemId;
}
CustomMessage name = CustomMessage(Rando::StaticData::RetrieveItem(static_cast<RandomizerGet>(rgid)).GetName(), TEXTBOX_TYPE_BLUE);
CustomMessage name =
CustomMessage(Rando::StaticData::RetrieveItem(static_cast<RandomizerGet>(rgid)).GetName(), TEXTBOX_TYPE_BLUE);
msg.Replace("[[name]]", name);
msg.AutoFormat();
}
@ -389,12 +404,9 @@ void BuildItemMessage(u16* textId, bool* loadFromMessageTable) {
void BuildMapMessage(uint16_t* textId, bool* loadFromMessageTable) {
GetItemEntry itemEntry = GET_PLAYER(gPlayState)->getItemEntry;
auto ctx = OTRGlobals::Instance->gRandoContext;
CustomMessage msg = CustomMessage(
"You found the %g[[name]]%w! [[typeHint]]",
"Du erhältst das %g[[name]]%w! [[typeHint]]",
"Vous ebtenez %g[[name]]%w! [[typeHint]]",
TEXTBOX_TYPE_BLUE
);
CustomMessage msg =
CustomMessage("You found the %g[[name]]%w! [[typeHint]]", "Du erhältst das %g[[name]]%w! [[typeHint]]",
"Vous ebtenez %g[[name]]%w! [[typeHint]]", TEXTBOX_TYPE_BLUE);
int sceneNum;
switch (itemEntry.getItemId) {
case RG_DEKU_TREE_MAP:
@ -428,11 +440,9 @@ void BuildMapMessage(uint16_t* textId, bool* loadFromMessageTable) {
sceneNum = SCENE_ICE_CAVERN;
break;
}
if (
ctx->GetOption(RSK_MQ_DUNGEON_RANDOM).Is(RO_MQ_DUNGEONS_NONE) ||
if (ctx->GetOption(RSK_MQ_DUNGEON_RANDOM).Is(RO_MQ_DUNGEONS_NONE) ||
(ctx->GetOption(RSK_MQ_DUNGEON_RANDOM).Is(RO_MQ_DUNGEONS_SET_NUMBER) &&
ctx->GetOption(RSK_MQ_DUNGEON_COUNT).Is(12))
) {
ctx->GetOption(RSK_MQ_DUNGEON_COUNT).Is(12))) {
msg.Replace("[[typeHint]]", "");
} else if (ResourceMgr_IsSceneMasterQuest(sceneNum)) {
msg.Replace("[[typeHint]]", Rando::StaticData::hintTextTable[RHT_DUNGEON_MASTERFUL].GetHintMessage());
@ -445,10 +455,12 @@ void BuildMapMessage(uint16_t* textId, bool* loadFromMessageTable) {
void BuildBossKeyMessage(uint16_t* textId, bool* loadFromMessageTable) {
Player* player = GET_PLAYER(gPlayState);
if (player->getItemEntry.getItemId == RG_GANONS_CASTLE_BOSS_KEY && !DUNGEON_ITEMS_CAN_BE_OUTSIDE_DUNGEON(RSK_GANONS_BOSS_KEY)) {
if (player->getItemEntry.getItemId == RG_GANONS_CASTLE_BOSS_KEY &&
!DUNGEON_ITEMS_CAN_BE_OUTSIDE_DUNGEON(RSK_GANONS_BOSS_KEY)) {
return;
}
if (player->getItemEntry.getItemId != RG_GANONS_CASTLE_BOSS_KEY && !DUNGEON_ITEMS_CAN_BE_OUTSIDE_DUNGEON(RSK_BOSS_KEYSANITY)) {
if (player->getItemEntry.getItemId != RG_GANONS_CASTLE_BOSS_KEY &&
!DUNGEON_ITEMS_CAN_BE_OUTSIDE_DUNGEON(RSK_BOSS_KEYSANITY)) {
return;
}
CustomMessage msg;
@ -459,10 +471,12 @@ void BuildBossKeyMessage(uint16_t* textId, bool* loadFromMessageTable) {
void BuildSmallKeyMessage(uint16_t* textId, bool* loadFromMessageTable) {
Player* player = GET_PLAYER(gPlayState);
if (player->getItemEntry.getItemId == RG_GERUDO_FORTRESS_SMALL_KEY && OTRGlobals::Instance->gRandoContext->GetOption(RSK_GERUDO_KEYS).Is(RO_GERUDO_KEYS_VANILLA)) {
if (player->getItemEntry.getItemId == RG_GERUDO_FORTRESS_SMALL_KEY &&
OTRGlobals::Instance->gRandoContext->GetOption(RSK_GERUDO_KEYS).Is(RO_GERUDO_KEYS_VANILLA)) {
return;
}
if (player->getItemEntry.getItemId != RG_GERUDO_FORTRESS_SMALL_KEY && DUNGEON_ITEMS_CAN_BE_OUTSIDE_DUNGEON(RSK_KEYSANITY)) {
if (player->getItemEntry.getItemId != RG_GERUDO_FORTRESS_SMALL_KEY &&
DUNGEON_ITEMS_CAN_BE_OUTSIDE_DUNGEON(RSK_KEYSANITY)) {
return;
}
CustomMessage msg;
@ -471,16 +485,20 @@ void BuildSmallKeyMessage(uint16_t* textId, bool* loadFromMessageTable) {
msg.LoadIntoFont();
}
void RegisterItemMessages () {
void RegisterItemMessages() {
COND_ID_HOOK(OnOpenText, TEXT_RANDOMIZER_CUSTOM_ITEM, IS_RANDO, BuildItemMessage);
COND_ID_HOOK(OnOpenText, TEXT_ITEM_DUNGEON_MAP, DUNGEON_ITEMS_CAN_BE_OUTSIDE_DUNGEON(RSK_SHUFFLE_MAPANDCOMPASS), BuildMapMessage);
COND_ID_HOOK(OnOpenText, TEXT_ITEM_COMPASS, DUNGEON_ITEMS_CAN_BE_OUTSIDE_DUNGEON(RSK_SHUFFLE_MAPANDCOMPASS), BuildItemMessage);
COND_ID_HOOK(OnOpenText, TEXT_ITEM_DUNGEON_MAP, DUNGEON_ITEMS_CAN_BE_OUTSIDE_DUNGEON(RSK_SHUFFLE_MAPANDCOMPASS),
BuildMapMessage);
COND_ID_HOOK(OnOpenText, TEXT_ITEM_COMPASS, DUNGEON_ITEMS_CAN_BE_OUTSIDE_DUNGEON(RSK_SHUFFLE_MAPANDCOMPASS),
BuildItemMessage);
COND_ID_HOOK(OnOpenText, TEXT_ITEM_KEY_BOSS,
(DUNGEON_ITEMS_CAN_BE_OUTSIDE_DUNGEON(RSK_BOSS_KEYSANITY) ||
DUNGEON_ITEMS_CAN_BE_OUTSIDE_DUNGEON(RSK_GANONS_BOSS_KEY)), BuildBossKeyMessage);
DUNGEON_ITEMS_CAN_BE_OUTSIDE_DUNGEON(RSK_GANONS_BOSS_KEY)),
BuildBossKeyMessage);
COND_ID_HOOK(OnOpenText, TEXT_ITEM_KEY_SMALL,
(OTRGlobals::Instance->gRandoContext->GetOption(RSK_GERUDO_KEYS).IsNot(RO_GERUDO_KEYS_VANILLA) ||
DUNGEON_ITEMS_CAN_BE_OUTSIDE_DUNGEON(RSK_KEYSANITY)), BuildSmallKeyMessage);
DUNGEON_ITEMS_CAN_BE_OUTSIDE_DUNGEON(RSK_KEYSANITY)),
BuildSmallKeyMessage);
}
static RegisterShipInitFunc initFunc(RegisterItemMessages, { "IS_RANDO" });

View file

@ -19,7 +19,8 @@ extern PlayState* gPlayState;
#define RAND_GET_OPTION(rsk) OTRGlobals::Instance->gRandoContext->GetOption(rsk)
#define RAND_GET_ITEM(rc) OTRGlobals::Instance->gRandoContext->GetItemLocation(rc)
#define RAND_GET_OVERRIDE(rc) OTRGlobals::Instance->gRandoContext->overrides[rc]
#define NON_BEAN_MERCHANTS (RAND_GET_OPTION(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL_BUT_BEANS) || \
#define NON_BEAN_MERCHANTS \
(RAND_GET_OPTION(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL_BUT_BEANS) || \
RAND_GET_OPTION(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL))
void BuildMerchantMessage(CustomMessage& msg, RandomizerCheck rc) {
@ -36,24 +37,23 @@ void BuildMerchantMessage(CustomMessage& msg, RandomizerCheck rc) {
} else {
itemName = CustomMessage(Rando::StaticData::RetrieveItem(rgid).GetName());
}
msg.InsertNames({ itemName , CustomMessage(std::to_string(price))});
msg.InsertNames({ itemName, CustomMessage(std::to_string(price)) });
}
void BuildBeanGuyMessage(uint16_t* textId, bool* loadFromMessageTable) {
CustomMessage msg;
if (*textId == TEXT_BEAN_SALESMAN_BUY_FOR_100) {
msg = CustomMessage(
"I never thought I'd say this, but I'm selling the last %rMagic Bean%w.^%y99 Rupees%w, no less.\x1B%gYes&No%w",
"Ich hätte nie gedacht, daß ich das sage, aber ich verkaufe die letzte^%rWundererbse%w für %y99 Rubine%w.\x1B&%gJa&Nein%w",
"Je te vends mon dernier %rHaricot&magique%g pour %y99 Rubis%w.\x1B&%gAcheterNe pas acheter%w"
);
"I never thought I'd say this, but I'm selling the last %rMagic Bean%w.^%y99 Rupees%w, no "
"less.\x1B%gYes&No%w",
"Ich hätte nie gedacht, daß ich das sage, aber ich verkaufe die letzte^%rWundererbse%w für %y99 "
"Rubine%w.\x1B&%gJa&Nein%w",
"Je te vends mon dernier %rHaricot&magique%g pour %y99 Rubis%w.\x1B&%gAcheterNe pas acheter%w");
msg.Format();
} else if (*textId == TEXT_BEAN_SALESMAN_BUY_FOR_10) {
msg = CustomMessage(
"Want to buy %g[[1]]%w for %y[[2]] Rupees%w?\x1B%gYes&No%w",
msg = CustomMessage("Want to buy %g[[1]]%w for %y[[2]] Rupees%w?\x1B%gYes&No%w",
"Möchten Sie %g[[1]]%w für %y[[2]] Rubin%w kaufen?\x1B%gJa&Nein%w",
"Voulez-vous acheter %g[[1]]%w pour %y[[2]] Rubis%w?\x1B%gOui&Non%w"
);
"Voulez-vous acheter %g[[1]]%w pour %y[[2]] Rubis%w?\x1B%gOui&Non%w");
BuildMerchantMessage(msg, RC_ZR_MAGIC_BEAN_SALESMAN);
msg.AutoFormat();
}
@ -62,11 +62,9 @@ void BuildBeanGuyMessage(uint16_t* textId, bool* loadFromMessageTable) {
}
void BuildMedigoronMessage(uint16_t* textId, bool* loadFromMessageTable) {
CustomMessage msg = CustomMessage(
"Want to buy %g[[1]]%w for %y[[2]] Rupees%w?\x1B%gYes&No%w",
CustomMessage msg = CustomMessage("Want to buy %g[[1]]%w for %y[[2]] Rupees%w?\x1B%gYes&No%w",
"Möchten Sie %g[[1]]%w für %y[[2]] Rubin%w kaufen?\x1B%gJa&Nein%w",
"Voulez-vous acheter %g[[1]]%w pour %y[[2]] Rubis%w?\x1B%gOui&Non%w"
);
"Voulez-vous acheter %g[[1]]%w pour %y[[2]] Rubis%w?\x1B%gOui&Non%w");
BuildMerchantMessage(msg, RC_GC_MEDIGORON);
msg.AutoFormat();
msg.LoadIntoFont();
@ -77,11 +75,9 @@ void BuildGrannyMessage(uint16_t* textId, bool* loadFromMessageTable) {
if (!Flags_GetRandomizerInf(RAND_INF_MERCHANTS_GRANNYS_SHOP) &&
(RAND_GET_OPTION(RSK_SHUFFLE_ADULT_TRADE).Is(RO_GENERIC_ON) ||
INV_CONTENT(ITEM_CLAIM_CHECK) == ITEM_CLAIM_CHECK)) {
CustomMessage msg = CustomMessage(
"Want to buy %g[[1]]%w for %y[[2]] Rupees%w?\x1B%gYes&No%w",
CustomMessage msg = CustomMessage("Want to buy %g[[1]]%w for %y[[2]] Rupees%w?\x1B%gYes&No%w",
"Möchten Sie %g[[1]]%w für %y[[2]] Rubin%w kaufen?\x1B%gJa&Nein%w",
"Voulez-vous acheter %g[[1]]%w pour %y[[2]] Rubis%w?\x1B%gOui&Non%w"
);
"Voulez-vous acheter %g[[1]]%w pour %y[[2]] Rubis%w?\x1B%gOui&Non%w");
BuildMerchantMessage(msg, RC_KAK_GRANNYS_SHOP);
msg.AutoFormat();
msg.LoadIntoFont();
@ -93,14 +89,12 @@ void BuildCarpetGuyMessage(uint16_t* textId, bool* loadFromMessageTable) {
CustomMessage msg;
if (*textId == TEXT_CARPET_SALESMAN_ARMS_DEALER) {
msg = CustomMessage("Finally! Now I can go back to being an %rarms dealer%w!",
/*german*/"Endlich! Schon bald kann ich wieder %rKrabbelminen-Händler%w sein!",
/*french*/"Squalala! Je vais enfin pouvoir %rprendre des vacances%w!");
/*german*/ "Endlich! Schon bald kann ich wieder %rKrabbelminen-Händler%w sein!",
/*french*/ "Squalala! Je vais enfin pouvoir %rprendre des vacances%w!");
} else if (!Flags_GetRandomizerInf(RAND_INF_MERCHANTS_CARPET_SALESMAN)) {
msg = CustomMessage(
"Want to buy %g[[1]]%w for %y[[2]] Rupees%w?\x1B%gYes&No%w",
msg = CustomMessage("Want to buy %g[[1]]%w for %y[[2]] Rupees%w?\x1B%gYes&No%w",
"Möchten Sie %g[[1]]%w für %y[[2]] Rubin%w kaufen?\x1B%gJa&Nein%w",
"Voulez-vous acheter %g[[1]]%w pour %y[[2]] Rubis%w?\x1B%gOui&Non%w"
);
"Voulez-vous acheter %g[[1]]%w pour %y[[2]] Rubis%w?\x1B%gOui&Non%w");
BuildMerchantMessage(msg, RC_WASTELAND_BOMBCHU_SALESMAN);
}
msg.AutoFormat();
@ -109,10 +103,9 @@ void BuildCarpetGuyMessage(uint16_t* textId, bool* loadFromMessageTable) {
}
void BuildCarpetGuyFailToBuyMessage(uint16_t* textId, bool* loadFromMessageTable) {
CustomMessage msg = CustomMessage(
"I'm sorry I can't sell you these fine specimens, they need an %rexperienced owner%w.^"
"Come back when you have had %gBombchus%w of your own."
);
CustomMessage msg =
CustomMessage("I'm sorry I can't sell you these fine specimens, they need an %rexperienced owner%w.^"
"Come back when you have had %gBombchus%w of your own.");
msg.AutoFormat();
msg.LoadIntoFont();
*loadFromMessageTable = false;
@ -124,13 +117,22 @@ void BuildScrubMessage(uint16_t* textId, bool* loadFromMessageTable) {
uint16_t price = RAND_GET_ITEM(rc)->GetPrice();
CustomMessage msg;
if (price == 0) {
msg = CustomMessage("\x12\x38\x82" "All right! You win! In return for sparing me, I will give you a %g[[1]]%w!&Please, take it!\x07\x10\xA3",
"\x12\x38\x82" "In Ordnung! Du gewinnst! Im Austausch dafür, dass Du mich verschont hast, werde ich Dir einen %g[[1]]%w geben!\x07\x10\xA3",
"\x12\x38\x82" "J'me rends! Laisse-moi partir et en échange, je te donne un %g[[1]]%w! Vas-y prends le!\x07\x10\xA3");
msg = CustomMessage(
"\x12\x38\x82"
"All right! You win! In return for sparing me, I will give you a %g[[1]]%w!&Please, take it!\x07\x10\xA3",
"\x12\x38\x82"
"In Ordnung! Du gewinnst! Im Austausch dafür, dass Du mich verschont hast, werde ich Dir einen %g[[1]]%w "
"geben!\x07\x10\xA3",
"\x12\x38\x82"
"J'me rends! Laisse-moi partir et en échange, je te donne un %g[[1]]%w! Vas-y prends le!\x07\x10\xA3");
} else {
msg = CustomMessage("\x12\x38\x82" "All right! You win! In return for sparing me, I will sell you a %g[[1]]%w! %y[[2]] Rupees%w it is!\x07\x10\xA3",
"\x12\x38\x82" "Ich gebe auf! Ich verkaufe Dir einen %g[[1]]%w für %y[[2]] Rubine%w!\x07\x10\xA3",
"\x12\x38\x82" "J'abandonne! Tu veux bien m'acheter un %g[[1]]%w? Ça fera %y[[2]] Rubis%w!\x07\x10\xA3");
msg = CustomMessage("\x12\x38\x82"
"All right! You win! In return for sparing me, I will sell you a %g[[1]]%w! %y[[2]] "
"Rupees%w it is!\x07\x10\xA3",
"\x12\x38\x82"
"Ich gebe auf! Ich verkaufe Dir einen %g[[1]]%w für %y[[2]] Rubine%w!\x07\x10\xA3",
"\x12\x38\x82"
"J'abandonne! Tu veux bien m'acheter un %g[[1]]%w? Ça fera %y[[2]] Rubis%w!\x07\x10\xA3");
}
BuildMerchantMessage(msg, rc);
msg.AutoFormat();
@ -145,12 +147,14 @@ void BuildShopMessage(uint16_t* textId, bool* loadFromMessageTable) {
// textId: TEXT_SHOP_ITEM_RANDOM + (randomizerInf - RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_1)
// textId: TEXT_SHOP_ITEM_RANDOM + ((randomizerInf - RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_1) + NUM_SHOP_ITEMS)
if (*textId >= TEXT_SHOP_ITEM_RANDOM && *textId < TEXT_SHOP_ITEM_RANDOM_CONFIRM) {
rc = OTRGlobals::Instance->gRandomizer->GetCheckFromRandomizerInf(static_cast<RandomizerInf>((*textId - TEXT_SHOP_ITEM_RANDOM) + RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_1));
rc = OTRGlobals::Instance->gRandomizer->GetCheckFromRandomizerInf(
static_cast<RandomizerInf>((*textId - TEXT_SHOP_ITEM_RANDOM) + RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_1));
msg = CustomMessage("\x08%g[[1]]%w %y[[2]]_Rupees%w&Special deal! %rONE LEFT%w!\x0A\x02",
"\x08%g[[1]]%w %y[[2]]_Rubine%w&Sonderangebot! %rNUR NOCH EINES VERFÜGBAR%w!\x0A\x02",
"\x08%g[[1]]%w %y[[2]]_Rubis%w&Offre spéciale! %rDERNIER EN STOCK%w!\x0A\x02");
} else if (*textId >= TEXT_SHOP_ITEM_RANDOM_CONFIRM && *textId <= TEXT_SHOP_ITEM_RANDOM_CONFIRM_END) {
rc = OTRGlobals::Instance->gRandomizer->GetCheckFromRandomizerInf(static_cast<RandomizerInf>((*textId - TEXT_SHOP_ITEM_RANDOM_CONFIRM) + RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_1));
rc = OTRGlobals::Instance->gRandomizer->GetCheckFromRandomizerInf(
static_cast<RandomizerInf>((*textId - TEXT_SHOP_ITEM_RANDOM_CONFIRM) + RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_1));
msg = CustomMessage("\x08%g[[1]]%w %y[[2]]_Rupees%w\x09\x1B%gBuy&Don't buy%w\x09\x02",
"\x08%g[[1]]%w %y[[2]]_Rubine%w\x09\x1B%gKaufen&Nicht kaufen%w\x09\x02",
"\x08%g[[1]]%w %y[[2]]_Rubis%w\x09\x1B%gAcheter&Ne pas acheter%w\x09\x02");

View file

@ -14,17 +14,15 @@ extern "C" {
void BuildWaterSwitchMessage(uint16_t* textId, bool* loadFromMessageTable) {
CustomMessage msg;
if (*textId == TEXT_LAKE_HYLIA_WATER_SWITCH_NAVI) {
msg = CustomMessage(
"%cThis switch is rustier than you think.^%cSomething must be wrong with the pipe system in the %bWater Temple%c.",
"%cDieser Schalter scheint rostiger zu sein als er aussieht.^%cEtwas muss mit dem Leitungssystem im %bWassertempel%c nicht stimmen.",
"%cCet interrupteur est très rouillé.^%cIl doit y avoir un problème avec la tuyauterie du %bTemple de l'Eau%c."
);
msg = CustomMessage("%cThis switch is rustier than you think.^%cSomething must be wrong with the pipe system "
"in the %bWater Temple%c.",
"%cDieser Schalter scheint rostiger zu sein als er aussieht.^%cEtwas muss mit dem "
"Leitungssystem im %bWassertempel%c nicht stimmen.",
"%cCet interrupteur est très rouillé.^%cIl doit y avoir un problème avec la tuyauterie du "
"%bTemple de l'Eau%c.");
} else if (*textId == TEXT_LAKE_HYLIA_WATER_SWITCH_SIGN) {
msg = CustomMessage(
"Water level control system.&Keep away!",
"Wasserstand Kontrollsystem&Finger weg!",
"Système de contrôle du niveau&d'eau.&Ne pas toucher!"
);
msg = CustomMessage("Water level control system.&Keep away!", "Wasserstand Kontrollsystem&Finger weg!",
"Système de contrôle du niveau&d'eau.&Ne pas toucher!");
}
msg.AutoFormat();
msg.LoadIntoFont();
@ -32,11 +30,10 @@ void BuildWaterSwitchMessage(uint16_t* textId, bool* loadFromMessageTable) {
}
void BuildShootingGalleryNoBowMessage(uint16_t* textId, bool* loadFromMessageTable) {
CustomMessage msg = CustomMessage(
"Come back when you have your own bow and you'll get a %rdifferent prize%w!",
CustomMessage msg =
CustomMessage("Come back when you have your own bow and you'll get a %rdifferent prize%w!",
"Komm wieder sobald Du Deinen eigenen Bogen hast, um einen %rspeziellen Preis%w zu erhalten!",
"J'aurai %rune autre récompense%w pour toi lorsque tu auras ton propre arc."
);
"J'aurai %rune autre récompense%w pour toi lorsque tu auras ton propre arc.");
msg.AutoFormat();
msg.LoadIntoFont();
*loadFromMessageTable = false;

View file

@ -120,34 +120,62 @@ void BuildNaviMessage(uint16_t* textId, bool* loadFromMessageTable) {
}
void RegisterNaviMessages() {
COND_ID_HOOK(OnOpenText, TEXT_NAVI_DEKU_TREE_SUMMONS, IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_CMON_BE_BRAVE, IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_VISIT_THE_PRINCESS, IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_FIND_MALONS_FATHER, IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_FIND_THE_PRINCESS, IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_WHAT_WOULD_SARIA_SAY, IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_IMPA_SAID_DEATH_MOUNTAIN, IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_USE_BOMB_FLOWER, IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_FAIRY_LIVES_ON_DEATH_MOUNTAIN, IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_SARIA_KNOWS_ABOUT_STONES, IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_RUTO_INSIDE_JABUS_BELLY, IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_COLLECTED_THREE_STONES, IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_THREW_SOMETHING_IN_MOAT, IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_CHECK_TEMPLE_OF_TIME, IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_SHOULD_WE_BELIEVE_SHEIK, IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_WHATS_GOING_ON_IN_FOREST, IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_CLOUD_OVER_DEATH_MOUNTAIN, IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_ARTIC_WIND_IS_BLOWING, IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_IRON_BOOTS_WEIGH_A_TON, IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_LOOK_FOR_SOMONE_WHO_KNOWS, IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_IT_CAME_OUT_OF_THE_WELL, IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_WHO_BUILT_THE_SPIRIT_TEMPLE, IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_HAVE_YOU_EVER_PLAYED_NOCTURNE, IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_WHERE_GANONDORF_WAS_BORN, IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_EQUIP_THE_SILVER_GAUNTLETS, IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_WHO_IS_WAITING_FOR_US, IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_SAVE_PRINCESS_ZELDA, IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_TRY_TO_KEEP_MOVING, IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_DEKU_TREE_SUMMONS,
IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_CMON_BE_BRAVE,
IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_VISIT_THE_PRINCESS,
IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_FIND_MALONS_FATHER,
IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_FIND_THE_PRINCESS,
IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_WHAT_WOULD_SARIA_SAY,
IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_IMPA_SAID_DEATH_MOUNTAIN,
IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_USE_BOMB_FLOWER,
IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_FAIRY_LIVES_ON_DEATH_MOUNTAIN,
IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_SARIA_KNOWS_ABOUT_STONES,
IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_RUTO_INSIDE_JABUS_BELLY,
IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_COLLECTED_THREE_STONES,
IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_THREW_SOMETHING_IN_MOAT,
IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_CHECK_TEMPLE_OF_TIME,
IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_SHOULD_WE_BELIEVE_SHEIK,
IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_WHATS_GOING_ON_IN_FOREST,
IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_CLOUD_OVER_DEATH_MOUNTAIN,
IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_ARTIC_WIND_IS_BLOWING,
IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_IRON_BOOTS_WEIGH_A_TON,
IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_LOOK_FOR_SOMONE_WHO_KNOWS,
IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_IT_CAME_OUT_OF_THE_WELL,
IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_WHO_BUILT_THE_SPIRIT_TEMPLE,
IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_HAVE_YOU_EVER_PLAYED_NOCTURNE,
IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_WHERE_GANONDORF_WAS_BORN,
IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_EQUIP_THE_SILVER_GAUNTLETS,
IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_WHO_IS_WAITING_FOR_US,
IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_SAVE_PRINCESS_ZELDA,
IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
COND_ID_HOOK(OnOpenText, TEXT_NAVI_TRY_TO_KEEP_MOVING,
IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi"), 1), BuildNaviMessage);
}
static RegisterShipInitFunc initFunc(RegisterNaviMessages, { CVAR_RANDOMIZER_ENHANCEMENT("RandoRelevantNavi") });

View file

@ -8,82 +8,209 @@ extern "C" {
#include "variables.h"
}
static const char* englishRupeeNames[175] = {
"[P]", "Bad RNG Rolls", "Bananas", "Beanbean Coins", "Beans",
"Beli", "Bells", "Berries", "Bison Dollars", "Bitcoin",
"Blue Essence", "Bolts", "Bones", "Boondollars", "Bottle Caps",
"Bratwürste", "Bucks", "BugFrags", "Canadian Dollars", "Cards",
"Chaos Orbs", "Clams", "Coal", "Cocoa Beans", "Coins",
"Cookies", "Copper", "Cor", "Cornflakes", "Credits",
"Crimebucks", "Crystal Shards", "Cubits", "Cucumbers", "Dalmations",
"Dampécoin", "Dark Elixir", "Darseks", "Dead Memes", "Diamonds",
"DNA", "Doge", "Dogecoin", "Doll Hairs", "Dollars",
"Dollarydoos", "Dosh", "Doubloons", "Dwarfbucks", "Elexit",
"Emeralds", "Energon", "Eris", "Ether", "Euro",
"Experience", "Extinction Points", "Floopies", "Flurbos", "FPS",
"Friends", "Frog Coins", "Gald", "Gekz", "Gems",
"Geo", "Gil", "Glimmer", "Glitches", "Gold",
"Gold Dragons", "Goober Dollars", "Green Herbs", "Greg Siblings", "Grouses",
"Gummybears", "Hell", "Hyrule Loaches", "Ice Traps", "ISK",
"Jiggies", "KF7 Ammo", "Kinstones", "Kremcoins", "Kroner",
"Leaves", "Lemmings", "Lien", "Lira", "Lumber",
"Lungmen Dollars", "Macca", "Mana", "Mann Co. Keys", "Meat",
"Meat Stacks", "Medaparts", "Meseta", "Mesetas", "Minerals",
"Monopoly Money", "Moons", "Mora", "Mumbo Tokens", "Munny",
"Mushrooms", "Mysteries", "Neopoints", "Notes", "Nuyen",
"Orbs", "Ore", "Pix", "Pixels", "Plastyks",
"Platinum", "Pokédollars", "Pokémon", "Poko", "Pokos",
"Potch", "Pounds", "Power Pellets", "Primogems", "Réals",
"Refined Metal", "Remote Mines", "Retweets", "Rhinu", "Rings",
"Riot Points", "Robux", "Rubies", "Rubles", "Runite Ore",
"Rupees", "Saint Quartz", "Septims", "Shekels", "Shillings",
"Silver", "Simoleons", "Smackaroos", "Social Credit", "Souls",
"Spent Casings", "Spice", "Spondulicks", "Spoons", "Star Bits",
"Star Chips", "Stars", "Stones of Jordan", "Store Credit", "Strawbs",
"Studs", "Super Sea Snails", "Talent", "Teef", "Telecrystals",
"Tiberium", "TokKul", "Toys", "Turnips", "Upvotes",
"V-Bucks", "Vespene Gas", "Watts", "Widgets", "Woolongs",
"World Dollars", "Wumpa Fruit", "Yen", "Zenny", "Zorkmids"
};
static const char* englishRupeeNames[175] = { "[P]",
"Bad RNG Rolls",
"Bananas",
"Beanbean Coins",
"Beans",
"Beli",
"Bells",
"Berries",
"Bison Dollars",
"Bitcoin",
"Blue Essence",
"Bolts",
"Bones",
"Boondollars",
"Bottle Caps",
"Bratwürste",
"Bucks",
"BugFrags",
"Canadian Dollars",
"Cards",
"Chaos Orbs",
"Clams",
"Coal",
"Cocoa Beans",
"Coins",
"Cookies",
"Copper",
"Cor",
"Cornflakes",
"Credits",
"Crimebucks",
"Crystal Shards",
"Cubits",
"Cucumbers",
"Dalmations",
"Dampécoin",
"Dark Elixir",
"Darseks",
"Dead Memes",
"Diamonds",
"DNA",
"Doge",
"Dogecoin",
"Doll Hairs",
"Dollars",
"Dollarydoos",
"Dosh",
"Doubloons",
"Dwarfbucks",
"Elexit",
"Emeralds",
"Energon",
"Eris",
"Ether",
"Euro",
"Experience",
"Extinction Points",
"Floopies",
"Flurbos",
"FPS",
"Friends",
"Frog Coins",
"Gald",
"Gekz",
"Gems",
"Geo",
"Gil",
"Glimmer",
"Glitches",
"Gold",
"Gold Dragons",
"Goober Dollars",
"Green Herbs",
"Greg Siblings",
"Grouses",
"Gummybears",
"Hell",
"Hyrule Loaches",
"Ice Traps",
"ISK",
"Jiggies",
"KF7 Ammo",
"Kinstones",
"Kremcoins",
"Kroner",
"Leaves",
"Lemmings",
"Lien",
"Lira",
"Lumber",
"Lungmen Dollars",
"Macca",
"Mana",
"Mann Co. Keys",
"Meat",
"Meat Stacks",
"Medaparts",
"Meseta",
"Mesetas",
"Minerals",
"Monopoly Money",
"Moons",
"Mora",
"Mumbo Tokens",
"Munny",
"Mushrooms",
"Mysteries",
"Neopoints",
"Notes",
"Nuyen",
"Orbs",
"Ore",
"Pix",
"Pixels",
"Plastyks",
"Platinum",
"Pokédollars",
"Pokémon",
"Poko",
"Pokos",
"Potch",
"Pounds",
"Power Pellets",
"Primogems",
"Réals",
"Refined Metal",
"Remote Mines",
"Retweets",
"Rhinu",
"Rings",
"Riot Points",
"Robux",
"Rubies",
"Rubles",
"Runite Ore",
"Rupees",
"Saint Quartz",
"Septims",
"Shekels",
"Shillings",
"Silver",
"Simoleons",
"Smackaroos",
"Social Credit",
"Souls",
"Spent Casings",
"Spice",
"Spondulicks",
"Spoons",
"Star Bits",
"Star Chips",
"Stars",
"Stones of Jordan",
"Store Credit",
"Strawbs",
"Studs",
"Super Sea Snails",
"Talent",
"Teef",
"Telecrystals",
"Tiberium",
"TokKul",
"Toys",
"Turnips",
"Upvotes",
"V-Bucks",
"Vespene Gas",
"Watts",
"Widgets",
"Woolongs",
"World Dollars",
"Wumpa Fruit",
"Yen",
"Zenny",
"Zorkmids" };
static const char* germanRupeeNames[65] = {
"Bananen", "Bitcoin", "Bonbons", "Bratwürste", "Brause UFOs",
"Brötchen", "Cent", "Diamanten", "Diridari", "Dogecoin",
"ECU", "Elexit", "Erz", "Erzbrocken", "Euro",
"EXP", "Forint", "Franken", "Freunde", "Gil",
"Gold", "Groschen", "Gulden", "Gummibären", "Heller",
"Juwelen", "Karolin", "Kartoffeln", "Kies", "Knete",
"Knochen", "Kohle", "Kraniche", "Kreuzer", "Kronen",
"Kronkorken", "Kröten", "Mark", "Mäuse", "Monde",
"Moorhühner", "Moos", "Münzen", "Penunze", "Pesa",
"Pfandflaschen", "Pfennig", "Pfund", "Pilze", "Plastiks",
"Pokédollar", "Radieschen", "Rappen", "Rubine", "Saphire",
"Schilling", "Seelen", "Smaragde", "Steine", "Sterne",
"Sternis", "Tael", "Taler", "Wagenchips", "Zenny"
"Bananen", "Bitcoin", "Bonbons", "Bratwürste", "Brause UFOs", "Brötchen", "Cent", "Diamanten",
"Diridari", "Dogecoin", "ECU", "Elexit", "Erz", "Erzbrocken", "Euro", "EXP",
"Forint", "Franken", "Freunde", "Gil", "Gold", "Groschen", "Gulden", "Gummibären",
"Heller", "Juwelen", "Karolin", "Kartoffeln", "Kies", "Knete", "Knochen", "Kohle",
"Kraniche", "Kreuzer", "Kronen", "Kronkorken", "Kröten", "Mark", "Mäuse", "Monde",
"Moorhühner", "Moos", "Münzen", "Penunze", "Pesa", "Pfandflaschen", "Pfennig", "Pfund",
"Pilze", "Plastiks", "Pokédollar", "Radieschen", "Rappen", "Rubine", "Saphire", "Schilling",
"Seelen", "Smaragde", "Steine", "Sterne", "Sternis", "Tael", "Taler", "Wagenchips",
"Zenny"
};
static const char* frenchRupeeNames[40] = {
"Anneaux", "Baguettes", "Balles", "Bananes", "Bitcoin",
"Blés", "Bling", "Capsules", "Centimes", "Champignons",
"Clochettes", "Crédits", "Croissants", "Diamants", "Dogecoin",
"Dollars", "Émeraudes", "Éthers", "Étoiles", "Euros",
"Florens", "Francs", "Galds", "Gils", "Grouses",
"Halos", "Joyaux", "Lunes", "Mailles", "Munnies",
"Orbes", "Orens", "Pépètes", "Pièces", "Plastyks",
"Pokédollars", "Pokémon", "Radis", "Rubis", "Zennies"
"Anneaux", "Baguettes", "Balles", "Bananes", "Bitcoin", "Blés", "Bling", "Capsules",
"Centimes", "Champignons", "Clochettes", "Crédits", "Croissants", "Diamants", "Dogecoin", "Dollars",
"Émeraudes", "Éthers", "Étoiles", "Euros", "Florens", "Francs", "Galds", "Gils",
"Grouses", "Halos", "Joyaux", "Lunes", "Mailles", "Munnies", "Orbes", "Orens",
"Pépètes", "Pièces", "Plastyks", "Pokédollars", "Pokémon", "Radis", "Rubis", "Zennies"
};
void BuildRupeeMessage(uint16_t* textId, bool *loadFromMessageTable) {
void BuildRupeeMessage(uint16_t* textId, bool* loadFromMessageTable) {
CustomMessage msg = CustomMessage(
"You found [[color]][[amount]] [[rupee]]\x05\x00!",
"Du hast [[color]][[amount]] [[rupee]]\x05\x00 gefunden!",
"Vous obtenez [[color]][[amount]] [[rupee]]\x05\x00!",
TEXTBOX_TYPE_BLACK, TEXTBOX_POS_BOTTOM
);
"You found [[color]][[amount]] [[rupee]]\x05\x00!", "Du hast [[color]][[amount]] [[rupee]]\x05\x00 gefunden!",
"Vous obtenez [[color]][[amount]] [[rupee]]\x05\x00!", TEXTBOX_TYPE_BLACK, TEXTBOX_POS_BOTTOM);
std::string color;
std::string amount;
CustomMessage rupee = CustomMessage(RandomElement(englishRupeeNames),
RandomElement(germanRupeeNames),
CustomMessage rupee = CustomMessage(RandomElement(englishRupeeNames), RandomElement(germanRupeeNames),
RandomElement(frenchRupeeNames));
switch (*textId) {
case TEXT_BLUE_RUPEE:
@ -115,10 +242,14 @@ void BuildRupeeMessage(uint16_t* textId, bool *loadFromMessageTable) {
}
void RegisterRandomRupeeNames() {
COND_ID_HOOK(OnOpenText, TEXT_BLUE_RUPEE, IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandomizeRupeeNames"), 1), BuildRupeeMessage);
COND_ID_HOOK(OnOpenText, TEXT_RED_RUPEE, IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandomizeRupeeNames"), 1), BuildRupeeMessage);
COND_ID_HOOK(OnOpenText, TEXT_PURPLE_RUPEE, IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandomizeRupeeNames"), 1), BuildRupeeMessage);
COND_ID_HOOK(OnOpenText, TEXT_HUGE_RUPEE, IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandomizeRupeeNames"), 1), BuildRupeeMessage);
COND_ID_HOOK(OnOpenText, TEXT_BLUE_RUPEE,
IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandomizeRupeeNames"), 1), BuildRupeeMessage);
COND_ID_HOOK(OnOpenText, TEXT_RED_RUPEE,
IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandomizeRupeeNames"), 1), BuildRupeeMessage);
COND_ID_HOOK(OnOpenText, TEXT_PURPLE_RUPEE,
IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandomizeRupeeNames"), 1), BuildRupeeMessage);
COND_ID_HOOK(OnOpenText, TEXT_HUGE_RUPEE,
IS_RANDO && CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("RandomizeRupeeNames"), 1), BuildRupeeMessage);
}
static RegisterShipInitFunc initFunc(RegisterRandomRupeeNames, { CVAR_RANDOMIZER_ENHANCEMENT("RandomizeRupeeNames") });

View file

@ -17,10 +17,9 @@ extern PlayState* gPlayState;
#define RAND_GET_OPTION(rsk) OTRGlobals::Instance->gRandoContext->GetOption(rsk)
#define RAND_GET_HINT(rh) OTRGlobals::Instance->gRandoContext->GetHint(rh)
#define RAND_GET_ITEM_LOC(rc) OTRGlobals::Instance->gRandoContext->GetItemLocation(rc)
#define ANY_SKULLTULA_HINTS RAND_GET_OPTION(RSK_KAK_10_SKULLS_HINT) || \
RAND_GET_OPTION(RSK_KAK_20_SKULLS_HINT) || \
RAND_GET_OPTION(RSK_KAK_30_SKULLS_HINT) || \
RAND_GET_OPTION(RSK_KAK_40_SKULLS_HINT) || \
#define ANY_SKULLTULA_HINTS \
RAND_GET_OPTION(RSK_KAK_10_SKULLS_HINT) || RAND_GET_OPTION(RSK_KAK_20_SKULLS_HINT) || \
RAND_GET_OPTION(RSK_KAK_30_SKULLS_HINT) || RAND_GET_OPTION(RSK_KAK_40_SKULLS_HINT) || \
RAND_GET_OPTION(RSK_KAK_50_SKULLS_HINT)
void BuildGanondorfHint(uint16_t* textId, bool* loadFromMessageTable) {
@ -47,7 +46,7 @@ void BuildSheikMessage(uint16_t* textId, bool* loadFromMessageTable) {
CustomMessage msg;
switch (gPlayState->sceneNum) {
case SCENE_TEMPLE_OF_TIME:
if (RAND_GET_OPTION(RSK_OOT_HINT) && !RAND_GET_ITEM_LOC(RC_SONG_FROM_OCARINA_OF_TIME)->HasObtained()){
if (RAND_GET_OPTION(RSK_OOT_HINT) && !RAND_GET_ITEM_LOC(RC_SONG_FROM_OCARINA_OF_TIME)->HasObtained()) {
msg = RAND_GET_HINT(RH_OOT_HINT)->GetHintMessage(MF_RAW);
} else if (!CHECK_DUNGEON_ITEM(DUNGEON_KEY_BOSS, SCENE_GANONS_TOWER)) {
msg = CustomMessage(
@ -55,31 +54,37 @@ void BuildSheikMessage(uint16_t* textId, bool* loadFromMessageTable) {
"@, wir treffen uns bei %gGanons Schloß%w, sobald Du den %rSchlüssel zu seinem Verlies%w hast.",
"Retrouve-moi au %gChâteau de Ganon%w une fois que tu auras obtenu la %rclé de son repaire%w.");
} else {
msg = CustomMessage(
"The time has come. Prepare yourself.",
"Die Zeit ist gekommen.&Mach Dich bereit.",
msg = CustomMessage("The time has come. Prepare yourself.", "Die Zeit ist gekommen.&Mach Dich bereit.",
"Le moment est venu @.&Tu ferais bien de te préparer.");
}
break;
case SCENE_INSIDE_GANONS_CASTLE:
if (RAND_GET_OPTION(RSK_SHEIK_LA_HINT) && INV_CONTENT(ITEM_ARROW_LIGHT) != ITEM_ARROW_LIGHT) {
msg = RAND_GET_HINT(RH_SHEIK_HINT)->GetHintMessage(MF_RAW);
} else if (!(CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_MASTER) && INV_CONTENT(ITEM_ARROW_LIGHT) == ITEM_ARROW_LIGHT &&
CUR_CAPACITY(UPG_QUIVER) >= 30 && gSaveContext.isMagicAcquired)) {
msg = CustomMessage("You are still ill-equipped to face %rGanondorf%w."
"^Seek out the %cMaster Sword%w, %rsomething to hold your arrows%w, and %gmagic%w to summon the %ylight%w.",
} else if (!(CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_MASTER) &&
INV_CONTENT(ITEM_ARROW_LIGHT) == ITEM_ARROW_LIGHT && CUR_CAPACITY(UPG_QUIVER) >= 30 &&
gSaveContext.isMagicAcquired)) {
msg = CustomMessage(
"You are still ill-equipped to face %rGanondorf%w."
"^Seek out the %cMaster Sword%w, %rsomething to hold your arrows%w, and %gmagic%w to summon the "
"%ylight%w.",
"Du bist noch nicht gewappnet um Dich %rGanondorf%w stellen zu können.^"
"Begib Dich auf die Suche nach dem %cMaster-Schwert%w, %retwas um Deinen Pfeilen einen Sinn zu geben%w,^sowie %gdie Magie%w, um das %yLicht%w herauf beschwören zu können.",
"Begib Dich auf die Suche nach dem %cMaster-Schwert%w, %retwas um Deinen Pfeilen einen Sinn zu "
"geben%w,^sowie %gdie Magie%w, um das %yLicht%w herauf beschwören zu können.",
"@, tu n'es toujours pas prêt à affronter %rGanondorf%w.^"
"Cherche l'%cÉpée de Légende%w, %rquelque chose pour ranger tes flèches%w et de la %gmagie%w pour invoquer la %ylumière%w.");
} else if (!Flags_GetEventChkInf(EVENTCHKINF_DISPELLED_GANONS_TOWER_BARRIER) && !RAND_GET_OPTION(RSK_TRIAL_COUNT).Is(0)){
"Cherche l'%cÉpée de Légende%w, %rquelque chose pour ranger tes flèches%w et de la %gmagie%w pour "
"invoquer la %ylumière%w.");
} else if (!Flags_GetEventChkInf(EVENTCHKINF_DISPELLED_GANONS_TOWER_BARRIER) &&
!RAND_GET_OPTION(RSK_TRIAL_COUNT).Is(0)) {
msg = CustomMessage(
"You may have what you need to defeat %rthe Evil King%w, but the %cbarrier%w still stands.^Complete the remaining %gtrials%w to destroy it.",
"Du magst das haben, was Du brauchst um %rden bösen König%w zu besiegen, aber die %cBarriere%w steht noch.^Absolviere die verbleibenden %gPrüfungen%w um sie zu zerstören.",
"@, tu as peut-être ce qu'il te faut pour vaincre %rle Malin%w, mais les barrières sont toujours actives.^Termine les épreuves restantes pour les détruire.");
"You may have what you need to defeat %rthe Evil King%w, but the %cbarrier%w still "
"stands.^Complete the remaining %gtrials%w to destroy it.",
"Du magst das haben, was Du brauchst um %rden bösen König%w zu besiegen, aber die %cBarriere%w "
"steht noch.^Absolviere die verbleibenden %gPrüfungen%w um sie zu zerstören.",
"@, tu as peut-être ce qu'il te faut pour vaincre %rle Malin%w, mais les barrières sont toujours "
"actives.^Termine les épreuves restantes pour les détruire.");
} else {
msg = CustomMessage(
"If you're ready, then proceed.^Good luck.",
msg = CustomMessage("If you're ready, then proceed.^Good luck.",
"Wenn Du bereit bist, so schreite&voran.^Viel Glück.",
"Si tu es prêt, tu peux y aller.^Bonne chance.");
}
@ -149,8 +154,7 @@ void BuildMysteriousWarpMessage() {
CustomMessage msg = CustomMessage(
"Warp to&%ra mysterious place?%w&" + CustomMessage::TWO_WAY_CHOICE() + "%gOK&No%w",
"Zu&%reinem mysteriösen Ort%w?&" + CustomMessage::TWO_WAY_CHOICE() + "%gOK&No%w",
"Se téléporter vers&%run endroit mystérieux%w?&" + CustomMessage::TWO_WAY_CHOICE() + "%rOK!&Non%w"
);
"Se téléporter vers&%run endroit mystérieux%w?&" + CustomMessage::TWO_WAY_CHOICE() + "%rOK!&Non%w");
msg.LoadIntoFont();
}
@ -238,18 +242,17 @@ void BuildFishingPoleHintMessage(uint16_t* textId, bool* loadFromMessageTable) {
}
CustomMessage msg = CustomMessage(
"Sorry, but the pond is closed.&I've lost my good %rfishing pole%w...&Can't go fishing without it!",
"Entschuldigung, aber der Teich ist zu.&Ich habe meine gute %rAngelrute%w verloren.&Ohne kann ich nicht fischen!",
"Désolé, mais l'étang est fermé.&J'ai perdu ma bonne %rCanne à Pêche%w...&Impossible de pêcher sans elle!"
);
"Entschuldigung, aber der Teich ist zu.&Ich habe meine gute %rAngelrute%w verloren.&Ohne kann ich nicht "
"fischen!",
"Désolé, mais l'étang est fermé.&J'ai perdu ma bonne %rCanne à Pêche%w...&Impossible de pêcher sans elle!");
if (RAND_GET_OPTION(RSK_FISHING_POLE_HINT)) {
msg = msg + RAND_GET_HINT(RH_FISHING_POLE)->GetHintMessage();
}
if (*textId == TEXT_FISHING_POND_START_MET) {
msg = CustomMessage(
"Hey, mister! I remember you!&It's been a long time!^",
msg = CustomMessage("Hey, mister! I remember you!&It's been a long time!^",
"Hallo, mein Herr! Ich erinnere mich an Sie!&Lang ist's her!",
"Hé, monsieur! Je me souviens de toi!&Ça fait longtemps!"
) + msg;
"Hé, monsieur! Je me souviens de toi!&Ça fait longtemps!") +
msg;
}
msg.AutoFormat();
msg.LoadIntoFont();
@ -273,7 +276,7 @@ void BuildBiggoronHintMessage(uint16_t* textId, bool* loadFromMessageTable) {
*loadFromMessageTable = false;
}
void BuildBigPoesHintMessage(uint16_t * textId, bool* loadFromMessageTable) {
void BuildBigPoesHintMessage(uint16_t* textId, bool* loadFromMessageTable) {
CustomMessage msg = RAND_GET_HINT(RH_BIGGORON_HINT)->GetHintMessage(MF_AUTO_FORMAT);
msg.LoadIntoFont();
*loadFromMessageTable = false;
@ -340,9 +343,10 @@ void RegisterStaticHints() {
// Altar
COND_ID_HOOK(OnOpenText, TEXT_ALTAR_CHILD, IS_RANDO, BuildChildAltarMessage);
COND_ID_HOOK(OnOpenText, TEXT_ALTAR_ADULT, IS_RANDO, BuildAdultAltarMessage);
//Skulltula
// Skulltula
COND_ID_HOOK(OnOpenText, TEXT_SKULLTULA_PEOPLE_IM_CURSED, ANY_SKULLTULA_HINTS, BuildSkulltulaPeopleMessage);
COND_ID_HOOK(OnOpenText, TEXT_SKULLTULA_PEOPLE_MAKE_YOU_VERY_RICH, RAND_GET_OPTION(RSK_KAK_100_SKULLS_HINT), Build100SkullsHintMessage);
COND_ID_HOOK(OnOpenText, TEXT_SKULLTULA_PEOPLE_MAKE_YOU_VERY_RICH, RAND_GET_OPTION(RSK_KAK_100_SKULLS_HINT),
Build100SkullsHintMessage);
// Dampe's Diary
COND_ID_HOOK(OnOpenText, TEXT_DAMPES_DIARY, RAND_GET_OPTION(RSK_DAMPES_DIARY_HINT), BuildDampesDiaryMessage);
// Chest Game
@ -352,9 +356,12 @@ void RegisterStaticHints() {
// Warp
COND_ID_HOOK(OnOpenText, TEXT_WARP_MINUET_OF_FOREST, RAND_GET_OPTION(RSK_WARP_SONG_HINTS), BuildMinuetWarpMessage);
COND_ID_HOOK(OnOpenText, TEXT_WARP_BOLERO_OF_FIRE, RAND_GET_OPTION(RSK_WARP_SONG_HINTS), BuildBoleroWarpMessage);
COND_ID_HOOK(OnOpenText, TEXT_WARP_SERENADE_OF_WATER, RAND_GET_OPTION(RSK_WARP_SONG_HINTS), BuildSerenadeWarpMessage);
COND_ID_HOOK(OnOpenText, TEXT_WARP_REQUIEM_OF_SPIRIT, RAND_GET_OPTION(RSK_WARP_SONG_HINTS), BuildRequiemWarpMessage);
COND_ID_HOOK(OnOpenText, TEXT_WARP_NOCTURNE_OF_SHADOW, RAND_GET_OPTION(RSK_WARP_SONG_HINTS), BuildNocturneWarpMessage);
COND_ID_HOOK(OnOpenText, TEXT_WARP_SERENADE_OF_WATER, RAND_GET_OPTION(RSK_WARP_SONG_HINTS),
BuildSerenadeWarpMessage);
COND_ID_HOOK(OnOpenText, TEXT_WARP_REQUIEM_OF_SPIRIT, RAND_GET_OPTION(RSK_WARP_SONG_HINTS),
BuildRequiemWarpMessage);
COND_ID_HOOK(OnOpenText, TEXT_WARP_NOCTURNE_OF_SHADOW, RAND_GET_OPTION(RSK_WARP_SONG_HINTS),
BuildNocturneWarpMessage);
COND_ID_HOOK(OnOpenText, TEXT_WARP_PRELUDE_OF_LIGHT, RAND_GET_OPTION(RSK_WARP_SONG_HINTS), BuildPreludeWarpMessage);
// Frogs
COND_ID_HOOK(OnOpenText, TEXT_FROGS_UNDERWATER, RAND_GET_OPTION(RSK_FROGS_HINT), BuildFrogsHintMessage);
@ -365,10 +372,13 @@ void RegisterStaticHints() {
COND_ID_HOOK(OnOpenText, TEXT_FISHING_GOOD_FISHERMAN, RAND_GET_OPTION(RSK_LOACH_HINT), BuildLoachHintMessage);
COND_ID_HOOK(OnOpenText, TEXT_FISHING_DIFFERENT_POND, RAND_GET_OPTION(RSK_LOACH_HINT), BuildLoachHintMessage);
COND_ID_HOOK(OnOpenText, TEXT_FISHING_SCRATCHING, RAND_GET_OPTION(RSK_LOACH_HINT), BuildLoachHintMessage);
COND_ID_HOOK(OnOpenText, TEXT_FISHING_TRY_ANOTHER_LURE_WITH_SINKING_LURE, RAND_GET_OPTION(RSK_LOACH_HINT), BuildLoachHintMessage);
COND_ID_HOOK(OnOpenText, TEXT_FISHING_TRY_ANOTHER_LURE_WITH_SINKING_LURE, RAND_GET_OPTION(RSK_LOACH_HINT),
BuildLoachHintMessage);
// Fishing Pole
COND_ID_HOOK(OnOpenText, TEXT_FISHING_POND_START, RAND_GET_OPTION(RSK_SHUFFLE_FISHING_POLE), BuildFishingPoleHintMessage);
COND_ID_HOOK(OnOpenText, TEXT_FISHING_POND_START_MET, RAND_GET_OPTION(RSK_SHUFFLE_FISHING_POLE), BuildFishingPoleHintMessage);
COND_ID_HOOK(OnOpenText, TEXT_FISHING_POND_START, RAND_GET_OPTION(RSK_SHUFFLE_FISHING_POLE),
BuildFishingPoleHintMessage);
COND_ID_HOOK(OnOpenText, TEXT_FISHING_POND_START_MET, RAND_GET_OPTION(RSK_SHUFFLE_FISHING_POLE),
BuildFishingPoleHintMessage);
// Saria
COND_ID_HOOK(OnOpenText, TEXT_SARIA_SFM, RAND_GET_OPTION(RSK_SARIA_HINT), BuildSariaMessage);
COND_ID_HOOK(OnOpenText, TEXT_SARIAS_SONG_FACE_TO_FACE, RAND_GET_OPTION(RSK_SARIA_HINT), BuildSariaMessage);
@ -386,29 +396,41 @@ void RegisterStaticHints() {
COND_ID_HOOK(OnOpenText, TEXT_SARIAS_SONG_IMPRISON_GANONDORF, RAND_GET_OPTION(RSK_SARIA_HINT), BuildSariaMessage);
COND_ID_HOOK(OnOpenText, TEXT_SARIAS_SONG_CHANNELING_POWER, RAND_GET_OPTION(RSK_SARIA_HINT), BuildSariaMessage);
// Biggoron
COND_ID_HOOK(OnOpenText, TEXT_BIGGORON_BETTER_AT_SMITHING, RAND_GET_OPTION(RSK_BIGGORON_HINT), BuildBiggoronHintMessage);
COND_ID_HOOK(OnOpenText, TEXT_BIGGORON_WAITING_FOR_YOU, RAND_GET_OPTION(RSK_BIGGORON_HINT), BuildBiggoronHintMessage);
COND_ID_HOOK(OnOpenText, TEXT_BIGGORON_RETURN_AFTER_A_FEW_DAYS, RAND_GET_OPTION(RSK_BIGGORON_HINT), BuildBiggoronHintMessage);
COND_ID_HOOK(OnOpenText, TEXT_BIGGORON_I_MAAAADE_THISSSS, RAND_GET_OPTION(RSK_BIGGORON_HINT), BuildBiggoronHintMessage);
COND_ID_HOOK(OnOpenText, TEXT_BIGGORON_BETTER_AT_SMITHING, RAND_GET_OPTION(RSK_BIGGORON_HINT),
BuildBiggoronHintMessage);
COND_ID_HOOK(OnOpenText, TEXT_BIGGORON_WAITING_FOR_YOU, RAND_GET_OPTION(RSK_BIGGORON_HINT),
BuildBiggoronHintMessage);
COND_ID_HOOK(OnOpenText, TEXT_BIGGORON_RETURN_AFTER_A_FEW_DAYS, RAND_GET_OPTION(RSK_BIGGORON_HINT),
BuildBiggoronHintMessage);
COND_ID_HOOK(OnOpenText, TEXT_BIGGORON_I_MAAAADE_THISSSS, RAND_GET_OPTION(RSK_BIGGORON_HINT),
BuildBiggoronHintMessage);
// Big Poes
COND_ID_HOOK(OnOpenText, TEXT_GHOST_SHOP_EXPLAINATION, RAND_GET_OPTION(RSK_BIG_POES_HINT), BuildBigPoesHintMessage);
COND_ID_HOOK(OnOpenText, TEXT_GHOST_SHOP_CARD_HAS_POINTS, RAND_GET_OPTION(RSK_BIG_POES_HINT), BuildBigPoesHintMessage);
COND_ID_HOOK(OnOpenText, TEXT_GHOST_SHOP_CARD_HAS_POINTS, RAND_GET_OPTION(RSK_BIG_POES_HINT),
BuildBigPoesHintMessage);
// Anju
COND_ID_HOOK(OnOpenText, TEXT_ANJU_PLEASE_BRING_MY_CUCCOS_BACK, RAND_GET_OPTION(RSK_CHICKENS_HINT), BuildChickensHintMessage);
COND_ID_HOOK(OnOpenText, TEXT_ANJU_PLEASE_BRING_4_CUCCOS, RAND_GET_OPTION(RSK_CHICKENS_HINT), BuildChickensHintMessage);
COND_ID_HOOK(OnOpenText, TEXT_ANJU_PLEASE_BRING_3_CUCCOS, RAND_GET_OPTION(RSK_CHICKENS_HINT), BuildChickensHintMessage);
COND_ID_HOOK(OnOpenText, TEXT_ANJU_PLEASE_BRING_2_CUCCOS, RAND_GET_OPTION(RSK_CHICKENS_HINT), BuildChickensHintMessage);
COND_ID_HOOK(OnOpenText, TEXT_ANJU_PLEASE_BRING_1_CUCCO, RAND_GET_OPTION(RSK_CHICKENS_HINT), BuildChickensHintMessage);
COND_ID_HOOK(OnOpenText, TEXT_ANJU_PLEASE_BRING_MY_CUCCOS_BACK, RAND_GET_OPTION(RSK_CHICKENS_HINT),
BuildChickensHintMessage);
COND_ID_HOOK(OnOpenText, TEXT_ANJU_PLEASE_BRING_4_CUCCOS, RAND_GET_OPTION(RSK_CHICKENS_HINT),
BuildChickensHintMessage);
COND_ID_HOOK(OnOpenText, TEXT_ANJU_PLEASE_BRING_3_CUCCOS, RAND_GET_OPTION(RSK_CHICKENS_HINT),
BuildChickensHintMessage);
COND_ID_HOOK(OnOpenText, TEXT_ANJU_PLEASE_BRING_2_CUCCOS, RAND_GET_OPTION(RSK_CHICKENS_HINT),
BuildChickensHintMessage);
COND_ID_HOOK(OnOpenText, TEXT_ANJU_PLEASE_BRING_1_CUCCO, RAND_GET_OPTION(RSK_CHICKENS_HINT),
BuildChickensHintMessage);
// Malon
COND_ID_HOOK(OnOpenText, TEXT_MALON_EVERYONE_TURNING_EVIL, RAND_GET_OPTION(RSK_MALON_HINT), BuildMalonHintMessage);
COND_ID_HOOK(OnOpenText, TEXT_MALON_I_SING_THIS_SONG, RAND_GET_OPTION(RSK_MALON_HINT), BuildMalonHintMessage);
COND_ID_HOOK(OnOpenText, TEXT_MALON_HOW_IS_EPONA_DOING, RAND_GET_OPTION(RSK_MALON_HINT), BuildMalonHintMessage);
COND_ID_HOOK(OnOpenText, TEXT_MALON_OBSTICLE_COURSE, RAND_GET_OPTION(RSK_MALON_HINT), BuildMalonHintMessage);
COND_ID_HOOK(OnOpenText, TEXT_MALON_INGO_MUST_HAVE_BEEN_TEMPTED, RAND_GET_OPTION(RSK_MALON_HINT), BuildMalonHintMessage);
COND_ID_HOOK(OnOpenText, TEXT_MALON_INGO_MUST_HAVE_BEEN_TEMPTED, RAND_GET_OPTION(RSK_MALON_HINT),
BuildMalonHintMessage);
// Horseback Archery
COND_ID_HOOK(OnOpenText, TEXT_GF_HBA_SIGN, RAND_GET_OPTION(RSK_HBA_HINT), BuildHorsebackArcheryMessage);
COND_ID_HOOK(OnOpenText, TEXT_HBA_NOT_ON_HORSE, RAND_GET_OPTION(RSK_HBA_HINT), BuildHorsebackArcheryMessage);
COND_ID_HOOK(OnOpenText, TEXT_HBA_INITIAL_EXPLAINATION, RAND_GET_OPTION(RSK_HBA_HINT), BuildHorsebackArcheryMessage);
COND_ID_HOOK(OnOpenText, TEXT_HBA_INITIAL_EXPLAINATION, RAND_GET_OPTION(RSK_HBA_HINT),
BuildHorsebackArcheryMessage);
COND_ID_HOOK(OnOpenText, TEXT_HBA_ALREADY_HAVE_1000, RAND_GET_OPTION(RSK_HBA_HINT), BuildHorsebackArcheryMessage);
// Mask Shop Sign
COND_ID_HOOK(OnOpenText, TEXT_MASK_SHOP_SIGN, RAND_GET_OPTION(RSK_MASK_SHOP_HINT), BuildMaskShopSignMessage);

View file

@ -3971,7 +3971,7 @@ void RandomizerSettingsWindow::UpdateElement() {
}
}
class ExtendedVanillaTableInvalidItemIdException: public std::exception {
class ExtendedVanillaTableInvalidItemIdException : public std::exception {
private:
s16 itemID;