diff --git a/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp b/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp index 92c13e85f..8c71fb023 100644 --- a/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp +++ b/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp @@ -3,7 +3,9 @@ #include #include #include -#include +#include +#include +#include using namespace std::literals::string_literals; @@ -14,9 +16,10 @@ static const std::unordered_map textBoxSpecialCharacters = { { "è", 0x95 }, { "é", 0x96 }, { "ê", 0x97 }, { "ë", 0x98 }, { "ï", 0x99 }, { "ô", 0x9A }, { "ö", 0x9B }, { "ù", 0x9C }, { "û", 0x9D }, { "ü", 0x9E } }; -static const std::unordered_map colors = { { "w", QM_WHITE }, { "r", QM_RED }, { "g", QM_GREEN }, +static const std::unordered_map percentColors = { { "w", QM_WHITE }, { "r", QM_RED }, { "g", QM_GREEN }, { "b", QM_BLUE }, { "c", QM_LBLUE }, { "p", QM_PINK }, { "y", QM_YELLOW }, { "B", QM_BLACK } }; + static const std::unordered_map altarIcons = { { "0", ITEM_KOKIRI_EMERALD }, { "1", ITEM_GORON_RUBY }, @@ -33,61 +36,190 @@ static const std::unordered_map altarIcons = { { "c", ITEM_OCARINA_FAIRY }, { "i", ITEM_OCARINA_TIME }, { "L", ITEM_BOW_ARROW_LIGHT }, - { "k", ITEM_TUNIC_KOKIRI } + { "k", ITEM_TUNIC_KOKIRI }, + { "m", ITEM_DUNGEON_MAP }, + { "C", ITEM_COMPASS }, + { "s", ITEM_SKULL_TOKEN }, + { "g", ITEM_MASK_GORON } +}; + +static std::map pixelWidthTable = { + { " ", 6 }, { "!", 6 }, { "\"", 5 }, { "#", 7 }, { "$", 7 }, { "%", 11 }, { "&", 9 }, { "\'", 3 }, + { "(", 6 }, { ")", 6 }, { "*", 6 }, { "+", 7 }, { ",", 3 }, { "-", 5 }, { ".", 3 }, { "/", 7 }, + { "0", 8 }, { "1", 4 }, { "2", 7 }, { "3", 7 }, { "4", 8 }, { "5", 7 }, { "6", 7 }, { "7", 7 }, + { "8", 7 }, { "9", 7 }, { ":", 5 }, { ";", 5 }, { "<", 7 }, { "=", 9 }, { ">", 7 }, { "?", 9 }, + { "@", 10 }, { "A", 9 }, { "B", 7 }, { "C", 9 }, { "D", 9 }, { "E", 6 }, { "F", 6 }, { "G", 9 }, + { "H", 8 }, { "I", 3 }, { "J", 6 }, { "K", 8 }, { "L", 6 }, { "M", 10 }, { "N", 9 }, { "O", 10 }, + { "P", 7 }, { "Q", 10 }, { "R", 8 }, { "S", 8 }, { "T", 7 }, { "U", 8 }, { "V", 9 }, { "W", 12 }, + { "X", 9 }, { "Y", 8 }, { "Z", 8 }, { "[", 6 }, { "\\", 8 }, { "]", 6 }, { "^", 8 }, { "_", 7 }, + { "`", 4 }, { "a", 6 }, { "b", 7 }, { "c", 6 }, { "d", 7 }, { "e", 7 }, { "f", 5 }, { "g", 7 }, + { "h", 6 }, { "i", 3 }, { "j", 5 }, { "k", 6 }, { "l", 3 }, { "m", 9 }, { "n", 7 }, { "o", 7 }, + { "p", 7 }, { "q", 7 }, { "r", 6 }, { "s", 6 }, { "t", 6 }, { "u", 6 }, { "v", 7 }, { "w", 9 }, + { "x", 6 }, { "y", 7 }, { "z", 6 }, { "{", 6 }, { "¦", 4 }, { "}", 6 }, { "¡", 5 }, { "¢", 7 }, + { "£", 8 }, { "¤", 7 }, { "¥", 8 }, { "|", 4 }, { "§", 12 }, { "¨", 12 }, { "©", 10 }, { "ª", 5 }, + { "«", 8 }, { "¬", 7 }, { "\u00AD", 6 }, { "®", 10 }, { "¯", 8 }, { "°", 12 }, { "±", 12 }, { "²", 5 }, + { "³", 5 }, { "µ", 6 }, { "¶", 8 }, { "·", 4 }, { "¹", 4 }, { "º", 5 }, { "»", 9 }, { "¼", 9 }, + { "½", 9 }, { "¾", 10 }, { "¿", 7 }, { "À", 11 }, { "Á", 9 }, { "Â", 9 }, { "Ã", 9 }, { "Ä", 9 }, + { "Å", 9 }, { "Æ", 12 }, { "Ç", 9 }, { "È", 6 }, { "É", 6 }, { "Ê", 6 }, { "Ë", 6 }, { "Ì", 5 }, + { "Í", 5 }, { "Î", 5 }, { "Ï", 5 }, { "Ð", 10 }, { "Ñ", 9 }, { "Ò", 10 }, { "Ó", 10 }, { "Ô", 10 }, + { "Õ", 10 }, { "Ö", 10 }, { "×", 9 }, { "Ø", 10 }, { "Ù", 8 }, { "Ú", 8 }, { "Û", 8 }, { "Ü", 8 }, + { "Ý", 10 }, { "Þ", 8 }, { "ß", 7 }, { "à", 6 }, { "á", 6 }, { "â", 6 }, { "ã", 6 }, { "ä", 6 }, + { "å", 6 }, { "æ", 11 }, { "ç", 6 }, { "è", 7 }, { "é", 7 }, { "ê", 7 }, { "ë", 7 }, { "ì", 5 }, + { "í", 5 }, { "î", 5 }, { "ï", 5 }, { "ð", 7 }, { "ñ", 7 }, { "ò", 7 }, { "ó", 7 }, { "ô", 7 }, + { "õ", 7 }, { "ö", 7 }, { "÷", 11 }, { "ø", 9 }, { "ù", 7 }, { "ú", 7 }, { "û", 7 }, { "ü", 7 }, + { "ý", 8 }, { "þ", 8 }, { "ÿ", 8 }, { "Œ", 11 }, { "œ", 11 }, { "„", 5 }, { "”", 5 }, { "€", 10 }, + { "Ÿ", 10 }, { "~", 8 } }; CustomMessage::CustomMessage(std::string english_, std::string german_, std::string french_, TextBoxType type_, TextBoxPosition position_) - : english(std::move(english_)), german(std::move(german_)), french(std::move(french_)), type(type_), - position(position_) { + : type(type_), position(position_){ + messages[LANGUAGE_ENG] = std::move(english_); + messages[LANGUAGE_GER] = std::move(german_); + messages[LANGUAGE_FRA] = std::move(french_); +} + +CustomMessage::CustomMessage(std::string english_, std::string german_, std::string french_, std::vector colors_, + std::vector capital_, TextBoxType type_, TextBoxPosition position_) { + messages[LANGUAGE_ENG] = std::move(english_); + messages[LANGUAGE_GER] = std::move(german_); + messages[LANGUAGE_FRA] = std::move(french_); + colors = colors_; + capital = capital_; + type = type_; + position = position_; +} + +CustomMessage::CustomMessage(std::string english_, TextBoxType type_, TextBoxPosition position_) + : type(type_), position(position_) { + messages[LANGUAGE_ENG] = std::move(english_); +} + +CustomMessage::CustomMessage(std::string english_, std::vector colors_, std::vector capital_, TextBoxType type_, TextBoxPosition position_){ + messages[LANGUAGE_ENG] = std::move(english_); + colors = colors_; + capital = capital_; + type = type_; + position = position_; } CustomMessage::CustomMessage(Text text, TextBoxType type_,TextBoxPosition position_) - : english(text.GetEnglish()), german(text.GetGerman()), french(text.GetFrench()), type(type_), - position(position_) { + : type(type_), position(position_) { + messages[LANGUAGE_ENG] = text.GetEnglish(); + messages[LANGUAGE_GER] = text.GetGerman(); + messages[LANGUAGE_FRA] = text.GetFrench(); } -const std::string& CustomMessage::GetEnglish() const { - return english; +const std::string CustomMessage::GetEnglish(MessageFormat format) const { + return GetForLanguage(LANGUAGE_ENG, format); } -const std::string& CustomMessage::GetFrench() const { - if (french.length() > 0) { - return french; - } - return english; +const std::string CustomMessage::GetGerman(MessageFormat format) const { + return GetForLanguage(LANGUAGE_GER, format); } -const std::string& CustomMessage::GetGerman() const { - if (german.length() > 0) { - return german; + +const std::string CustomMessage::GetFrench(MessageFormat format) const { + return GetForLanguage(LANGUAGE_FRA, format); +} + +const std::string CustomMessage::GetForCurrentLanguage(MessageFormat format) const { + return GetForLanguage(gSaveContext.language, format); +} + +const std::string CustomMessage::GetForLanguage(uint8_t language, MessageFormat format) const { + std::string output = messages[language].length() > 0 ? messages[language] : messages[LANGUAGE_ENG]; + ProcessMessageFormat(output, format); + return output; +} + +const std::vector CustomMessage::GetAllMessages(MessageFormat format) const{ + std::vector output = messages; + for (auto str : output){ + ProcessMessageFormat(str, format); } - return english; + return output; +} + +void CustomMessage::ProcessMessageFormat(std::string& str, MessageFormat format) const { + if (format == MF_FORMATTED){ + FormatString(str); + } else if (format == MF_CLEAN){ + CleanString(str); + } else if (format == MF_AUTO_FORMAT){ + AutoFormatString(str); + } +} + +const std::vector& CustomMessage::GetCapital() const { + return capital; +} + +void CustomMessage::SetCapital(std::vector capital_){ + capital = capital_; +} +const std::vector& CustomMessage::GetColors() const { + return colors; +} + +void CustomMessage::SetColors(std::vector colors_){ + colors = colors_; } const TextBoxType& CustomMessage::GetTextBoxType() const { return type; } +void CustomMessage::SetTextBoxType(TextBoxType boxType){ + type = boxType; +} + const TextBoxPosition& CustomMessage::GetTextBoxPosition() const { return position; } CustomMessage CustomMessage::operator+(const CustomMessage& right) const { - return CustomMessage(english + right.GetEnglish(), german + right.GetGerman(), french + right.GetFrench()); + std::vector newColors = colors; + std::vector rColors = right.GetColors(); + for (auto color: rColors){ + newColors.push_back(color); + } + std::vector newCapital = capital; + newCapital.insert(capital.end(), right.GetCapital().begin(), right.GetCapital().end()); + return CustomMessage(messages[LANGUAGE_ENG] + right.GetEnglish(MF_RAW), + messages[LANGUAGE_GER] + right.GetGerman(MF_RAW), + messages[LANGUAGE_FRA] + right.GetFrench(MF_RAW), + newColors, newCapital, type, position); } CustomMessage CustomMessage::operator+(const std::string& right) const { - return CustomMessage(english + right, german + right, french + right); + return CustomMessage(messages[LANGUAGE_ENG] + right, messages[LANGUAGE_GER] + right, messages[LANGUAGE_FRA] + right); +} + +void CustomMessage::operator+=(const CustomMessage& right) { + messages[LANGUAGE_ENG] += right.GetEnglish(MF_RAW); + messages[LANGUAGE_GER] += right.GetGerman(MF_RAW); + messages[LANGUAGE_FRA] += right.GetFrench(MF_RAW); + colors.insert(colors.end(), right.GetColors().begin(), right.GetColors().end()); + capital.insert(capital.end(), right.GetCapital().begin(), right.GetCapital().end()); } void CustomMessage::operator+=(const std::string& right) { - english += right; - french += right; - german += right; + messages[LANGUAGE_ENG] += right; + messages[LANGUAGE_GER] += right; + messages[LANGUAGE_FRA] += right; } bool CustomMessage::operator==(const CustomMessage& operand) const { - return english == operand.english; + return messages[LANGUAGE_ENG] == operand.messages[LANGUAGE_ENG]; +} + +bool CustomMessage::operator==(const std::string& operand) const { + for (auto str: messages){ + if (str == operand){ + return true; + } + } + return false; } bool CustomMessage::operator!=(const CustomMessage& operand) const { @@ -95,83 +227,209 @@ bool CustomMessage::operator!=(const CustomMessage& operand) const { } void CustomMessage::Replace(std::string&& oldStr, std::string&& newStr) { - for (std::string* str : { &english, &french, &german }) { - size_t position = str->find(oldStr); + for (std::string& str : messages) { + size_t position = str.find(oldStr); while (position != std::string::npos) { - str->replace(position, oldStr.length(), newStr); - position = str->find(oldStr); + str.replace(position, oldStr.length(), newStr); + position = str.find(oldStr); } } - Format(); } -void CustomMessage::Replace(std::string&& oldStr, std::string&& newEnglish, std::string&& newGerman, - std::string&& newFrench) { - size_t position = 0; - position = english.find(oldStr); - while (position != std::string::npos) { - english.replace(position, oldStr.length(), newEnglish); - position = english.find(oldStr); +void CustomMessage::Replace(std::string&& oldStr, CustomMessage newMessage) { + for (uint8_t language = 0; language < LANGUAGE_MAX; language++) { + size_t position = messages[language].find(oldStr); + while (position != std::string::npos) { + messages[language].replace(position, oldStr.length(), newMessage.messages[language]); + position = messages[language].find(oldStr); + } } - position = french.find(oldStr); - while (position != std::string::npos) { - french.replace(position, oldStr.length(), newFrench); - position = french.find(oldStr); - } - position = german.find(oldStr); - while (position != std::string::npos) { - german.replace(position, oldStr.length(), newGerman); - position = german.find(oldStr); - } - Format(); } void CustomMessage::Format(ItemID iid) { - for (std::string* str : { &english, &french, &german }) { - str->insert(0, ITEM_OBTAINED(iid)); + for (std::string &str : messages) { + str.insert(0, ITEM_OBTAINED(iid)); size_t start_pos = 0; - std::replace(str->begin(), str->end(), '&', NEWLINE()[0]); - while ((start_pos = str->find('^', start_pos)) != std::string::npos) { - str->replace(start_pos, 1, WAIT_FOR_INPUT() + ITEM_OBTAINED(iid)); + std::replace(str.begin(), str.end(), '&', NEWLINE()[0]); + while ((start_pos = str.find('^', start_pos)) != std::string::npos) { + str.replace(start_pos, 1, WAIT_FOR_INPUT() + ITEM_OBTAINED(iid)); start_pos += 3; } - std::replace(str->begin(), str->end(), '@', PLAYER_NAME()[0]); + std::replace(str.begin(), str.end(), '@', PLAYER_NAME()[0]); + ReplaceSpecialCharacters(str); + ReplaceColors(str); + ReplaceAltarIcons(str); } - ReplaceSpecialCharacters(); - ReplaceColors(); - ReplaceAltarIcons(); *this += MESSAGE_END(); } void CustomMessage::Format() { - for (std::string* str : { &english, &french, &german }) { - std::replace(str->begin(), str->end(), '&', NEWLINE()[0]); - std::replace(str->begin(), str->end(), '^', WAIT_FOR_INPUT()[0]); - std::replace(str->begin(), str->end(), '@', PLAYER_NAME()[0]); + for (std::string& str : messages) { + FormatString(str); } - ReplaceSpecialCharacters(); - ReplaceColors(); - ReplaceAltarIcons(); - *this += MESSAGE_END(); } +void CustomMessage::AutoFormat() { + for (std::string& str : messages) { + AutoFormatString(str); + } +} + +void CustomMessage::Clean() { + for (std::string& str : messages) { + CleanString(str); + } +} + +void CustomMessage::FormatString(std::string& str) const { + std::replace(str.begin(), str.end(), '&', NEWLINE()[0]); + std::replace(str.begin(), str.end(), '^', WAIT_FOR_INPUT()[0]); + std::replace(str.begin(), str.end(), '@', PLAYER_NAME()[0]); + ReplaceSpecialCharacters(str); + ReplaceColors(str); + ReplaceAltarIcons(str); + str += MESSAGE_END(); +} + +void DeleteControlCode(std::string& str, std::string code){ + size_t start_pos = 0; + while ((start_pos = str.find(code, start_pos)) != std::string::npos) { + str.replace(start_pos, code.length(), ""); + start_pos += code.length(); + } +} + +void CustomMessage::CleanString(std::string& str) const { + std::replace(str.begin(), str.end(), '&', "\n"[0]); + std::replace(str.begin(), str.end(), '^', " "[0]); + for (const auto& colorPair : percentColors) { + DeleteControlCode(str, "%" + colorPair.first); + } + std::erase(str, '#'); + for (const auto& iconPair : altarIcons) { + DeleteControlCode(str, "$" + iconPair.first); + } +} + +static size_t NextLineLength(const std::string* textStr, const size_t lastNewline, bool hasIcon = false) { + const size_t maxLinePixelWidth = hasIcon ? 200 : 216; + + + size_t totalPixelWidth = 0; + size_t currentPos = lastNewline; + + // Looping through the string from the lastNewline until the total + // width of counted characters exceeds the maximum pixels in a line. + size_t nextPosJump = 0; + while (totalPixelWidth < maxLinePixelWidth && currentPos < textStr->length()) { + // Skip over control codes + if (textStr->at(currentPos) == '%') { + nextPosJump = 2; + } else if (textStr->at(currentPos) == '$') { + nextPosJump = 2; + } else if (textStr->at(currentPos) == '@') { + nextPosJump = 1; + // Assume worst case for player name 12 * 8 (widest character * longest name length) + totalPixelWidth += 96; + } else { + // Some characters only one byte while others are two bytes + // So check both possibilities when checking for a character + if (pixelWidthTable.count(textStr->substr(currentPos, 1))) { + totalPixelWidth += pixelWidthTable[textStr->substr(currentPos, 1)]; + nextPosJump = 1; + } else if (pixelWidthTable.count(textStr->substr(currentPos, 2))) { + 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("Full string: " + *textStr); + nextPosJump = 1; + } + } + currentPos += nextPosJump; + } + // return the total number of characters we looped through + if (totalPixelWidth > maxLinePixelWidth && textStr->at(currentPos - nextPosJump) != ' ') { + return currentPos - lastNewline - nextPosJump; + } else { + return currentPos - lastNewline; + } +} + +void CustomMessage::AutoFormatString(std::string& str) const {// did I do this right? + ReplaceAltarIcons(str); + ReplaceColors(str); + // insert newlines either manually or when encountering a '&' + size_t lastNewline = 0; + const bool hasIcon = str.find('$', 0) != std::string::npos; + size_t lineLength = NextLineLength(&str, lastNewline, hasIcon); + while (lastNewline + lineLength < str.length()) { + const size_t carrot = str.find('^', lastNewline); + const size_t ampersand = str.find('&', lastNewline); + const size_t lastSpace = str.rfind(' ', lastNewline + lineLength); + const size_t lastPeriod = str.rfind('.', lastNewline + lineLength); + // replace '&' first if it's within the newline range + if (ampersand < lastNewline + lineLength) { + lastNewline = ampersand + 1; + // or move the lastNewline cursor to the next line if a '^' is encountered + } else if (carrot < lastNewline + lineLength) { + lastNewline = carrot + 1; + // some lines need to be split but don't have spaces, look for periods instead + } else if (lastSpace == std::string::npos) { + str.replace(lastPeriod, 1, ".&"); + lastNewline = lastPeriod + 2; + } else { + str.replace(lastSpace, 1, "&"); + lastNewline = lastSpace + 1; + } + lineLength = NextLineLength(&str, lastNewline, hasIcon); + } + ReplaceSpecialCharacters(str); + ReplaceAltarIcons(str); + std::replace(str.begin(), str.end(), '&', NEWLINE()[0]); + std::replace(str.begin(), str.end(), '^', WAIT_FOR_INPUT()[0]); + std::replace(str.begin(), str.end(), '@', PLAYER_NAME()[0]); + str += MESSAGE_END(); +} + +void CustomMessage::InsertNumber(uint8_t num){ + for (std::string& str : messages) { + size_t firstBar = str.find('|'); + if (firstBar != std::string::npos) { + size_t secondBar = str.find('|', firstBar + 1); + if (secondBar != std::string::npos) { + size_t thirdBar = str.find('|', secondBar + 1); + if (thirdBar != std::string::npos) { + if (num == 1) { + str.erase(secondBar, thirdBar - secondBar); + } else { + str.erase(firstBar, secondBar - firstBar); + } + } + } + } + } + //remove the remaining bar + this->Replace("|", ""); + Replace("[[d]]", std::to_string(num)); +} + + void CustomMessage::Capitalize() { - for (std::string* str : { &english, &french, &german }) { - (*str)[0] = std::toupper((*str)[0]); + for (std::string str : messages) { + (str)[0] = std::toupper((str)[0]); } } -void CustomMessage::ReplaceSpecialCharacters() { +void CustomMessage::ReplaceSpecialCharacters(std::string& str) const { // add special characters - for (std::string* str : { &english, &french, &german }) { - for (auto specialCharacterPair : textBoxSpecialCharacters) { - size_t start_pos = 0; - std::string textBoxSpecialCharacterString = ""s; - textBoxSpecialCharacterString += specialCharacterPair.second; - while ((start_pos = str->find(specialCharacterPair.first, start_pos)) != std::string::npos) { - str->replace(start_pos, specialCharacterPair.first.length(), textBoxSpecialCharacterString); - start_pos += textBoxSpecialCharacterString.length(); - } + for (auto specialCharacterPair : textBoxSpecialCharacters) { + size_t start_pos = 0; + std::string textBoxSpecialCharacterString = ""s; + textBoxSpecialCharacterString += specialCharacterPair.second; + while ((start_pos = str.find(specialCharacterPair.first, start_pos)) != std::string::npos) { + str.replace(start_pos, specialCharacterPair.first.length(), textBoxSpecialCharacterString); + start_pos += textBoxSpecialCharacterString.length(); } } } @@ -194,31 +452,49 @@ const char* Interface_ReplaceSpecialCharacters(char text[]) { return textChar; } -void CustomMessage::ReplaceColors() { - for (std::string* str : { &english, &french, &german }) { - for (const auto& colorPair : colors) { - std::string textToReplace = "%"; - textToReplace += colorPair.first; - size_t start_pos = 0; - while ((start_pos = str->find(textToReplace, start_pos)) != std::string::npos) { - str->replace(start_pos, textToReplace.length(), COLOR(colorPair.second)); - start_pos += textToReplace.length(); - } +void CustomMessage::ReplaceColors(std::string& str) const { + for (const auto& colorPair : percentColors) { + std::string textToReplace = "%"; + textToReplace += colorPair.first; + size_t start_pos = 0; + while ((start_pos = str.find(textToReplace, start_pos)) != std::string::npos) { + str.replace(start_pos, textToReplace.length(), COLOR(colorPair.second)); + start_pos += textToReplace.length(); + } + } + for (auto color: colors) { + if (const size_t firstHashtag = str.find('#'); firstHashtag != std::string::npos) { + str.replace(firstHashtag, 1, COLOR(color)); + if (const size_t secondHashtag = str.find('#', firstHashtag + 1); secondHashtag != std::string::npos) { + str.replace(secondHashtag, 1, COLOR(QM_WHITE)); + } else { + SPDLOG_DEBUG("non-matching hashtags in string: \"%s\"", str); + } + } + } + // Remove any remaining '#' characters. + std::erase(str, '#'); +} + +void CustomMessage::ReplaceAltarIcons(std::string& str) const { + for (const auto& iconPair : altarIcons) { + std::string textToReplace = "$"; + textToReplace += iconPair.first; + size_t start_pos = 0; + while ((start_pos = str.find(textToReplace, start_pos)) != std::string::npos) { + str.replace(start_pos, textToReplace.length(), ITEM_OBTAINED(iconPair.second)); + start_pos += textToReplace.length(); } } } -void CustomMessage::ReplaceAltarIcons() { - for (std::string* str : { &english, &french, &german }) { - for (const auto& iconPair : altarIcons) { - std::string textToReplace = "$"; - textToReplace += iconPair.first; - size_t start_pos = 0; - while ((start_pos = str->find(textToReplace, start_pos)) != std::string::npos) { - str->replace(start_pos, textToReplace.length(), ITEM_OBTAINED(iconPair.second)); - start_pos += textToReplace.length(); - } - } +void CustomMessage::InsertNames(std::vector toInsert){ + for(uint8_t a = 0; a < toInsert.size(); a++){ + CustomMessage temp = toInsert[a]; + if ((capital.size() > a) && (capital[a] = true)){ + temp.Capitalize(); + } + Replace("[[" + std::to_string(a+1) + "]]", temp); } } @@ -234,8 +510,12 @@ std::string CustomMessage::NEWLINE() { return "\x01"s; } -std::string CustomMessage::COLOR(uint8_t x) { - return "\x05"s + char(x); +std::string CustomMessage::COLOR(std::string x) { + return "\x05"s + x; +} + +std::string CustomMessage::POINTS(std::string x) { + return "\x1E"s + x; } std::string CustomMessage::WAIT_FOR_INPUT() { diff --git a/soh/soh/Enhancements/custom-message/CustomMessageManager.h b/soh/soh/Enhancements/custom-message/CustomMessageManager.h index 9c5cc92ee..2c797e527 100644 --- a/soh/soh/Enhancements/custom-message/CustomMessageManager.h +++ b/soh/soh/Enhancements/custom-message/CustomMessageManager.h @@ -1,8 +1,9 @@ #pragma once -#include #include #include #include +#include +#include #include "../../../include/z64item.h" #include "../../../include/message_data_textbox_types.h" @@ -10,14 +11,23 @@ #undef MESSAGE_END -#define QM_WHITE 0x00 -#define QM_RED 0x41 -#define QM_GREEN 0x42 -#define QM_BLUE 0x43 -#define QM_LBLUE 0x44 -#define QM_PINK 0x45 -#define QM_YELLOW 0x46 -#define QM_BLACK 0x47 +#define QM_WHITE "\x00"s +#define QM_RED "\x41" +#define QM_GREEN "\x42" +#define QM_BLUE "\x43" +#define QM_LBLUE "\x44" +#define QM_PINK "\x45" +#define QM_YELLOW "\x46" +#define QM_BLACK "\x47" + +#define HS_HORSE_ARCHERY "\x00"s //HS_HBA is an enum already + +typedef enum { + MF_FORMATTED, + MF_CLEAN, + MF_RAW, + MF_AUTO_FORMAT +} MessageFormat; /** * @brief Encapsulates logic surrounding languages, and formatting strings for OoT's textboxes and @@ -30,25 +40,41 @@ class CustomMessage { CustomMessage() = default; CustomMessage(std::string english_, std::string german_, std::string french_, TextBoxType type_ = TEXTBOX_TYPE_BLACK, TextBoxPosition position_ = TEXTBOX_POS_BOTTOM); + CustomMessage(std::string english_, std::string german_, std::string french_, std::vector colors_, std::vector capital_ = {}, + TextBoxType type_ = TEXTBOX_TYPE_BLACK, TextBoxPosition position_ = TEXTBOX_POS_BOTTOM); + CustomMessage(std::string english_, TextBoxType type_ = TEXTBOX_TYPE_BLACK, TextBoxPosition position_ = TEXTBOX_POS_BOTTOM); + CustomMessage(std::string english_, std::vector colors_, std::vector capital_ = {}, 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(uint8_t x) ; + 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() ; - const std::string& GetEnglish() const; - const std::string& GetFrench() const; - const std::string& GetGerman() const; + 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; + const std::string GetForCurrentLanguage(MessageFormat format = MF_FORMATTED) const; + const std::string GetForLanguage(uint8_t language, MessageFormat format = MF_FORMATTED) const; + const std::vector GetAllMessages(MessageFormat format = MF_FORMATTED) const; + void ProcessMessageFormat(std::string& str, MessageFormat format) const; + const std::vector& GetColors() const; + void SetColors(std::vector colors_); + const std::vector& GetCapital() const; + void SetCapital(std::vector capital_); const TextBoxType& GetTextBoxType() const; + void SetTextBoxType(TextBoxType boxType); const TextBoxPosition& GetTextBoxPosition() const; CustomMessage operator+(const CustomMessage& right) const; CustomMessage operator+(const std::string& right) const; void operator+=(const std::string& right); - bool operator==(const CustomMessage& right) const; + void operator+=(const CustomMessage& right); + bool operator==(const CustomMessage& operand) const; + bool operator==(const std::string& operand) const; bool operator!=(const CustomMessage& right) const; /** @@ -63,15 +89,13 @@ class CustomMessage { /** * @brief Finds an instance of oldStr in each language of the CustomMessage, - * and replaces it with the corresponding new string provided for each language. + * and replaces it with the corresponding string in the provided CustomMessage. * Typically used for dynamic variable replacement (i.e. gameplay stats, skulltula count) * * @param oldStr the string to be replaced - * @param newEnglish the new string for the English message - * @param newGerman the new string for the German message - * @param newFrench the new string for the French message + * @param newMessage the message containing the new strings. */ - void Replace(std::string&& oldStr, std::string&& newEnglish, std::string&& newGerman, std::string&& newFrench); + void Replace(std::string&& oldStr, CustomMessage newMessage); /** * @brief Capitalizes the first letter of the string for each language. @@ -82,17 +106,22 @@ class CustomMessage { * @brief Replaces special characters (things like diacritics for non-english langugages) * with the control codes used to display them in OoT's textboxes. */ - void ReplaceSpecialCharacters(); + void ReplaceSpecialCharacters(std::string& str) const; /** * @brief Replaces our color variable strings with the OoT control codes. */ - void ReplaceColors(); + void ReplaceColors(std::string& str) const; /** * @brief Replaces `$` variable strings with OoT control codes. */ - void ReplaceAltarIcons(); + void ReplaceAltarIcons(std::string& str) const; + + /** + * @brief Replaces [[1]] style variable strings with the provided vector of customMessages + */ + void InsertNames(std::vector toInsert); /** * @brief Replaces various symbols with the control codes necessary to @@ -103,6 +132,15 @@ class CustomMessage { */ void Format(ItemID iid); + /** + * @brief Replaces [[d]] in text with the supplied number, and if plural + * options exist (2 blocks of text surrounded by |) choose the former if it 1, + * and the latter otherwise, deleting the other and the |'s. + * + * @param num the number to insert. + */ + void InsertNumber(uint8_t num); + /** * @brief Replaces various symbols with the control codes necessary to * display them in OoT's textboxes. i.e. special characters, colors, newlines, @@ -110,12 +148,44 @@ class CustomMessage { */ void Format(); + /** + * @brief formats the message specifically to fit in OoT's + * textboxes, and use it's formatting. + */ + void AutoFormat(); + + /** + * @brief Removes all OoT formatting from the message, + * making it a good form for writing into spoiler logs. + */ + void Clean(); + + /** + * @brief Replaces various symbols with the control codes necessary to + * display them in OoT's textboxes for a single string + * . i.e. special characters, colors, newlines, wait for input, etc. + */ + void FormatString(std::string& str) const; + + /** + * @brief formats the string specifically to fit in OoT's + * textboxes, and use it's formatting. + * RANDOTODO whoever knows exactly what this does check my adaption + */ + void AutoFormatString(std::string& str) const; + + /** + * @brief Removes symbols used for control codes from the string, + * leaving raw text + */ + void CleanString(std::string& str) const; + private: - std::string english = ""; - std::string french = ""; - std::string german = ""; + std::vector messages = {"","",""}; TextBoxType type = TEXTBOX_TYPE_BLACK; TextBoxPosition position = TEXTBOX_POS_BOTTOM; + std::vector colors = {}; + std::vector capital = {}; }; typedef std::unordered_map CustomMessageTable; diff --git a/soh/soh/Enhancements/custom-message/CustomMessageTypes.h b/soh/soh/Enhancements/custom-message/CustomMessageTypes.h index 737d22665..1f5a093c7 100644 --- a/soh/soh/Enhancements/custom-message/CustomMessageTypes.h +++ b/soh/soh/Enhancements/custom-message/CustomMessageTypes.h @@ -100,6 +100,7 @@ typedef enum { TEXT_MALON_LINK_HAS_TIME_BUT_NO_RECORD = 0x2090, TEXT_MALON_LINK_HAS_RECORD = 0x2091, TEXT_MALON_FIRST_BEAT_THIS_RECORD = 0x2092, + TEXT_BIGGORON_I_MAAAADE_THISSSS = 0x3002, TEXT_MEDIGORON = 0x304C, TEXT_FIRE_TEMPLE_GORON_OWE_YOU_BIG_TIME = 0x3052, TEXT_BIGGORON_BETTER_AT_SMITHING = 0x3053, diff --git a/soh/soh/Enhancements/debugger/MessageViewer.cpp b/soh/soh/Enhancements/debugger/MessageViewer.cpp index 51fe3c0b9..92ae5070d 100644 --- a/soh/soh/Enhancements/debugger/MessageViewer.cpp +++ b/soh/soh/Enhancements/debugger/MessageViewer.cpp @@ -204,16 +204,7 @@ void MessageDebug_StartTextBox(const char* tableId, uint16_t textId, uint8_t lan const CustomMessage messageEntry = CustomMessageManager::Instance->RetrieveMessage(tableId, textId); font->charTexBuf[0] = (messageEntry.GetTextBoxType() << 4) | messageEntry.GetTextBoxPosition(); switch (language) { - case LANGUAGE_FRA: - font->msgLength = SohUtils::CopyStringToCharBuffer(buffer, messageEntry.GetFrench(), maxBufferSize); - break; - case LANGUAGE_GER: - font->msgLength = SohUtils::CopyStringToCharBuffer(buffer, messageEntry.GetGerman(), maxBufferSize); - break; - case LANGUAGE_ENG: - default: - font->msgLength = SohUtils::CopyStringToCharBuffer(buffer, messageEntry.GetEnglish(), maxBufferSize); - break; + font->msgLength = SohUtils::CopyStringToCharBuffer(buffer, messageEntry.GetForLanguage(language), maxBufferSize); } msgCtx->msgLength = static_cast(font->msgLength); } diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index 5d86b11f4..e129048c8 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -1161,9 +1161,7 @@ void RegisterAltTrapTypes() { void RegisterRandomizerSheikSpawn() { GameInteractor::Instance->RegisterGameHook([]() { if (!gPlayState) return; - bool canSheik = (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIAL_COUNT) != 0 && - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LIGHT_ARROWS_HINT)); - if (!IS_RANDO || !LINK_IS_ADULT || !canSheik) return; + if (!IS_RANDO || !LINK_IS_ADULT || !OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHEIK_LA_HINT)) return; switch (gPlayState->sceneNum) { case SCENE_TEMPLE_OF_TIME: if (gPlayState->roomCtx.curRoom.num == 1) { diff --git a/soh/soh/Enhancements/presets.h b/soh/soh/Enhancements/presets.h index 822b61c75..7bc941afb 100644 --- a/soh/soh/Enhancements/presets.h +++ b/soh/soh/Enhancements/presets.h @@ -403,7 +403,8 @@ const std::vector randomizerCvars = { "gRandomizeLacsRewardOptions", "gRandomizeLacsStoneCount", "gRandomizeLacsTokenCount", - "gRandomizeLAHint", + "gRandomizeGanondorfHint", + "gRandomizeSheikLAHint", "gRandomizeLinksPocket", "gRandomizeLogicRules", "gRandomizeMedallionCount", diff --git a/soh/soh/Enhancements/randomizer/3drando/custom_messages.cpp b/soh/soh/Enhancements/randomizer/3drando/custom_messages.cpp index 338cb86e7..c00ec8840 100644 --- a/soh/soh/Enhancements/randomizer/3drando/custom_messages.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/custom_messages.cpp @@ -158,7 +158,7 @@ constexpr std::array DungeonColors = { CreateMessage(textId, unk_04, textBoxType, textBoxPosition, text.GetEnglish(), text.GetFrench(), text.GetSpanish()); } - Text AddColorsAndFormat(Text text, const std::vector& colors /*= {}*/) { + Text AddColorsAndFormat(Text text, const std::vector& colors /*= {}*/) { //for each language for (std::string* textStr : {&text.english, &text.french, &text.spanish}) { @@ -280,12 +280,12 @@ constexpr std::array DungeonColors = { std::string SET_SPEED(uint8_t x) { return "\x7F\x10"s + char(x); } - std::string SKULLTULAS_DESTROYED() { return "\x7F\x15"s; } + std::string SKULLTULAS_DESTROYED() { return "\x7F\x15"s; } //RANDOTODO just refernce the versions in CustomMessage std::string CURRENT_TIME() { return "\x7F\x17"s; } std::string UNSKIPPABLE() { return "\x7F\x19"s; } std::string TWO_WAY_CHOICE() { return "\x1B"s; } std::string NEWLINE() { return "\x7F\x1C"s; } - std::string COLOR(uint8_t x) { return "\x7F\x1D"s + char(x); } + std::string COLOR(std::string x) { return "\x7F\x1D"s + x; } std::string CENTER_TEXT() { return "\x7F\x1E"s; } std::string IF_NOT_MQ() { return "\x7F\x29"s; } std::string MQ_ELSE() { return "\x7F\x2A"s; } diff --git a/soh/soh/Enhancements/randomizer/3drando/custom_messages.hpp b/soh/soh/Enhancements/randomizer/3drando/custom_messages.hpp index c8029dc66..b9d2a08c6 100644 --- a/soh/soh/Enhancements/randomizer/3drando/custom_messages.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/custom_messages.hpp @@ -7,15 +7,6 @@ #include "text.hpp" -#define QM_WHITE 0x00 -#define QM_RED 0x41 -#define QM_GREEN 0x42 -#define QM_BLUE 0x43 -#define QM_LBLUE 0x44 -#define QM_PINK 0x45 -#define QM_YELLOW 0x46 -#define QM_BLACK 0x47 - namespace CustomMessages { typedef struct { // In the true file format, offset is the offset into the QM file. @@ -73,7 +64,7 @@ typedef struct { std::string UNSKIPPABLE(); std::string TWO_WAY_CHOICE(); std::string NEWLINE(); - std::string COLOR(uint8_t x); + std::string COLOR(std::string x); std::string CENTER_TEXT(); std::string IF_NOT_MQ(); std::string MQ_ELSE(); diff --git a/soh/soh/Enhancements/randomizer/3drando/fill.cpp b/soh/soh/Enhancements/randomizer/3drando/fill.cpp index f87871944..bf9b9ef19 100644 --- a/soh/soh/Enhancements/randomizer/3drando/fill.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/fill.cpp @@ -9,7 +9,6 @@ #include "spoiler_log.hpp" #include "starting_inventory.hpp" #include "hints.hpp" -#include "hint_list.hpp" #include "../entrance.h" #include "shops.hpp" #include "pool_functions.hpp" @@ -1145,13 +1144,6 @@ int Fill() { ctx->CreateItemOverrides(); ctx->GetEntranceShuffler()->CreateEntranceOverrides(); - SPDLOG_INFO("Creating Other Hint Texts..."); - //funny ganon line - Text ganonText = RandomElement(GetHintCategory(HintCategory::GanonLine)).GetText(); - CreateMessageFromTextObject(0x70CB, 0, 2, 3, AddColorsAndFormat(ganonText)); - SetGanonText(ganonText); - SPDLOG_INFO("Creating Other Hint Texts Done"); - CreateAllHints(); CreateWarpSongTexts(); return 1; diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp index c6269d5de..33f6c64d0 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp @@ -1,12 +1,11 @@ -#include "hint_list.hpp" #include "custom_messages.hpp" #include "../randomizerTypes.h" #include "../context.h" - -#include +#include "../static_data.h" using namespace CustomMessages; +using namespace std::literals::string_literals; // Big thanks to Lioncache, Gabyelnuevo, Danius88, and Charade for their translations! @@ -19,27 +18,34 @@ using namespace CustomMessages; // surrounding text with '#' will make it a different color // - OoT Randomizer -// '%d' indicates a number will be placed there. +// '[[d]]' indicates a number will be placed there, numbers in [[]] will be replaced by other text in hints +namespace Rando { -std::array hintTable; - -void HintTable_Init() { +void StaticData::HintTable_Init() { /*-------------------------- - | GENERAL TEXT | + | GENERAL TEXT | ---------------------------*/ - hintTable[RHT_NONE] = HintText::Exclude({ Text{ "No Hint", "Pas d'Indice", "" } }); - hintTable[RHT_PREFIX] = - HintText::Exclude({ Text{ "They say that ", /*french*/ "Selon moi, ", /*spanish*/ "Según dicen, " } }); - hintTable[RHT_WAY_OF_THE_HERO] = - HintText::Exclude({ Text{ " is on #the way of the hero#.", /*french*/ " est sur #la voie du héros#.", - /*spanish*/ " conduce a la senda del héroe." } }); - hintTable[RHT_PLUNDERING] = - HintText::Exclude({ Text{ "plundering ", /*french*/ "explorer ", /*spanish*/ "inspeccionar " } }); - hintTable[RHT_FOOLISH] = HintText::Exclude( - { Text{ " is #a foolish choice#.", /*french*/ " est #futile#.", /*spanish*/ " #no es una sabia decisión#." } }); - hintTable[RHT_CAN_BE_FOUND_AT] = - HintText::Exclude({ Text{ "can be found at", /*french*/ "se trouve dans", /*spanish*/ "aguarda en" } }); - hintTable[RHT_HOARDS] = HintText::Exclude({ Text{ "hoards", /*french*/ "recèle", /*spanish*/ "acapara" } }); + hintTextTable[RHT_NONE] = HintText(CustomMessage("No Hint", "", "Pas d'Indice" )); + hintTextTable[RHT_WAY_OF_THE_HERO] = + HintText(CustomMessage( "They say that #[[1]]# is on #the way of the hero#.", + "", + /*french*/ "Selon moi, #[[1]]# est sur #la voie du héros#.", {QM_RED, QM_LBLUE})); + // /*spanish*/ "Según dicen, #[[1]]# conduce a la senda del héroe." + hintTextTable[RHT_FOOLISH] = + HintText(CustomMessage( "They say that plundering #[[1]]# is #a foolish choice#.", + "", + /*french*/ "Selon moi, explorer #[[1]]# est #futile#.", {QM_RED, QM_PINK})); + // /*spanish*/ "Según dicen, inspeccionar #[[1]]# #no es una sabia decisión#." + hintTextTable[RHT_CAN_BE_FOUND_AT] = + HintText(CustomMessage( "They say that #[[1]]# can be found at #[[2]]#.", + "", + /*french*/ "Selon moi, #[[1]]# se trouve dans #[[2]]#.", {QM_GREEN, QM_RED})); + // /*spanish*/ "Según dicen, #[[1]]# aguarda en #[[2]]#." + hintTextTable[RHT_HOARDS] = + HintText(CustomMessage( "They say that #[[2]]# hoards #[[1]]#.", + "", + /*french*/ "Selon moi, #[[2]]# recèle #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ "Según dicen, #[[2]]# acapara #[[1]]#." HintTable_Init_Item(); HintTable_Init_Exclude_Overworld(); @@ -50,2036 +56,1720 @@ void HintTable_Init() { | SOMETIMES HINT TEXT | ---------------------------*/ - hintTable[RHT_KF_LINKS_HOUSE_COW] = HintText::Sometimes( - { - // obscure text - Text{ "the #bovine bounty of a horseback hustle# gifts", - /*french*/ "le cadeau #qui découle d'une réussite équestre# est", - /*spanish*/ "la #recompensa bovina de un paseo a caballo# brinda" }, - }, - {}, - // clear text - Text{ "#Malon's obstacle course# leads to", /*french*/ "la #course à obstacle de Malon# amène à", - /*spanish*/ "la #carrera de obstáculos de Malon# brinda" }); - - hintTable[RHT_KAK_100_GOLD_SKULLTULA_REWARD] = HintText::Sometimes( - { - // obscure text - Text{ "#100 bug badges# rewards", - /*french*/ "#100 écussons# donnent", - /*spanish*/ "#100 medallas de insectos# otorgan" }, - Text{ "#100 spider souls# yields", - /*french*/ "#100 âmes d'arachnide# donnent", - /*spanish*/ "#100 almas de araña# otorgan" }, - Text{ "#100 auriferous arachnids# lead to", - /*french*/ "#100 arachnides aurifères# donnent", - /*spanish*/ "#100 arácnidos auríferos# otorgan" }, - }, - {}, - // clear text - Text{ "slaying #100 Gold Skulltulas# reveals", - /*french*/ "détruire #100 Skulltulas d'or# donne", - /*spanish*/ "exterminar #100 skulltulas doradas# revela" }); - - hintTable[RHT_SONG_FROM_OCARINA_OF_TIME] = HintText::Sometimes({ - // obscure text - Text{ "the #Ocarina of Time# teaches", /*french*/ "l'#Ocarina du Temps# est accompagné par", - /*spanish*/ "la #Ocarina del Tiempo# enseña" }, - }); - - hintTable[RHT_SONG_FROM_ROYAL_FAMILYS_TOMB] = HintText::Sometimes({ - // obscure text - Text{ "#ReDead in the Composers' Grave# guard", - /*french*/ "les #Éffrois du tombeau des compositeurs# protègent", - /*spanish*/ "los #ReDeads del Panteón Real# guardan" }, - Text{ "the #Composer Brothers wrote#", /*french*/ "le #trésor des compositeurs# est", - /*spanish*/ "los #hermanos compositores escribieron#" }, - }); - - hintTable[RHT_SHEIK_IN_FOREST] = HintText::Sometimes({ - // obscure text - Text{ "#in a meadow# Sheik teaches", /*french*/ "Sheik confiera, #dans un bosquet#,", - /*spanish*/ "#en la pradera sagrada# Sheik enseña" }, - }); - - hintTable[RHT_SHEIK_AT_TEMPLE] = HintText::Sometimes({ - // obscure text - Text{ "Sheik waits at a #monument to time# to teach", - /*french*/ "Sheik confiera, #au pied de l'épée légendaire#,", - /*spanish*/ "Sheik espera en el #momumento del tiempo# para enseñar" }, - }); - - hintTable[RHT_SHEIK_IN_CRATER] = HintText::Sometimes({ - // obscure text - Text{ "the #crater's melody# is", /*french*/ "Sheik confiera, #entouré de lave#,", - /*spanish*/ "la #melodía del cráter# otorga" }, - }); - - hintTable[RHT_SHEIK_IN_ICE_CAVERN] = HintText::Sometimes({ - // obscure text - Text{ "the #frozen cavern# echoes with", /*french*/ "Sheik confiera, #dans une caverne enneigée#,", - /*spanish*/ "en la #caverna de hielo# retumban los ecos de" }, - }); - - hintTable[RHT_SHEIK_IN_KAKARIKO] = HintText::Sometimes({ - // obscure text - Text{ "a #ravaged village# mourns with", /*french*/ "Sheik confirera, #au coeur d'un village ravagé#,", - /*spanish*/ "un #arrasado pueblo# llora" }, - }); - - hintTable[RHT_SHEIK_AT_COLOSSUS] = HintText::Sometimes({ - // obscure text - Text{ "a hero ventures #beyond the wasteland# to learn", - /*french*/ "Sheik confiera, #au bout d'un chemin sableux#,", - /*spanish*/ "el héroe que se adentre #más allá del desierto# aprenderá" }, - }); - - hintTable[RHT_MARKET_10_BIG_POES] = HintText::Sometimes( - { - // obscure text - Text{ "#ghost hunters# will be rewarded with", - /*french*/ "#les chasseurs de fantômes# sont récompensés avec", - /*spanish*/ "los #cazafantasmas# son premiados con" }, - }, - {}, - // clear text - Text{ "catching #Big Poes# leads to", /*french*/ "#d'attraper des Àmes# donne", - /*spanish*/ "hacerte con #Grandes Poes# conduce a" }); - - hintTable[RHT_DEKU_THEATER_SKULL_MASK] = HintText::Sometimes({ - // obscure text - Text{ "the #Skull Mask# yields", /*french*/ "le #Masque de Mort# donne", - /*spanish*/ "la #máscara de calavera# otorga" }, - }); - - hintTable[RHT_DEKU_THEATER_MASK_OF_TRUTH] = HintText::Sometimes( - { - // obscure text - Text{ "showing a #truthful eye to the crowd# rewards", - /*french*/ "montrer #l'oeil de vérité à la foule# donne", - /*spanish*/ "#mostrarle el ojo verdadero# a una multitud brinda" }, - }, - {}, - // clear text - Text{ "the #Mask of Truth# yields", /*french*/ "le #Masque de Vérité# donne", - /*spanish*/ "la #máscara de la verdad# premia" }); - - hintTable[RHT_HF_OCARINA_OF_TIME_ITEM] = HintText::Sometimes({ - // obscure text - Text{ "the #treasure thrown by Princess Zelda# is", /*french*/ "le trésor #laissé par la princesse# est", - /*spanish*/ "el #tesoro arrojado por la Princesa Zelda# se trata de" }, - }); - - hintTable[RHT_DMT_TRADE_BROKEN_SWORD] = HintText::Sometimes({ - // obscure text - Text{ "a #blinded Biggoron# entrusts", /*french*/ "un #Grogoron aveuglé# confie", - /*spanish*/ "un #miope Biggoron# otorga" }, - }); - - hintTable[RHT_DMT_TRADE_EYEDROPS] = HintText::Sometimes({ - // obscure text - Text{ "while you wait, #Biggoron# gives", /*french*/ "pendant que tu attends, #Biggoron# donne", - /*spanish*/ "#Biggoron# está a la espera de otorgar" }, - }); - - hintTable[RHT_DMT_TRADE_CLAIM_CHECK] = HintText::Sometimes({ - // obscure text - Text{ "#Biggoron# crafts", /*french*/ "#Biggoron# fabrique", /*spanish*/ "#Biggoron# forja" }, - }); - - hintTable[RHT_KAK_50_GOLD_SKULLTULA_REWARD] = HintText::Sometimes( - { - // obscure text - Text{ "#50 bug badges# rewards", /*french*/ "#50 écussons# donnent", - /*spanish*/ "#50 medallas de insectos# otorgan" }, - Text{ "#50 spider souls# yields", /*french*/ "#50 âmes d'arachnide# donnent", - /*spanish*/ "#50 almas de araña# otorgan" }, - Text{ "#50 auriferous arachnids# lead to", /*french*/ "#50 arachnides aurifères# donnent", - /*spanish*/ "#50 arácnidos auríferos# otorgan" }, - }, - {}, - // clear text - Text{ "slaying #50 Gold Skulltulas# reveals", /*french*/ "détruire #50 Skulltulas d'or# donne", - /*spanish*/ "exterminar #50 skulltulas doradas# revela" }); - - hintTable[RHT_KAK_40_GOLD_SKULLTULA_REWARD] = HintText::Sometimes( - { - // obscure text - Text{ "#40 bug badges# rewards", /*french*/ "#40 écussons# donnent", - /*spanish*/ "#40 medallas de insectos# otorgan" }, - Text{ "#40 spider souls# yields", /*french*/ "#40 âmes d'arachnide# donnent", - /*spanish*/ "#40 almas de araña# otorgan" }, - Text{ "#40 auriferous arachnids# lead to", /*french*/ "#40 arachnides aurifères# donnent", - /*spanish*/ "#40 arácnidos auríferos# otorgan" }, - }, - {}, - // clear text - Text{ "slaying #40 Gold Skulltulas# reveals", /*french*/ "détruire #40 Skulltulas d'or# donne", - /*spanish*/ "exterminar #40 skulltulas doradas# revela" }); - - hintTable[RHT_KAK_30_GOLD_SKULLTULA_REWARD] = HintText::Sometimes( - { - // obscure text - Text{ "#30 bug badges# rewards", /*french*/ "#30 écussons# donnent", - /*spanish*/ "#30 medallas de insectos# otorgan" }, - Text{ "#30 spider souls# yields", /*french*/ "#30 âmes d'arachnide# donnent", - /*spanish*/ "#30 almas de araña# otorgan" }, - Text{ "#30 auriferous arachnids# lead to", /*french*/ "#30 arachnides aurifères# donnent", - /*spanish*/ "#30 arácnidos auríferos# otorgan" }, - }, - {}, - // clear text - Text{ "slaying #30 Gold Skulltulas# reveals", /*french*/ "détruire #30 Skulltulas d'or# donne", - /*spanish*/ "exterminar #30 skulltulas doradas# revela" }); - - hintTable[RHT_KAK_20_GOLD_SKULLTULA_REWARD] = HintText::Sometimes( - { - // obscure text - Text{ "#20 bug badges# rewards", /*french*/ "#20 écussons# donnent", - /*spanish*/ "#20 medallas de insectos# otorgan" }, - Text{ "#20 spider souls# yields", /*french*/ "#20 âmes d'arachnide# donnent", - /*spanish*/ "#20 almas de araña# otorgan" }, - Text{ "#20 auriferous arachnids# lead to", /*french*/ "#20 arachnides aurifères# donnent", - /*spanish*/ "#20 arácnidos auríferos# otorgan" }, - }, - {}, - // clear text - Text{ "slaying #20 Gold Skulltulas# reveals", /*french*/ "détruire #20 Skulltulas d'or# donne", - /*spanish*/ "exterminar #20 skulltulas doradas# revela" }); - - hintTable[RHT_KAK_ANJU_AS_CHILD] = HintText::Sometimes( - { - // obscure text - Text{ "#wrangling roosters# rewards", /*french*/ "#plumer des poulets# donne", - /*spanish*/ "#atrapar a las gallinas# premia" }, - Text{ "#chucking chickens# gifts", /*french*/ "#lancer des poulets# donne", - /*spanish*/ "#reunir a unos emplumados# premia" }, - }, - {}, - // clear text - Text{ "#collecting cuccos# rewards", /*french*/ "#rapporter les Cocottes# donne", - /*spanish*/ "#hacerte con todos los cucos# premia" }); - - hintTable[RHT_KAK_TRADE_POCKET_CUCCO] = HintText::Sometimes({ - // obscure text - Text{ "an adult's #happy Cucco# awards", /*french*/ "un adulte avec une #poulette joyeuse# obtient", - /*spanish*/ "un #alegre cuco# en la madurez otorga" }, - }); - - hintTable[RHT_KAK_TRADE_ODD_MUSHROOM] = HintText::Sometimes({ - // obscure text - Text{ "the #potion shop lady# entrusts", /*french*/ "la #gribiche du magasin de potion# confie", - /*spanish*/ "la #señora de la tienda de pociones# otorga" }, - }); - - hintTable[RHT_GC_DARUNIAS_JOY] = HintText::Sometimes( - { - // obscure text - Text{ "a #groovin' goron# gifts", /*french*/ "#le Goron joyeux# donne", - /*spanish*/ "#un goron marchoso# otorga" }, - }, - {}, - // clear text - Text{ "#Darunia's dance# leads to", /*french*/ "#la dance de Darunia# donne", - /*spanish*/ "#el baile de Darunia# conduce a" }); - - hintTable[RHT_LW_SKULL_KID] = HintText::Sometimes({ - // obscure text - Text{ "the #Skull Kid# grants", /*french*/ "le #Skull Kid# donne", /*spanish*/ "#Skull Kid# otorga" }, - }); - - hintTable[RHT_LW_TRADE_COJIRO] = HintText::Sometimes({ - // obscure text - Text{ "returning a #special Cucco# awards", /*french*/ "ramener une #poulette précieuse# donne", - /*spanish*/ "quien devuelva un #cuco especial# encontrará" }, - }); - - hintTable[RHT_LW_TRADE_ODD_POTION] = HintText::Sometimes({ - // obscure text - Text{ "a #Kokiri girl in the woods# leaves", /*french*/ "la #fillette Kokiri dans les bois# laisse", - /*spanish*/ "una #chica kokiri del bosque# otorga" }, - }); - - hintTable[RHT_LH_SUN] = HintText::Sometimes( - { - // obscure text - Text{ "staring into #the sun# grants", /*french*/ "regarder #le soleil# donne", - /*spanish*/ "#mirar al sol# revela" }, - }, - {}, - // clear text - Text{ "shooting #the sun# grants", /*french*/ "tirer une flèche dans #sur le soleil# donne", - /*spanish*/ "#disparar al sol# revela" }); - - hintTable[RHT_LH_TRADE_FROG] = HintText::Sometimes({ - // obscure text - Text{ "#Lake Hylia's scientist# hurriedly entrusts", /*french*/ "le #scientifique du lac# confie rapidement", - /*spanish*/ "el #científico del Lago Hylia# otorga con prisa" }, - }); - - hintTable[RHT_MARKET_TREASURE_CHEST_GAME_REWARD] = HintText::Sometimes( - { - // obscure text - Text{ "#gambling# grants", /*french*/ "#parier# donne", /*spanish*/ "#los juegos de azar# revelan" }, - Text{ "there is a #1/32 chance# to win", /*french*/ "être #le gagnant parmi 32# donne", - /*spanish*/ "hay una #probabilidad de 1/32# de ganar" }, - }, - {}, - // clear text - Text{ "the #treasure chest game# grants", /*french*/ "la #Chasse-aux-Trésors# donne", - /*spanish*/ "#el Cofre del Tesoro# premia" }); - - hintTable[RHT_MARKET_TREASURE_CHEST_GAME_ITEM_1] = HintText::Sometimes( - { - // obscure text - Text{ "#gambling once# grants", /*french*/ "#parier une fois# donne", - /*spanish*/ "#apostar solo una vez# revelará" }, - Text{ "the #first or second game chest# contains", - /*french*/ "le #premier ou deuxième coffre à jeu# contient", - /*spanish*/ "#el primer o segundo cofre del azar# revela" }, - }, - {}, - // clear text - Text{ "the #first locked room# in the chest game contains", - /*french*/ "la #première salle# de la Chasse-aux-Trésors contient", - /*spanish*/ "#en la primera sala del Cofre del Tesoro# aguarda" }); - - hintTable[RHT_MARKET_TREASURE_CHEST_GAME_ITEM_2] = HintText::Sometimes( - { - // obscure text - Text{ "#gambling twice# grants", /*french*/ "#parier deux fois# donne", - /*spanish*/ "#apostar dos veces# revelará" }, - Text{ "the #third or fourth game chest# contains", - /*french*/ "le #troisième ou quatrième coffre à jeu# contient", - /*spanish*/ "#el tercer o cuarto cofre del azar# revela" }, - }, - {}, - // clear text - Text{ "the #second locked room# in the chest game contains", - /*french*/ "la #deuxième salle# de la Chasse-aux-Trésors contient", - /*spanish*/ "#en la segunda sala del Cofre del Tesoro# aguarda" }); - - hintTable[RHT_MARKET_TREASURE_CHEST_GAME_ITEM_3] = HintText::Sometimes( - { - // obscure text - Text{ "#gambling 3 times# grants", /*french*/ "#parier trois fois# donne", - /*spanish*/ "#apostar tres veces# revelará" }, - Text{ "the #fifth or sixth game chest# contains", - /*french*/ "le #cinquième ou sixième coffre à jeu# contient", - /*spanish*/ "#el quinto o sexto cofre del azar# revela" }, - }, - {}, - // clear text - Text{ "the #third locked room# in the chest game contains", - /*french*/ "la #troisième salle# de la Chasse-aux-Trésors contient", - /*spanish*/ "#en la tercera sala del Cofre del Tesoro# aguarda" }); - - hintTable[RHT_MARKET_TREASURE_CHEST_GAME_ITEM_4] = HintText::Sometimes( - { - // obscure text - Text{ "#gambling 4 times# grants", /*french*/ "#parier quatre fois# donne", - /*spanish*/ "#apostar cuatro veces# revelará" }, - Text{ "the #seventh or eighth game chest# contains", - /*french*/ "le #septième ou huitième coffre à jeu# contient", - /*spanish*/ "#el séptimo u octavo cofre del azar# revela" }, - }, - {}, - // clear text - Text{ "the #fourth locked room# in the chest game contains", - /*french*/ "la #quatrième salle# de la Chasse-aux-Trésors contient", - /*spanish*/ "#en la cuarta sala del Cofre del Tesoro# aguarda" }); - - hintTable[RHT_MARKET_TREASURE_CHEST_GAME_ITEM_5] = HintText::Sometimes( - { - // obscure text - Text{ "#gambling 5 times# grants", /*french*/ "#parier cinq fois# donne", - /*spanish*/ "#apostar cinco veces# revelará" }, - Text{ "the #ninth or tenth game chest# contains", - /*french*/ "le #neuvième ou dixième coffre à jeu# contient", - /*spanish*/ "#el noveno o décimo cofre del azar# revela" }, - }, - {}, - // clear text - Text{ "the #fifth locked room# in the chest game contains", - /*french*/ "la #cinquième salle# de la Chasse-aux-Trésors contient", - /*spanish*/ "#en la quinta sala del Cofre del Tesoro# aguarda" }); - - hintTable[RHT_GF_HBA_1500_POINTS] = HintText::Sometimes( - { - // obscure text - Text{ "mastery of #horseback archery# grants", /*french*/ "maîtriser l'#archerie équestre# donne", - /*spanish*/ "dominar el #tiro con arco a caballo# premia con" }, - }, - {}, - // clear text - Text{ "scoring 1500 in #horseback archery# grants", - /*french*/ "obtenir 1500 points dans l'#archerie équestre# donne", - /*spanish*/ "conseguir 1500 puntos en el #tiro con arco a caballo# premia" }); - - hintTable[RHT_GRAVEYARD_HEART_PIECE_GRAVE_CHEST] = HintText::Sometimes({ - // obscure text - Text{ "playing #Sun's Song# in a grave spawns", /*french*/ "jouer le #chant du soleil# dans un tombeau donne", - /*spanish*/ "#tocar la Canción del Sol# en una cripta conduce a" }, - }); - - hintTable[RHT_GC_MAZE_LEFT_CHEST] = HintText::Sometimes({ - // obscure text - Text{ "in #Goron City# the hammer unlocks", /*french*/ "dans le #village Goron#, le marteau donne accès à", - /*spanish*/ "en la #Ciudad Goron# el martillo desbloquea" }, - }); - - hintTable[RHT_GV_CHEST] = HintText::Sometimes({ - // obscure text - Text{ "in #Gerudo Valley# the hammer unlocks", /*french*/ "dans la #Vallée Gerudo#, le marteau donne accès à", - /*spanish*/ "en el #Valle Gerudo# el martillo desbloquea" }, - }); - - hintTable[RHT_GV_TRADE_SAW] = HintText::Sometimes({ - // obscure text - Text{ "the #boss of the carpenters# leaves", /*french*/ "le #patron des ouvriers# laisse", - /*spanish*/ "el #capataz de los carpinteros# otorga" }, - }); - - hintTable[RHT_GV_COW] = HintText::Sometimes({ - // obscure text - Text{ "a #cow in Gerudo Valley# gifts", /*french*/ "la #vache de la Vallée Gerudo# donne", - /*spanish*/ "una #vaca del Valle Gerudo# brinda" }, - }); - - hintTable[RHT_HC_GS_STORMS_GROTTO] = HintText::Sometimes({ - // obscure text - Text{ "a #spider behind a muddy wall# in a grotto holds", - /*french*/ "l'#araignée derrière un mur de boue# dans une grotte donne", - /*spanish*/ "una #Skulltula tras la agrietada pared# de una cueva otorga" }, - }); - - hintTable[RHT_HF_GS_COW_GROTTO] = HintText::Sometimes({ - // obscure text - Text{ "a #spider behind webs# in a grotto holds", - /*french*/ "l'#araignée derrière une toile# dans une grotte donne", - /*spanish*/ "una #Skulltula tras la telaraña# de una cueva otorga" }, - }); - - hintTable[RHT_HF_COW_GROTTO_COW] = HintText::Sometimes( - { - // obscure text - Text{ "the #cobwebbed cow# gifts", /*french*/ "la #vache prisonnière d'araignées# donne", - /*spanish*/ "una #vaca tras una telaraña# brinda" }, - }, - {}, - // clear text - Text{ "a #cow behind webs# in a grotto gifts", /*french*/ "la #vache derrière les toiles# d'une grotte donne", - /*spanish*/ "una #vaca tras la telaraña# de una cueva brinda" }); - - hintTable[RHT_ZR_FROGS_OCARINA_GAME] = HintText::Sometimes( - { - // obscure text - Text{ "an #amphibian feast# yields", /*french*/ "un #festin d'amphibiens# donne", - /*spanish*/ "una #fiesta anfibia# brinda" }, - Text{ "the #croaking choir's magnum opus# awards", /*french*/ "la #chorale coassante# donne", - /*spanish*/ "un #coro maestro de ancas# premia" }, - Text{ "the #froggy finale# yields", /*french*/ "la #finale amphibienne# donne", - /*spanish*/ "el #gran final batracio# brinda" }, - }, - {}, - // clear text - Text{ "the final reward from the #Frogs of Zora's River# is", - /*french*/ "la dernière récompense des #grenouilles de la Rivière Zora# est", - /*spanish*/ "la recompensa final de las #ranas del Río Zora# premia" }); - - hintTable[RHT_ZF_GS_HIDDEN_CAVE] = HintText::Sometimes({ - // obscure text - Text{ "a spider high #above the icy waters# holds", /*french*/ "l'araignée #en haut des eaux glacées# donne", - /*spanish*/ "una Skulltula en lo #alto de las congeladas aguas# otorga" }, - }); - - hintTable[RHT_WASTELAND_CHEST] = HintText::Sometimes({ - // obscure text - Text{ "#deep in the wasteland# is", /*french*/ "#loin dans le désert# gît", - /*spanish*/ "en lo #profundo del desierto encantado# yace" }, - Text{ "beneath #the sands#, flames reveal", /*french*/ "#sous le désert#, les flammes font apparaître", - /*spanish*/ "tras las #arenas# unas llamas revelan" }, - }); - - hintTable[RHT_WASTELAND_GS] = HintText::Sometimes({ - // obscure text - Text{ "a #spider in the wasteland# holds", /*french*/ "#l'araignée dans le désert# donne", - /*spanish*/ "una #Skulltula del desierto encantado# otorga" }, - }); - - hintTable[RHT_GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST] = HintText::Sometimes({ - // obscure text - Text{ "#flames in the Composers' Grave# reveal", - /*french*/ "#les flammes dans le tombeau des compositeurs# cachent", - /*spanish*/ "#las llamas del Panteón Real# revelan" }, - Text{ "the #Composer Brothers hid#", /*french*/ "#les Frères compositeurs on caché#", - /*spanish*/ "los #hermanos compositores esconden#" }, - }); - - hintTable[RHT_ZF_BOTTOM_FREESTANDING_POH] = HintText::Sometimes({ - // obscure text - Text{ "#under the icy waters# lies", /*french*/ "#sous les eaux glacées# se cache", - /*spanish*/ "#bajo las congeladas aguas# yace" }, - }); - - hintTable[RHT_GC_POT_FREESTANDING_POH] = HintText::Sometimes({ - // obscure text - Text{ "spinning #Goron pottery# contains", /*french*/ "la #potterie Goron# contient", - /*spanish*/ "una #cerámica goron# contiene" }, - }); - - hintTable[RHT_ZD_KING_ZORA_THAWED] = HintText::Sometimes( - { - // obscure text - Text{ "a #defrosted dignitary# gifts", /*french*/ "le #monarque libéré# donne", - /*spanish*/ "una #liberación monárquica# brinda" }, - }, - {}, - // clear text - Text{ "unfreezing #King Zora# grants", /*french*/ "dégeler # le Roi Zora# donne", - /*spanish*/ "#descongelar al Rey Zora# conduce a" }); - - hintTable[RHT_ZD_TRADE_PRESCRIPTION] = HintText::Sometimes({ - // obscure text - Text{ "#King Zora# hurriedly entrusts", /*french*/ "le #roi Zora# confie rapidement", - /*spanish*/ "el #Rey Zora# otorga con prisa" }, - }); - - hintTable[RHT_DMC_DEKU_SCRUB] = HintText::Sometimes({ - // obscure text - Text{ "a single #scrub in the crater# sells", /*french*/ "la #peste Mojo dans le cratère# vend", - /*spanish*/ "un solitario #deku del cráter# vende" }, - }); - - hintTable[RHT_DMC_GS_CRATE] = HintText::Sometimes({ - // obscure text - Text{ "a spider under a #crate in the crater# holds", /*french*/ "la Skulltula dans une #boîte volcanique# a", - /*spanish*/ "una Skulltula bajo una #caja del cráter# otorga" }, - }); - - hintTable[RHT_DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST] = HintText::Sometimes( - { - // obscure text - Text{ "a #temporal stone within a tree# contains", /*french*/ "la #pierre bleue dans un arbre# mène à", - /*spanish*/ "un #bloque temporal de un árbol# contiene" }, - }, - {}, - // clear text - Text{ "a #temporal stone within the Deku Tree# contains", - /*french*/ "la #pierre temporelle dans l'Arbre Mojo# cache", - /*spanish*/ "un #bloque temporal del Gran Árbol Deku# contiene" }); - - hintTable[RHT_DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM] = HintText::Sometimes( - { - // obscure text - Text{ "a #spider on a ceiling in a tree# holds", /*french*/ "l'#araignée haut-perchée dans un arbre# a", - /*spanish*/ "una #Skulltula en el techo de un árbol# otorga" }, - }, - {}, - // clear text - Text{ "a #spider on a ceiling in the Deku Tree# holds", - /*french*/ "la#Skulltula dans le Cimetière de l'Arbre Mojo# a", - /*spanish*/ "una #Skulltula en el techo del Gran Árbol Deku# otorga" }); - - hintTable[RHT_DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM] = HintText::Sometimes( - { - // obscure text - Text{ "a spider under #temporal stones in a cavern# holds", - /*french*/ "l'araignée sous #une pierre bleue dans une caverne# a", - /*spanish*/ "una Skulltula bajo #bloques temporales de una cueva# otorga" }, - }, - {}, - // clear text - Text{ "a spider under #temporal stones in Dodongo's Cavern# holds", - /*french*/ "la Skulltula sous #la pierre temporelle dans la Caverne Dodongo# a", - /*spanish*/ "una Skulltula bajo #bloques temporales de la Cueva de los Dodongos# otorga" }); - - hintTable[RHT_JABU_JABUS_BELLY_BOOMERANG_CHEST] = HintText::Sometimes( - { - // obscure text - Text{ "a school of #stingers swallowed by a deity# guard", - /*french*/ "les #raies dans un gardien# protègent", - /*spanish*/ "unos de #stingers engullidos por cierta deidad# guardan" }, - }, - {}, - // clear text - Text{ "a school of #stingers swallowed by Jabu-Jabu# guard", /*french*/ "les #raies dans Jabu-Jabu# protègent", - /*spanish*/ "unos #stingers engullidos por Jabu-Jabu# guardan" }); - - hintTable[RHT_JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM] = HintText::Sometimes( - { - // obscure text - Text{ "a spider surrounded by #shadows in the belly of a deity# holds", - /*french*/ "l'araignée entourée d'#ombres dans le ventre du gardien# possède", - /*spanish*/ "una Skulltula rodeada de #sombras en la tripa de cierta diedad# otorga" }, - }, - {}, - // clear text - Text{ "a spider surrounded by #shadows in Jabu-Jabu's Belly# holds", - /*french*/ "la Skulltula entourée d'#ombres dans Jabu-Jabu# possède", - /*spanish*/ "una Skulltula rodeada de #sombras en la Tripa de Jabu-Jabu# otorga" }); - - hintTable[RHT_JABU_JABUS_BELLY_MQ_COW] = HintText::Sometimes( - { - // obscure text - Text{ "a #cow swallowed by a deity# gifts", /*french*/ "la #vache dans le gardien# donne", - /*spanish*/ "una #vaca engullida por cierta deidad# brinda" }, - }, - {}, - // clear text - Text{ "a #cow swallowed by Jabu-Jabu# gifts", /*french*/ "la #vache avallée par Jabu-Jabu# donne", - /*spanish*/ "una #vaca engullida por Jabu-Jabu# brinda" }); - - hintTable[RHT_FIRE_TEMPLE_SCARECROW_CHEST] = HintText::Sometimes( - { - // obscure text - Text{ "a #scarecrow atop the volcano# hides", /*french*/ "l'#épouvantail au sommet d'un volcan# donne", - /*spanish*/ "un #espantapájaros en lo alto del volcán# esconde" }, - }, - {}, - // clear text - Text{ "#Pierre atop the Fire Temple# hides", /*french*/ "#Pierre au sommet du Temple du Feu# donne", - /*spanish*/ "#Pierre en lo alto del Templo del Fuego# esconde" }); - - hintTable[RHT_FIRE_TEMPLE_MEGATON_HAMMER_CHEST] = HintText::Sometimes( - { - // obscure text - Text{ "the #Flare Dancer atop the volcano# guards a chest containing", - /*french*/ "le #danseur au sommet du volcan# protège", - /*spanish*/ "el #Bailafuego en lo alto del volcán# otorga" }, - }, - {}, - // clear text - Text{ "the #Flare Dancer atop the Fire Temple# guards a chest containing", - /*french*/ "le #Danse-Flamme au sommet du Temple du Feu# protège", - /*spanish*/ "el #Bailaguego en lo alto del Templo del Fuego# otorga" }); - - hintTable[RHT_FIRE_TEMPLE_MQ_CHEST_ON_FIRE] = HintText::Sometimes( - { - // obscure text - Text{ "the #Flare Dancer atop the volcano# guards a chest containing", - /*french*/ "le #danseur au sommet du volcan# protège", - /*spanish*/ "el #Bailafuego en lo alto del volcán# otorga" }, - }, - {}, - // clear text - Text{ "the #Flare Dancer atop the Fire Temple# guards a chest containing", - /*french*/ "le #Danse-Flamme au sommet du Temple du Feu# protège", - /*spanish*/ "el #Bailafuego en lo alto del Templo del Fuego# otorga" }); - - hintTable[RHT_FIRE_TEMPLE_MQ_GS_SKULL_ON_FIRE] = HintText::Sometimes( - { - // obscure text - Text{ "a #spider under a block in the volcano# holds", - /*french*/ "l'#araignée sous un bloc dans le volcan# a", - /*spanish*/ "una #Skulltula bajo el bloque de un volcán# otorga" }, - }, - {}, - // clear text - Text{ "a #spider under a block in the Fire Temple# holds", - /*french*/ "une #Skulltula sous un bloc dans le Temple du Feu# a", - /*spanish*/ "una #Skulltula bajo un bloque del Templo del Fuego# otorga" }); - - hintTable[RHT_WATER_TEMPLE_RIVER_CHEST] = HintText::Sometimes( - { - // obscure text - Text{ "beyond the #river under the lake# waits", /*french*/ "au delà de #la rivière sous le lac# se cache", - /*spanish*/ "tras el #río bajo el lago# yace" }, - }, - {}, - // clear text - Text{ "beyond the #river in the Water Temple# waits", - /*french*/ "au delà de #la rivière dans le Temple de l'Eau# se cache", - /*spanish*/ "tras el #río del Templo del Agua# yace" }); - - hintTable[RHT_WATER_TEMPLE_BOSS_KEY_CHEST] = HintText::Sometimes( - { - // obscure text - Text{ "dodging #rolling boulders under the lake# leads to", - /*french*/ "éviter des #rochers roulants sous le lac# mène à", - /*spanish*/ "esquivar #rocas rodantes bajo el lago# conduce a" }, - }, - {}, - // clear text - Text{ "dodging #rolling boulders in the Water Temple# leads to", - /*french*/ "éviter des #rochers roulants dans le Temple de l'Eau# mène à", - /*spanish*/ "esquivar #rocas rondantes del Templo del Agua# conduce a" }); - - hintTable[RHT_WATER_TEMPLE_GS_BEHIND_GATE] = HintText::Sometimes( - { - // obscure text - Text{ "a spider behind a #gate under the lake# holds", - /*french*/ "l'araignée derrière une #barrière sous le lac# a", - /*spanish*/ "una Skulltula tras #una valla bajo el lago# otorga" }, - }, - {}, - // clear text - Text{ "a spider behind a #gate in the Water Temple# holds", - /*french*/ "la Skulltula derrière une #barrière dans le Temple de l'Eau# a", - /*spanish*/ "una Skulltula tras #una valla del Templo del Agua# otorga" }); - - hintTable[RHT_WATER_TEMPLE_MQ_FREESTANDING_KEY] = HintText::Sometimes( - { - // obscure text - Text{ "hidden in a #box under the lake# lies", /*french*/ "dans une #boîte sous le lac# gît", - /*spanish*/ "en una #caja bajo el lago# yace" }, - }, - {}, - // clear text - Text{ "hidden in a #box in the Water Temple# lies", /*french*/ "dans une #boîte dans le Temple de l'Eau# gît", - /*spanish*/ "en una #caja del Templo del Agua# yace" }); - - hintTable[RHT_WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA] = HintText::Sometimes( - { - // obscure text - Text{ "the #locked spider under the lake# holds", /*french*/ "l'#araignée emprisonnée sous le lac# a", - /*spanish*/ "la #Skulltula enjaulada bajo el lago# otorga" }, - }, - {}, - // clear text - Text{ "the #locked spider in the Water Temple# holds", - /*french*/ "une #Skulltula emprisonnée dans le Temple de l'Eau# a", - /*spanish*/ "la #Skulltula enjaulada del Templo del Agua# otorga" }); - - hintTable[RHT_WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH] = HintText::Sometimes( - { - // obscure text - Text{ "a spider behind a #gate under the lake# holds", - /*french*/ "l'#araignée derrière une barrière sous le lac# a", - /*spanish*/ "una Skulltula tras una #valla bajo el lago# otorga" }, - }, - {}, - // clear text - Text{ "a spider behind a #gate in the Water Temple# holds", - /*french*/ "une #Skulltula derrière une barrière dans le Temple de l'Eau# a", - /*spanish*/ "una Skulltula tras una #valla del Templo del Agua#" }); - - hintTable[RHT_GERUDO_TRAINING_GROUND_UNDERWATER_SILVER_RUPEE_CHEST] = HintText::Sometimes({ - // obscure text - Text{ "those who seek #sunken silver rupees# will find", - /*french*/ "ceux qui pêchent les #joyaux argentés# trouveront", - /*spanish*/ "aquellos que busquen las #rupias plateadas sumergidas# encontrarán" }, - Text{ "the #thieves' underwater training# rewards", /*french*/ "l'#épreuve de plongée des voleurs# recèle", - /*spanish*/ "la #instrucción submarina de las bandidas# premia" }, - }); - - hintTable[RHT_GERUDO_TRAINING_GROUND_MQ_UNDERWATER_SILVER_RUPEE_CHEST] = HintText::Sometimes({ - // obscure text - Text{ "those who seek #sunken silver rupees# will find", - /*french*/ "ceux qui pêchent les #joyaux argentés# trouveront", - /*spanish*/ "aquellos que busquen las #rupias plateadas sumergidas# encontrarán" }, - Text{ "the #thieves' underwater training# rewards", /*french*/ "l'#épreuve de plongée des voleurs# recèle", - /*spanish*/ "la #instrucción submarina de las bandidas# premia" }, - }); - - hintTable[RHT_GERUDO_TRAINING_GROUND_MAZE_PATH_FINAL_CHEST] = HintText::Sometimes({ - // obscure text - Text{ "the final prize of #the thieves' training# is", - /*french*/ "la récompense ultime de #l'épreuve des voleurs# est", - /*spanish*/ "la recompensa final de la #instrucción de las bandida# brinda" }, - }); - - hintTable[RHT_GERUDO_TRAINING_GROUND_MQ_ICE_ARROWS_CHEST] = HintText::Sometimes({ - // obscure text - Text{ "the final prize of #the thieves' training# is", - /*french*/ "la récompense ultime de #l'épreuve des voleurs# est", - /*spanish*/ "el premio final de la #instrucción de las bandidas# brinda" }, - }); - - hintTable[RHT_BOTTOM_OF_THE_WELL_LENS_OF_TRUTH_CHEST] = HintText::Sometimes( - { - // obscure text - Text{ "the well's #grasping ghoul# hides", /*french*/ "la #terreur du Puits# cache", - /*spanish*/ "en las #profundidades del pozo# se esconde" }, - Text{ "a #nether dweller in the well# holds", /*french*/ "le #spectre qui réside dans le Puits# a", - /*spanish*/ "el #temido morador del pozo# concede" }, - }, - {}, - // clear text - Text{ "#Dead Hand in the well# holds", /*french*/ "le #Poigneur dans le Puits# cache", - /*spanish*/ "la #Mano Muerta del pozo# concede" }); - - hintTable[RHT_BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST] = HintText::Sometimes( - { - // obscure text - Text{ "the well's #grasping ghoul# hides", /*french*/ "la #terreur du Puits# cache", - /*spanish*/ "en las #profundidades del pozo# se esconde" }, - Text{ "a #nether dweller in the well# holds", /*french*/ "le #spectre qui réside dans le Puits# a", - /*spanish*/ "el #temido morador del pozo# concede" }, - }, - {}, - // clear text - Text{ "#Dead Hand in the well# holds", /*french*/ "le #Poigneur dans le Puits# cache", - /*spanish*/ "la #Mano Muerta del pozo# concede" }); - - hintTable[RHT_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST] = HintText::Sometimes( - { - // obscure text - Text{ "the treasure #sought by Nabooru# is", /*french*/ "le trésor que #recherche Nabooru# est", - /*spanish*/ "el #ansiado tesoro de Nabooru# brinda" }, - }, - {}, - // clear text - Text{ "upon the #Colossus's right hand# is", /*french*/ "sur la #main droite du colosse# repose", - /*spanish*/ "en la #mano derecha del Coloso# yace" }); - - hintTable[RHT_SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST] = HintText::Sometimes({ - // obscure text - Text{ "upon the #Colossus's left hand# is", /*french*/ "sur la #main gauche du colosse# repose", - /*spanish*/ "en la #mano izquierda del Coloso# yace" }, - }); - - hintTable[RHT_SPIRIT_TEMPLE_MQ_CHILD_HAMMER_SWITCH_CHEST] = HintText::Sometimes( - { - // obscure text - Text{ "a #temporal paradox in the Colossus# yields", - /*french*/ "un #paradoxe temporel dans le colosse# révèle", - /*spanish*/ "una #paradoja temporal del Coloso# conduce a" }, - }, - {}, - // clear text - Text{ "a #temporal paradox in the Spirit Temple# yields", - /*french*/ "le #paradoxe temporel dans le Temple de l'Esprit# révèle", - /*spanish*/ "una #paradoja temporal del Coloso# conduce a" }); - - hintTable[RHT_SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM_CHEST] = HintText::Sometimes( - { - // obscure text - Text{ "a #symphony in the Colossus# yields", /*french*/ "la #symphonie du colosse# révèle", - /*spanish*/ "una #sinfonía del Coloso# conduce a" }, - }, - {}, - // clear text - Text{ "a #symphony in the Spirit Temple# yields", - /*french*/ "les #cinq chansons du Temple de l'Esprit# révèlent", - /*spanish*/ "una #sinfonía del Coloso# conduce a" }); - - hintTable[RHT_SPIRIT_TEMPLE_MQ_GS_SYMPHONY_ROOM] = HintText::Sometimes( - { - // obscure text - Text{ "a #spider's symphony in the Colossus# yields", - /*french*/ "la #mélodie de l'araignée du colosse# révèle", - /*spanish*/ "la #Skulltula de la sinfonía del Coloso# otorga" }, - }, - {}, - // clear text - Text{ "a #spider's symphony in the Spirit Temple# yields", - /*french*/ "la #mélodie de la Skulltula du Temple de l'Esprit# révèle", - /*spanish*/ "la #Skulltula de la sinfonía del Coloso# otorga" }); - - hintTable[RHT_SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST] = HintText::Sometimes({ - // obscure text - Text{ "shadows in an #invisible maze# guard", /*french*/ "les ombres dans le #labyrinthe invisible# protègent", - /*spanish*/ "las sombras del #laberinto misterioso# esconden" }, - }); - - hintTable[RHT_SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST] = HintText::Sometimes({ - // obscure text - Text{ "shadows in an #invisible maze# guard", /*french*/ "les ombres dans le #labyrinthe invisible# protègent", - /*spanish*/ "las sombras del #laberinto invisible# esconden" }, - }); + hintTextTable[RHT_KF_LINKS_HOUSE_COW] = HintText(CustomMessage("They say that #Malon's obstacle course# leads to #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #course à obstacle de Malon# amène à #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/la #carrera de obstáculos de Malon# brinda #[[1]]#. + {}, + {CustomMessage("They say that the #bovine bounty of a horseback hustle# gifts #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le cadeau #qui découle d'une réussite équestre# est #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/la #recompensa bovina de un paseo a caballo# brinda #[[1]]#. + + hintTextTable[RHT_KAK_100_GOLD_SKULLTULA_REWARD] = HintText(CustomMessage("They say that slaying #100 Gold Skulltulas# reveals #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, détruire #100 Skulltulas d'or# donne #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/exterminar #100 skulltulas doradas# revela #[[1]]#. + {}, + {CustomMessage("They say that #100 bug badges# rewards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #100 écussons# donnent #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/#100 medallas de insectos# otorgan #[[1]]#. + CustomMessage("They say that #100 spider souls# yields #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #100 âmes d'arachnide# donnent #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/#100 almas de araña# otorgan #[[1]]#. + CustomMessage("They say that #100 auriferous arachnids# lead to #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #100 arachnides aurifères# donnent #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/#100 arácnidos auríferos# otorgan #[[1]]#. + + hintTextTable[RHT_SONG_FROM_OCARINA_OF_TIME] = HintText(CustomMessage("They say that the #Ocarina of Time# teaches #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#Ocarina du Temps# est accompagné par #[[1]]#.", {QM_RED, QM_GREEN})), + // /*spanish*/la #Ocarina del Tiempo# enseña #[[1]]#. + + hintTextTable[RHT_SONG_FROM_ROYAL_FAMILYS_TOMB] = HintText(CustomMessage("They say that #ReDead in the Composers' Grave# guard #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #Éffrois du tombeau des compositeurs# protègent #[[1]]#.", {QM_RED, QM_GREEN})), + // /*spanish*/los #ReDeads del Panteón Real# guardan #[[1]]#. + + hintTextTable[RHT_SHEIK_IN_FOREST] = HintText(CustomMessage("They say that #in a meadow# Sheik teaches #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, Sheik confiera, #dans un bosquet#, #[[1]]#.", {QM_RED, QM_GREEN})), + // /*spanish*/#en la pradera sagrada# Sheik enseña #[[1]]#. + + hintTextTable[RHT_SHEIK_AT_TEMPLE] = HintText(CustomMessage("They say that Sheik waits at a #monument to time# to teach #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, Sheik confiera, #au pied de l'épée légendaire#, #[[1]]#.", {QM_RED, QM_GREEN})), + // /*spanish*/Sheik espera en el #momumento del tiempo# para enseñar #[[1]]#. + + hintTextTable[RHT_SHEIK_IN_CRATER] = HintText(CustomMessage("They say that the #crater's melody# is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, Sheik confiera, #entouré de lave#, #[[1]]#.", {QM_RED, QM_GREEN})), + // /*spanish*/la #melodía del cráter# otorga #[[1]]#. + + hintTextTable[RHT_SHEIK_IN_ICE_CAVERN] = HintText(CustomMessage("They say that the #frozen cavern# echoes with #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, Sheik confiera, #dans une caverne enneigée#, #[[1]]#.", {QM_RED, QM_GREEN})), + // /*spanish*/en la #caverna de hielo# retumban los ecos de #[[1]]#. + + hintTextTable[RHT_SHEIK_IN_KAKARIKO] = HintText(CustomMessage("They say that a #ravaged village# mourns with #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, Sheik confirera, #au coeur d'un village ravagé#, #[[1]]#.", {QM_RED, QM_GREEN})), + // /*spanish*/un #arrasado pueblo# llora #[[1]]#. + + hintTextTable[RHT_SHEIK_AT_COLOSSUS] = HintText(CustomMessage("They say that a hero ventures #beyond the wasteland# to learn #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, Sheik confiera, #au bout d'un chemin sableux#, #[[1]]#.", {QM_RED, QM_GREEN})), + // /*spanish*/el héroe que se adentre #más allá del desierto# aprenderá #[[1]]#. + + hintTextTable[RHT_MARKET_10_BIG_POES] = HintText(CustomMessage("They say that catching #Big Poes# leads to #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #d'attraper des Àmes# donne #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/hacerte con #Grandes Poes# conduce a #[[1]]#. + {}, + {CustomMessage("They say that #ghost hunters# will be rewarded with #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #les chasseurs de fantômes# sont récompensés avec #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/los #cazafantasmas# son premiados con #[[1]]#. + + hintTextTable[RHT_DEKU_THEATER_SKULL_MASK] = HintText(CustomMessage("They say that the #Skull Mask# yields #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #Masque de Mort# donne #[[1]]#.", {QM_RED, QM_GREEN})), + // /*spanish*/la #máscara de calavera# otorga #[[1]]#. + + hintTextTable[RHT_DEKU_THEATER_MASK_OF_TRUTH] = HintText(CustomMessage("They say that the #Mask of Truth# yields #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #Masque de Vérité# donne #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/la #máscara de la verdad# premia #[[1]]#. + {}, + {CustomMessage("They say that showing a #truthful eye to the crowd# rewards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, montrer #l'oeil de vérité à la foule# donne #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/#mostrarle el ojo verdadero# a una multitud brinda #[[1]]#. + + hintTextTable[RHT_HF_OCARINA_OF_TIME_ITEM] = HintText(CustomMessage("They say that the #treasure thrown by Princess Zelda# is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le trésor #laissé par la princesse# est #[[1]]#.", {QM_RED, QM_GREEN})), + // /*spanish*/el #tesoro arrojado por la Princesa Zelda# se trata de #[[1]]#. + + hintTextTable[RHT_DMT_TRADE_BROKEN_SWORD] = HintText(CustomMessage("They say that a #blinded Biggoron# entrusts #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, They say that un #Grogoron aveuglé# confie #[[1]]#.", {QM_RED, QM_GREEN})), + // /*spanish*/un #miope Biggoron# otorga #[[1]]#. + + hintTextTable[RHT_DMT_TRADE_EYEDROPS] = HintText(CustomMessage("They say that while you wait, #Biggoron# gives #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, pendant que tu attends, #Biggoron# donne #[[1]]#.", {QM_RED, QM_GREEN})), + // /*spanish*/#Biggoron# está a la espera de otorgar #[[1]]#. + + hintTextTable[RHT_DMT_TRADE_CLAIM_CHECK] = HintText(CustomMessage("They say that #Biggoron# crafts #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #Biggoron# fabrique #[[1]]#.", {QM_RED, QM_GREEN})), + // /*spanish*/#Biggoron# forja #[[1]]#. + + hintTextTable[RHT_KAK_50_GOLD_SKULLTULA_REWARD] = HintText(CustomMessage("They say that slaying #50 Gold Skulltulas# reveals #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, détruire #50 Skulltulas d'or# donne #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/exterminar #50 skulltulas doradas# revela #[[1]]#. + {}, + {CustomMessage("They say that #50 bug badges# rewards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #50 écussons# donnent #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/#50 medallas de insectos# otorgan #[[1]]#. + CustomMessage("They say that #50 spider souls# yields #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #50 âmes d'arachnide# donnent #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/#50 almas de araña# otorgan #[[1]]#. + CustomMessage("They say that #50 auriferous arachnids# lead to #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #50 arachnides aurifères# donnent #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/#50 arácnidos auríferos# otorgan #[[1]]#. + + hintTextTable[RHT_KAK_40_GOLD_SKULLTULA_REWARD] = HintText(CustomMessage("They say that slaying #40 Gold Skulltulas# reveals #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, détruire #40 Skulltulas d'or# donne #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/exterminar #40 skulltulas doradas# revela #[[1]]#. + {}, + {CustomMessage("They say that #40 bug badges# rewards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #40 écussons# donnent #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/#40 medallas de insectos# otorgan #[[1]]#. + CustomMessage("They say that #40 spider souls# yields #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #40 âmes d'arachnide# donnent #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/#40 almas de araña# otorgan #[[1]]#. + CustomMessage("They say that #40 auriferous arachnids# lead to #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #40 arachnides aurifères# donnent #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/#40 arácnidos auríferos# otorgan #[[1]]#. + + hintTextTable[RHT_KAK_30_GOLD_SKULLTULA_REWARD] = HintText(CustomMessage("They say that slaying #30 Gold Skulltulas# reveals #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, détruire #30 Skulltulas d'or# donne #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/exterminar #30 skulltulas doradas# revela #[[1]]#. + {}, + {CustomMessage("They say that #30 bug badges# rewards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #30 écussons# donnent #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/#30 medallas de insectos# otorgan #[[1]]#. + CustomMessage("They say that #30 spider souls# yields #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #30 âmes d'arachnide# donnent #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/#30 almas de araña# otorgan #[[1]]#. + CustomMessage("They say that #30 auriferous arachnids# lead to #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #30 arachnides aurifères# donnent #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/#30 arácnidos auríferos# otorgan #[[1]]#. + + hintTextTable[RHT_KAK_20_GOLD_SKULLTULA_REWARD] = HintText(CustomMessage("They say that slaying #20 Gold Skulltulas# reveals #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, détruire #20 Skulltulas d'or# donne #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/exterminar #20 skulltulas doradas# revela #[[1]]#. + {}, + {CustomMessage("They say that #20 bug badges# rewards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #20 écussons# donnent #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/#20 medallas de insectos# otorgan #[[1]]#. + CustomMessage("They say that #20 spider souls# yields #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #20 âmes d'arachnide# donnent #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/#20 almas de araña# otorgan #[[1]]#. + CustomMessage("They say that #20 auriferous arachnids# lead to #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #20 arachnides aurifères# donnent #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/#20 arácnidos auríferos# otorgan #[[1]]#. + + hintTextTable[RHT_KAK_ANJU_AS_CHILD] = HintText(CustomMessage("They say that #collecting cuccos# rewards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #rapporter les Cocottes# donne #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/#hacerte con todos los cucos# premia #[[1]]#. + {}, + {CustomMessage("They say that #wrangling roosters# rewards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #plumer des poulets# donne #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/#atrapar a las gallinas# premia #[[1]]#. + CustomMessage("They say that #chucking chickens# gifts #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #lancer des poulets# donne #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/#reunir a unos emplumados# premia #[[1]]#. + + hintTextTable[RHT_KAK_TRADE_POCKET_CUCCO] = HintText(CustomMessage("They say that an adult's #happy Cucco# awards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, un adulte avec une #poulette joyeuse# obtient #[[1]]#.", {QM_RED, QM_GREEN})), + // /*spanish*/un #alegre cuco# en la madurez otorga #[[1]]#. + + hintTextTable[RHT_KAK_TRADE_ODD_MUSHROOM] = HintText(CustomMessage("They say that the #potion shop lady# entrusts #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #gribiche du magasin de potion# confie #[[1]]#.", {QM_RED, QM_GREEN})), + // /*spanish*/la #señora de la tienda de pociones# otorga #[[1]]#. + + hintTextTable[RHT_GC_DARUNIAS_JOY] = HintText(CustomMessage("They say that #Darunia's dance# leads to #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #la dance de Darunia# donne #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/#el baile de Darunia# conduce a #[[1]]#. + {}, + {CustomMessage("They say that a #groovin' goron# gifts #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #le Goron joyeux# donne #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/#un goron marchoso# otorga #[[1]]#. + + hintTextTable[RHT_LW_SKULL_KID] = HintText(CustomMessage("They say that the #Skull Kid# grants #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #Skull Kid# donne #[[1]]#.", {QM_RED, QM_GREEN})), + // /*spanish*/#Skull Kid# otorga #[[1]]#. + + hintTextTable[RHT_LW_TRADE_COJIRO] = HintText(CustomMessage("They say that returning a #special Cucco# awards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, ramener une #poulette précieuse# donne #[[1]]#.", {QM_RED, QM_GREEN})), + // /*spanish*/quien devuelva un #cuco especial# encontrará #[[1]]#. + + hintTextTable[RHT_LW_TRADE_ODD_POTION] = HintText(CustomMessage("They say that a #Kokiri girl in the woods# leaves #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #fillette Kokiri dans les bois# laisse #[[1]]#.", {QM_RED, QM_GREEN})), + // /*spanish*/una #chica kokiri del bosque# otorga #[[1]]#. + + hintTextTable[RHT_LH_SUN] = HintText(CustomMessage("They say that shooting #the sun# grants #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, tirer une flèche dans #sur le soleil# donne #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/#disparar al sol# revela #[[1]]#. + {}, + {CustomMessage("They say that staring into #the sun# grants #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, regarder #le soleil# donne #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/#mirar al sol# revela #[[1]]#. + + hintTextTable[RHT_LH_TRADE_FROG] = HintText(CustomMessage("They say that #Lake Hylia's scientist# hurriedly entrusts #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #scientifique du lac# confie rapidement #[[1]]#.", {QM_RED, QM_GREEN})), + // /*spanish*/el #científico del Lago Hylia# otorga con prisa #[[1]]#. + + hintTextTable[RHT_MARKET_TREASURE_CHEST_GAME_REWARD] = HintText(CustomMessage("They say that the #treasure chest game# grants #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #Chasse-aux-Trésors# donne #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/#el Cofre del Tesoro# premia #[[1]]#. + {}, + {CustomMessage("They say that #gambling# grants #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #parier# donne #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/#los juegos de azar# revelan #[[1]]#. + CustomMessage("They say that there is a #1/32 chance# to win #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, être #le gagnant parmi 32# donne #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/hay una #probabilidad de 1/32# de ganar #[[1]]#. + + hintTextTable[RHT_MARKET_TREASURE_CHEST_GAME_ITEM_1] = HintText(CustomMessage("They say that the #first locked room# in the chest game contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #première salle# de la Chasse-aux-Trésors contient #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/#en la primera sala del Cofre del Tesoro# aguarda #[[1]]#. + {}, + {CustomMessage("They say that #gambling once# grants #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #parier une fois# donne #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/#apostar solo una vez# revelará #[[1]]#. + CustomMessage("They say that the #first or second game chest# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #premier ou deuxième coffre à jeu# contient #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/#el primer o segundo cofre del azar# revela #[[1]]#. + + hintTextTable[RHT_MARKET_TREASURE_CHEST_GAME_ITEM_2] = HintText(CustomMessage("They say that the #second locked room# in the chest game contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #deuxième salle# de la Chasse-aux-Trésors contient #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/#en la segunda sala del Cofre del Tesoro# aguarda #[[1]]#. + {}, + {CustomMessage("They say that #gambling twice# grants #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #parier deux fois# donne #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/#apostar dos veces# revelará #[[1]]#. + CustomMessage("They say that the #third or fourth game chest# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #troisième ou quatrième coffre à jeu# contient #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/#el tercer o cuarto cofre del azar# revela #[[1]]#. + + hintTextTable[RHT_MARKET_TREASURE_CHEST_GAME_ITEM_3] = HintText(CustomMessage("They say that the #third locked room# in the chest game contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #troisième salle# de la Chasse-aux-Trésors contient #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/#en la tercera sala del Cofre del Tesoro# aguarda #[[1]]#. + {}, + {CustomMessage("They say that #gambling 3 times# grants #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #parier trois fois# donne #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/#apostar tres veces# revelará #[[1]]#. + CustomMessage("They say that the #fifth or sixth game chest# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #cinquième ou sixième coffre à jeu# contient #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/#el quinto o sexto cofre del azar# revela #[[1]]#. + + hintTextTable[RHT_MARKET_TREASURE_CHEST_GAME_ITEM_4] = HintText(CustomMessage("They say that the #fourth locked room# in the chest game contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #quatrième salle# de la Chasse-aux-Trésors contient #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/#en la cuarta sala del Cofre del Tesoro# aguarda #[[1]]#. + {}, + {CustomMessage("They say that #gambling 4 times# grants #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #parier quatre fois# donne #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/#apostar cuatro veces# revelará #[[1]]#. + CustomMessage("They say that the #seventh or eighth game chest# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #septième ou huitième coffre à jeu# contient #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/#el séptimo u octavo cofre del azar# revela #[[1]]#. + + hintTextTable[RHT_MARKET_TREASURE_CHEST_GAME_ITEM_5] = HintText(CustomMessage("They say that the #fifth locked room# in the chest game contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #cinquième salle# de la Chasse-aux-Trésors contient #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/#en la quinta sala del Cofre del Tesoro# aguarda #[[1]]#. + {}, + {CustomMessage("They say that #gambling 5 times# grants #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #parier cinq fois# donne #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/#apostar cinco veces# revelará #[[1]]#. + CustomMessage("They say that the #ninth or tenth game chest# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #neuvième ou dixième coffre à jeu# contient #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/#el noveno o décimo cofre del azar# revela #[[1]]#. + + hintTextTable[RHT_GF_HBA_1500_POINTS] = HintText(CustomMessage("They say that scoring 1500 in #horseback archery# grants #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, obtenir 1500 points dans l'#archerie équestre# donne #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/conseguir 1500 puntos en el #tiro con arco a caballo# premia #[[1]]#. + {}, + {CustomMessage("They say that mastery of #horseback archery# grants #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, maîtriser l'#archerie équestre# donne #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/dominar el #tiro con arco a caballo# premia con #[[1]]#. + + hintTextTable[RHT_GRAVEYARD_HEART_PIECE_GRAVE_CHEST] = HintText(CustomMessage("They say that playing #Sun's Song# in a grave spawns #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, jouer le #chant du soleil# dans un tombeau donne #[[1]]#.", {QM_RED, QM_GREEN})), + // /*spanish*/#tocar la Canción del Sol# en una cripta conduce a #[[1]]#. + + hintTextTable[RHT_GC_MAZE_LEFT_CHEST] = HintText(CustomMessage("They say that in #Goron City# the hammer unlocks #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, dans le #village Goron#, le marteau donne accès à #[[1]]#.", {QM_RED, QM_GREEN})), + // /*spanish*/en la #Ciudad Goron# el martillo desbloquea #[[1]]#. + + hintTextTable[RHT_GV_CHEST] = HintText(CustomMessage("They say that in #Gerudo Valley# the hammer unlocks #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, dans la #Vallée Gerudo#, le marteau donne accès à #[[1]]#.", {QM_RED, QM_GREEN})), + // /*spanish*/en el #Valle Gerudo# el martillo desbloquea #[[1]]#. + + + hintTextTable[RHT_GV_TRADE_SAW] = HintText(CustomMessage("They say that the #boss of the carpenters# leaves #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #patron des ouvriers# laisse #[[1]]#.", {QM_RED, QM_GREEN})), + // /*spanish*/el #capataz de los carpinteros# otorga #[[1]]#. + + hintTextTable[RHT_GV_COW] = HintText(CustomMessage("They say that a #cow in Gerudo Valley# gifts #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #vache de la Vallée Gerudo# donne #[[1]]#.", {QM_RED, QM_GREEN})), + // /*spanish*/una #vaca del Valle Gerudo# brinda #[[1]]#. + + hintTextTable[RHT_HC_GS_STORMS_GROTTO] = HintText(CustomMessage("They say that a #spider behind a muddy wall# in a grotto holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#araignée derrière un mur de boue# dans une grotte donne #[[1]]#.", {QM_RED, QM_GREEN})), + // /*spanish*/una #Skulltula tras la agrietada pared# de una cueva otorga #[[1]]#. + + hintTextTable[RHT_HF_GS_COW_GROTTO] = HintText(CustomMessage("They say that a #spider behind webs# in a grotto holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#araignée derrière une toile# dans une grotte donne #[[1]]#.", {QM_RED, QM_GREEN})), + // /*spanish*/una #Skulltula tras la telaraña# de una cueva otorga #[[1]]#. + + hintTextTable[RHT_HF_COW_GROTTO_COW] = HintText(CustomMessage("They say that a #cow behind webs# in a grotto gifts #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #vache derrière les toiles# d'une grotte donne #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/una #vaca tras la telaraña# de una cueva brinda #[[1]]#. + {}, + {CustomMessage("They say that the #cobwebbed cow# gifts #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #vache prisonnière d'araignées# donne #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/una #vaca tras una telaraña# brinda #[[1]]#. + + hintTextTable[RHT_ZR_FROGS_OCARINA_GAME] = HintText(CustomMessage("They say that the final reward from the #Frogs of Zora's River# is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la dernière récompense des #grenouilles de la Rivière Zora# est #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/la recompensa final de las #ranas del Río Zora# premia #[[1]]#. + {}, + {CustomMessage("They say that an #amphibian feast# yields #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, un #festin d'amphibiens# donne #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/una #fiesta anfibia# brinda #[[1]]#. + CustomMessage("They say that the #croaking choir's magnum opus# awards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #chorale coassante# donne #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/un #coro maestro de ancas# premia #[[1]]#. + CustomMessage("They say that the #froggy finale# yields #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #finale amphibienne# donne #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/el #gran final batracio# brinda #[[1]]#. + + hintTextTable[RHT_ZF_GS_HIDDEN_CAVE] = HintText(CustomMessage("They say that a spider high #above the icy waters# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'araignée #en haut des eaux glacées# donne #[[1]]#.", {QM_RED, QM_GREEN})), + // /*spanish*/una Skulltula en lo #alto de las congeladas aguas# otorga #[[1]]#. + + hintTextTable[RHT_WASTELAND_CHEST] = HintText(CustomMessage("They say that #deep in the wasteland# is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #loin dans le désert# gît #[[1]]#.", {QM_RED, QM_GREEN})), + // /*spanish*/en lo #profundo del desierto encantado# yace #[[1]]#. + + hintTextTable[RHT_WASTELAND_GS] = HintText(CustomMessage("They say that a #spider in the wasteland# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #l'araignée dans le désert# donne #[[1]]#.", {QM_RED, QM_GREEN})), + // /*spanish*/una #Skulltula del desierto encantado# otorga #[[1]]#. + + hintTextTable[RHT_GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST] = HintText(CustomMessage("They say that #flames in the Composers' Grave# reveal #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #les flammes dans le tombeau des compositeurs# cachent #[[1]]#.", {QM_RED, QM_GREEN})), + // /*spanish*/#las llamas del Panteón Real# revelan #[[1]]#. + + hintTextTable[RHT_ZF_BOTTOM_FREESTANDING_POH] = HintText(CustomMessage("They say that #under the icy waters# lies #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #sous les eaux glacées# se cache #[[1]]#.", {QM_RED, QM_GREEN})), + // /*spanish*/#bajo las congeladas aguas# yace #[[1]]#. + + hintTextTable[RHT_GC_POT_FREESTANDING_POH] = HintText(CustomMessage("They say that spinning #Goron pottery# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #potterie Goron# contient #[[1]]#.", {QM_RED, QM_GREEN})), + // /*spanish*/una #cerámica goron# contiene #[[1]]#. + + hintTextTable[RHT_ZD_KING_ZORA_THAWED] = HintText(CustomMessage("They say that unfreezing #King Zora# grants #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, dégeler # le Roi Zora# donne #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/#descongelar al Rey Zora# conduce a #[[1]]#. + {}, + {CustomMessage("They say that a #defrosted dignitary# gifts #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #monarque libéré# donne #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/una #liberación monárquica# brinda #[[1]]#. + + hintTextTable[RHT_ZD_TRADE_PRESCRIPTION] = HintText(CustomMessage("They say that #King Zora# hurriedly entrusts #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #roi Zora# confie rapidement #[[1]]#.", {QM_RED, QM_GREEN})), + // /*spanish*/el #Rey Zora# otorga con prisa #[[1]]#. + + hintTextTable[RHT_DMC_DEKU_SCRUB] = HintText(CustomMessage("They say that a single #scrub in the crater# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #peste Mojo dans le cratère# vend #[[1]]#.", {QM_RED, QM_GREEN})), + // /*spanish*/un solitario #deku del cráter# vende #[[1]]#. + hintTextTable[RHT_DMC_GS_CRATE] = HintText(CustomMessage("They say that a spider under a #crate in the crater# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la Skulltula dans une #boîte volcanique# a #[[1]]#.", {QM_RED, QM_GREEN})), + // /*spanish*/una Skulltula bajo una #caja del cráter# otorga #[[1]]#. + + hintTextTable[RHT_DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST] = HintText(CustomMessage("They say that a #temporal stone within the Deku Tree# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #pierre temporelle dans l'Arbre Mojo# cache #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/un #bloque temporal del Gran Árbol Deku# contiene #[[1]]#. + {}, + {CustomMessage("They say that a #temporal stone within a tree# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #pierre bleue dans un arbre# mène à #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/un #bloque temporal de un árbol# contiene #[[1]]#. + + + hintTextTable[RHT_DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM] = HintText(CustomMessage("They say that a #spider on a ceiling in the Deku Tree# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la#Skulltula dans le Cimetière de l'Arbre Mojo# a #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/una #Skulltula en el techo del Gran Árbol Deku# otorga #[[1]]#. + {}, + {CustomMessage("They say that a #spider on a ceiling in a tree# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#araignée haut-perchée dans un arbre# a #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/una #Skulltula en el techo de un árbol# otorga #[[1]]#. + + hintTextTable[RHT_DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM] = HintText(CustomMessage("They say that a spider under #temporal stones in Dodongo's Cavern# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la Skulltula sous #la pierre temporelle dans la Caverne Dodongo# a #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/una Skulltula bajo #bloques temporales de la Cueva de los Dodongos# otorga #[[1]]#. + {}, + {CustomMessage("They say that a spider under #temporal stones in a cavern# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'araignée sous #une pierre bleue dans une caverne# a #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/una Skulltula bajo #bloques temporales de una cueva# otorga #[[1]]#. + + + hintTextTable[RHT_JABU_JABUS_BELLY_BOOMERANG_CHEST] = HintText(CustomMessage("They say that a school of #stingers swallowed by Jabu-Jabu# guard #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #raies dans Jabu-Jabu# protègent #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/unos #stingers engullidos por Jabu-Jabu# guardan #[[1]]#. + {}, + {CustomMessage("They say that a school of #stingers swallowed by a deity# guard #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #raies dans un gardien# protègent #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/unos de #stingers engullidos por cierta deidad# guardan #[[1]]#. + + hintTextTable[RHT_JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM] = HintText(CustomMessage("They say that a spider surrounded by #shadows in Jabu-Jabu's Belly# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la Skulltula entourée d'#ombres dans Jabu-Jabu# possède #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/una Skulltula rodeada de #sombras en la Tripa de Jabu-Jabu# otorga #[[1]]#. + {}, + {CustomMessage("They say that a spider surrounded by #shadows in the belly of a deity# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'araignée entourée d'#ombres dans le ventre du gardien# possède #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/una Skulltula rodeada de #sombras en la tripa de cierta diedad# otorga #[[1]]#. + + + hintTextTable[RHT_JABU_JABUS_BELLY_MQ_COW] = HintText(CustomMessage("They say that a #cow swallowed by Jabu-Jabu# gifts #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #vache avallée par Jabu-Jabu# donne #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/una #vaca engullida por Jabu-Jabu# brinda #[[1]]#. + {}, + {CustomMessage("They say that a #cow swallowed by a deity# gifts #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #vache dans le gardien# donne #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/una #vaca engullida por cierta deidad# brinda #[[1]]#. + + hintTextTable[RHT_FIRE_TEMPLE_SCARECROW_CHEST] = HintText(CustomMessage("They say that #Pierre atop the Fire Temple# hides #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #Pierre au sommet du Temple du Feu# donne #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/#Pierre en lo alto del Templo del Fuego# esconde #[[1]]#. + {}, + {CustomMessage("They say that a #scarecrow atop the volcano# hides #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#épouvantail au sommet d'un volcan# donne #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/un #espantapájaros en lo alto del volcán# esconde #[[1]]#. + + hintTextTable[RHT_FIRE_TEMPLE_MEGATON_HAMMER_CHEST] = HintText(CustomMessage("They say that the #Flare Dancer atop the Fire Temple# guards a chest containing #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #Danse-Flamme au sommet du Temple du Feu# protège #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/el #Bailaguego en lo alto del Templo del Fuego# otorga #[[1]]#. + {}, + {CustomMessage("They say that the #Flare Dancer atop the volcano# guards a chest containing #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #danseur au sommet du volcan# protège #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/el #Bailafuego en lo alto del volcán# otorga #[[1]]#. + + hintTextTable[RHT_FIRE_TEMPLE_MQ_CHEST_ON_FIRE] = HintText(CustomMessage("They say that the #Flare Dancer atop the Fire Temple# guards a chest containing #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #Danse-Flamme au sommet du Temple du Feu# protège #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/el #Bailafuego en lo alto del Templo del Fuego# otorga #[[1]]#. + {}, + {CustomMessage("They say that the #Flare Dancer atop the volcano# guards a chest containing #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #danseur au sommet du volcan# protège #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/el #Bailafuego en lo alto del volcán# otorga #[[1]]#. + + hintTextTable[RHT_FIRE_TEMPLE_MQ_GS_SKULL_ON_FIRE] = HintText(CustomMessage("They say that a #spider under a block in the Fire Temple# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula sous un bloc dans le Temple du Feu# a #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/una #Skulltula bajo un bloque del Templo del Fuego# otorga #[[1]]#. + {}, + {CustomMessage("They say that a #spider under a block in the volcano# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#araignée sous un bloc dans le volcan# a #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/una #Skulltula bajo el bloque de un volcán# otorga #[[1]]#. + + + hintTextTable[RHT_WATER_TEMPLE_RIVER_CHEST] = HintText(CustomMessage("They say that beyond the #river in the Water Temple# waits #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, au delà de #la rivière dans le Temple de l'Eau# se cache #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/tras el #río del Templo del Agua# yace #[[1]]#. + {}, + {CustomMessage("They say that beyond the #river under the lake# waits #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, au delà de #la rivière sous le lac# se cache #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/tras el #río bajo el lago# yace #[[1]]#. + + hintTextTable[RHT_WATER_TEMPLE_BOSS_KEY_CHEST] = HintText(CustomMessage("They say that dodging #rolling boulders in the Water Temple# leads to #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, éviter des #rochers roulants dans le Temple de l'Eau# mène à #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/esquivar #rocas rondantes del Templo del Agua# conduce a #[[1]]#. + {}, + {CustomMessage("They say that dodging #rolling boulders under the lake# leads to #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, éviter des #rochers roulants sous le lac# mène à #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/esquivar #rocas rodantes bajo el lago# conduce a #[[1]]#. + + hintTextTable[RHT_WATER_TEMPLE_GS_BEHIND_GATE] = HintText(CustomMessage("They say that a spider behind a #gate in the Water Temple# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la Skulltula derrière une #barrière dans le Temple de l'Eau# a #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/una Skulltula tras #una valla del Templo del Agua# otorga #[[1]]#. + {}, + {CustomMessage("They say that a spider behind a #gate under the lake# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'araignée derrière une #barrière sous le lac# a #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/una Skulltula tras #una valla bajo el lago# otorga #[[1]]#. + + hintTextTable[RHT_WATER_TEMPLE_MQ_FREESTANDING_KEY] = HintText(CustomMessage("They say that hidden in a #box in the Water Temple# lies #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, dans une #boîte dans le Temple de l'Eau# gît #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/en una #caja del Templo del Agua# yace #[[1]]#. + {}, + {CustomMessage("They say that hidden in a #box under the lake# lies #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, dans une #boîte sous le lac# gît #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/en una #caja bajo el lago# yace #[[1]]#. + + hintTextTable[RHT_WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA] = HintText(CustomMessage("They say that the #locked spider in the Water Temple# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula emprisonnée dans le Temple de l'Eau# a #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/la #Skulltula enjaulada del Templo del Agua# otorga #[[1]]#. + {}, + {CustomMessage("They say that the #locked spider under the lake# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#araignée emprisonnée sous le lac# a #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/la #Skulltula enjaulada bajo el lago# otorga #[[1]]#. + + hintTextTable[RHT_WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH] = HintText(CustomMessage("They say that a spider behind a #gate in the Water Temple# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula derrière une barrière dans le Temple de l'Eau# a #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/una Skulltula tras una #valla del Templo del Agua# #[[1]]#. + {}, + {CustomMessage("They say that a spider behind a #gate under the lake# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#araignée derrière une barrière sous le lac# a #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/una Skulltula tras una #valla bajo el lago# otorga #[[1]]#. + + hintTextTable[RHT_GERUDO_TRAINING_GROUND_UNDERWATER_SILVER_RUPEE_CHEST] = HintText(CustomMessage("They say that those who seek #sunken silver rupees# will find #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, ceux qui pêchent les #joyaux argentés# trouveront #[[1]]#.", {QM_RED, QM_GREEN})), + // /*spanish*/aquellos que busquen las #rupias plateadas sumergidas# encontrarán + + hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_UNDERWATER_SILVER_RUPEE_CHEST] = HintText(CustomMessage("They say that those who seek #sunken silver rupees# will find #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, ceux qui pêchent les #joyaux argentés# trouveront #[[1]]#.", {QM_RED, QM_GREEN})), + // /*spanish*/aquellos que busquen las #rupias plateadas sumergidas# encontrarán #[[1]]#. + + hintTextTable[RHT_GERUDO_TRAINING_GROUND_MAZE_PATH_FINAL_CHEST] = HintText(CustomMessage("They say that the final prize of #the thieves' training# is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la récompense ultime de #l'épreuve des voleurs# est #[[1]]#.", {QM_RED, QM_GREEN})), + // /*spanish*/la recompensa final de la #instrucción de las bandida# brinda #[[1]]#. + + hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_ICE_ARROWS_CHEST] = HintText(CustomMessage("They say that the final prize of #the thieves' training# is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la récompense ultime de #l'épreuve des voleurs# est #[[1]]#.", {QM_RED, QM_GREEN})), + // /*spanish*/el premio final de la #instrucción de las bandidas# brinda #[[1]]#. + + hintTextTable[RHT_BOTTOM_OF_THE_WELL_LENS_OF_TRUTH_CHEST] = HintText(CustomMessage("They say that #Dead Hand in the well# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #Poigneur dans le Puits# cache #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/la #Mano Muerta del pozo# concede #[[1]]#. + {}, + {CustomMessage("They say that the well's #grasping ghoul# hides #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #terreur du Puits# cache #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/en las #profundidades del pozo# se esconde #[[1]]#. + CustomMessage("They say that a #nether dweller in the well# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #spectre qui réside dans le Puits# a #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/el #temido morador del pozo# concede #[[1]]#. + + hintTextTable[RHT_BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST] = HintText(CustomMessage("They say that #Dead Hand in the well# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #Poigneur dans le Puits# cache #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/la #Mano Muerta del pozo# concede #[[1]]#. + {}, + {CustomMessage("They say that the well's #grasping ghoul# hides #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #terreur du Puits# cache #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/en las #profundidades del pozo# se esconde #[[1]]#. + CustomMessage("They say that a #nether dweller in the well# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #spectre qui réside dans le Puits# a #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/el #temido morador del pozo# concede #[[1]]#. + + hintTextTable[RHT_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST] = HintText(CustomMessage("They say that upon the #Colossus's right hand# is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, sur la #main droite du colosse# repose #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/en la #mano derecha del Coloso# yace #[[1]]#. + {}, + {CustomMessage("They say that the treasure #sought by Nabooru# is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le trésor que #recherche Nabooru# est #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/el #ansiado tesoro de Nabooru# brinda #[[1]]#. + + hintTextTable[RHT_SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST] = HintText(CustomMessage("They say that upon the #Colossus's left hand# is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, sur la #main gauche du colosse# repose #[[1]]#.", {QM_RED, QM_GREEN})), + // /*spanish*/en la #mano izquierda del Coloso# yace #[[1]]#. + + hintTextTable[RHT_SPIRIT_TEMPLE_MQ_CHILD_HAMMER_SWITCH_CHEST] = HintText(CustomMessage("They say that a #temporal paradox in the Spirit Temple# yields #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #paradoxe temporel dans le Temple de l'Esprit# révèle #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/una #paradoja temporal del Coloso# conduce a #[[1]]#. + {}, + {CustomMessage("They say that a #temporal paradox in the Colossus# yields #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, un #paradoxe temporel dans le colosse# révèle #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/una #paradoja temporal del Coloso# conduce a #[[1]]#. + + hintTextTable[RHT_SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM_CHEST] = HintText(CustomMessage("They say that a #symphony in the Spirit Temple# yields #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #cinq chansons du Temple de l'Esprit# révèlent #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/una #sinfonía del Coloso# conduce a #[[1]]#. + {}, + {CustomMessage("They say that a #symphony in the Colossus# yields #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #symphonie du colosse# révèle #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/una #sinfonía del Coloso# conduce a #[[1]]#. + + hintTextTable[RHT_SPIRIT_TEMPLE_MQ_GS_SYMPHONY_ROOM] = HintText(CustomMessage("They say that a #spider's symphony in the Spirit Temple# yields #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #mélodie de la Skulltula du Temple de l'Esprit# révèle #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/la #Skulltula de la sinfonía del Coloso# otorga #[[1]]#. + {}, + {CustomMessage("They say that a #spider's symphony in the Colossus# yields #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #mélodie de l'araignée du colosse# révèle #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/la #Skulltula de la sinfonía del Coloso# otorga #[[1]]#. + + hintTextTable[RHT_SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST] = HintText(CustomMessage("They say that shadows in an #invisible maze# guard #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les ombres dans le #labyrinthe invisible# protègent #[[1]]#.", {QM_RED, QM_GREEN})), + // /*spanish*/las sombras del #laberinto misterioso# esconden #[[1]]#. + + hintTextTable[RHT_SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST] = HintText(CustomMessage("They say that shadows in an #invisible maze# guard #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les ombres dans le #labyrinthe invisible# protègent #[[1]]#.", {QM_RED, QM_GREEN})), + // /*spanish*/las sombras del #laberinto invisible# esconden #[[1]]#. /*-------------------------- | ENTRANCE HINT TEXT | ---------------------------*/ - hintTable[RHT_DESERT_COLOSSUS_TO_COLOSSUS_GROTTO] = HintText::Entrance({ - // obscure text - Text{ "lifting a #rock in the desert# reveals", /*french*/ "soulever une #roche dans le désert# révèle", - /*spanish*/ "levantar una #roca del desierto# revela" }, - }); + hintTextTable[RHT_DESERT_COLOSSUS_TO_COLOSSUS_GROTTO] = HintText(CustomMessage("They say that lifting a #rock in the desert# reveals #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, soulever une #roche dans le désert# révèle #[[1]]#.", {QM_RED, QM_BLUE})), + // /*spanish*/levantar una #roca del desierto# revela #[[1]]#. - hintTable[RHT_GV_GROTTO_LEDGE_TO_GV_OCTOROK_GROTTO] = HintText::Entrance({ - // obscure text - Text{ "a rock on #a ledge in the valley# hides", /*french*/ "soulever une #roche dans la vallée# révèle", - /*spanish*/ "levantar una #roca al borde del valle# esconde" }, - }); + hintTextTable[RHT_GV_GROTTO_LEDGE_TO_GV_OCTOROK_GROTTO] = HintText(CustomMessage("They say that a rock on #a ledge in the valley# hides #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, soulever une #roche dans la vallée# révèle #[[1]]#.", {QM_RED, QM_BLUE})), + // /*spanish*/levantar una #roca al borde del valle# esconde #[[1]]#. - hintTable[RHT_GC_GROTTO_PLATFORM_TO_GC_GROTTO] = HintText::Entrance({ - // obscure text - Text{ "a #pool of lava# in Goron City blocks the way to", - /*french*/ "l'#étang de lave# dans le village Goron renferme", - /*spanish*/ "un #estanque de lava# en la Ciudad Goron bloquea el paso a" }, - }); + hintTextTable[RHT_GC_GROTTO_PLATFORM_TO_GC_GROTTO] = HintText(CustomMessage("They say that a #pool of lava# in Goron City blocks the way to #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#étang de lave# dans le village Goron renferme #[[1]]#.", {QM_RED, QM_BLUE})), + // /*spanish*/un #estanque de lava# en la Ciudad Goron bloquea el paso a #[[1]]#. - hintTable[RHT_GERUDO_FORTRESS_TO_GF_STORMS_GROTTO] = HintText::Entrance({ - // obscure text - Text{ "a #storm within Gerudo's Fortress# reveals", /*french*/ "la #tempête dans la forteresse# révèle", - /*spanish*/ "una #tormenta en la Fortaleza Gerudo# revela" }, - }); - hintTable[RHT_ZORAS_DOMAIN_TO_ZD_STORMS_GROTTO] = HintText::Entrance({ - // obscure text - Text{ "a #storm within Zora's Domain# reveals", /*french*/ "la #tempête dans le Domaine Zora# révèle", - /*spanish*/ "una #tormenta en la Región de los Zora# revela" }, - }); + hintTextTable[RHT_GERUDO_FORTRESS_TO_GF_STORMS_GROTTO] = HintText(CustomMessage("They say that a #storm within Gerudo's Fortress# reveals #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #tempête dans la forteresse# révèle #[[1]]#.", {QM_RED, QM_BLUE})), + // /*spanish*/una #tormenta en la Fortaleza Gerudo# revela #[[1]]#. - hintTable[RHT_HYRULE_CASTLE_GROUNDS_TO_HC_STORMS_GROTTO] = HintText::Entrance({ - // obscure text - Text{ "a #storm near the castle# reveals", /*french*/ "la #tempête près du château# révèle", - /*spanish*/ "una #tormenta junto al castillo# revela" }, - }); - hintTable[RHT_GV_FORTRESS_SIDE_TO_GV_STORMS_GROTTO] = HintText::Entrance({ - // obscure text - Text{ "a #storm in the valley# reveals", /*french*/ "la #tempête dans la vallée# révèle", - /*spanish*/ "una #tormenta en el valle# revela" }, - }); + hintTextTable[RHT_ZORAS_DOMAIN_TO_ZD_STORMS_GROTTO] = HintText(CustomMessage("They say that a #storm within Zora's Domain# reveals #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #tempête dans le Domaine Zora# révèle #[[1]]#.", {QM_RED, QM_BLUE})), + // /*spanish*/una #tormenta en la Región de los Zora# revela #[[1]]#. - hintTable[RHT_DESERT_COLOSSUS_TO_COLOSSUS_GREAT_FAIRY_FOUNTAIN] = HintText::Entrance({ - // obscure text - Text{ "a #fractured desert wall# hides", /*french*/ "le #mur fragile du désert# cache", - /*spanish*/ "una #agrietada pared del desierto# esconde" }, - }); - hintTable[RHT_GANONS_CASTLE_GROUNDS_TO_OGC_GREAT_FAIRY_FOUNTAIN] = HintText::Entrance({ - // obscure text - Text{ "a #heavy pillar# outside the castle obstructs", /*french*/ "le #rocher fragile près du château# cache", - /*spanish*/ "una #pesada columna# fuera del castillo obstruye" }, - }); + hintTextTable[RHT_HYRULE_CASTLE_GROUNDS_TO_HC_STORMS_GROTTO] = HintText(CustomMessage("They say that a #storm near the castle# reveals #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #tempête près du château# révèle #[[1]]#.", {QM_RED, QM_BLUE})), + // /*spanish*/una #tormenta junto al castillo# revela #[[1]]#. - hintTable[RHT_ZORAS_FOUNTAIN_TO_ZF_GREAT_FAIRY_FOUNTAIN] = HintText::Entrance({ - // obscure text - Text{ "a #fountain wall# hides", /*french*/ "le #mur fragile du réservoir# cache", - /*spanish*/ "una #pared de la fuente# esconde" }, - }); + hintTextTable[RHT_GV_FORTRESS_SIDE_TO_GV_STORMS_GROTTO] = HintText(CustomMessage("They say that a #storm in the valley# reveals #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #tempête dans la vallée# révèle #[[1]]#.", {QM_RED, QM_BLUE})), + // /*spanish*/una #tormenta en el valle# revela #[[1]]#. - hintTable[RHT_GV_FORTRESS_SIDE_TO_GV_CARPENTER_TENT] = HintText::Entrance({ - // obscure text - Text{ "a #tent in the valley# covers", /*french*/ "la #tente dans la vallée# recouvre", - /*spanish*/ "una #tienda de campaña del valle# cubre" }, - }); + hintTextTable[RHT_DESERT_COLOSSUS_TO_COLOSSUS_GREAT_FAIRY_FOUNTAIN] = HintText(CustomMessage("They say that a #fractured desert wall# hides #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #mur fragile du désert# cache #[[1]]#.", {QM_RED, QM_BLUE})), + // /*spanish*/una #agrietada pared del desierto# esconde #[[1]]#. - hintTable[RHT_GRAVEYARD_WARP_PAD_REGION_TO_SHADOW_TEMPLE_ENTRYWAY] = HintText::Entrance({ - // obscure text - Text{ "at the #back of the Graveyard#, there is", /*french*/ "#derrière le Cimetière# gît", - /*spanish*/ "en la #parte trasera del cementerio# se halla" }, - }); + hintTextTable[RHT_GANONS_CASTLE_GROUNDS_TO_OGC_GREAT_FAIRY_FOUNTAIN] = HintText(CustomMessage("They say that a #heavy pillar# outside the castle obstructs #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #rocher fragile près du château# cache #[[1]]#.", {QM_RED, QM_BLUE})), + // /*spanish*/una #pesada columna# fuera del castillo obstruye #[[1]]#. - hintTable[RHT_LAKE_HYLIA_TO_WATER_TEMPLE_LOBBY] = HintText::Entrance({ - // obscure text - Text{ "deep #under a vast lake#, one can find", /*french*/ "#sous le lac# gît", - /*spanish*/ "en las #profundidades de un lago inmenso# se halla" }, - }); - hintTable[RHT_GERUDO_FORTRESS_TO_GERUDO_TRAINING_GROUNDS_LOBBY] = HintText::Entrance({ - // obscure text - Text{ "paying a #fee to the Gerudos# grants access to", - /*french*/ "l'#entrée payante des Gerudo# donne accès à", - /*spanish*/ "pagarle una #tasa a las gerudo# da acceso a" }, - }); + hintTextTable[RHT_ZORAS_FOUNTAIN_TO_ZF_GREAT_FAIRY_FOUNTAIN] = HintText(CustomMessage("They say that a #fountain wall# hides #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #mur fragile du réservoir# cache #[[1]]#.", {QM_RED, QM_BLUE})), + // /*spanish*/una #pared de la fuente# esconde #[[1]]#. - hintTable[RHT_ZORAS_FOUNTAIN_TO_JABU_JABUS_BELLY_BEGINNING] = HintText::Entrance({ - // obscure text - Text{ "inside #Jabu-Jabu#, one can find", /*french*/ "#dans Jabu-Jabu# se trouve", - /*spanish*/ "dentro de #Jabu-Jabu# se halla" }, - }); + hintTextTable[RHT_GV_FORTRESS_SIDE_TO_GV_CARPENTER_TENT] = HintText(CustomMessage("They say that a #tent in the valley# covers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #tente dans la vallée# recouvre #[[1]]#.", {QM_RED, QM_BLUE})), + // /*spanish*/una #tienda de campaña del valle# cubre #[[1]]#. - hintTable[RHT_KAKARIKO_VILLAGE_TO_BOTTOM_OF_THE_WELL] = HintText::Entrance({ - // obscure text - Text{ "a #village well# leads to", /*french*/ "dans le fond du #Puits du village# gît", - /*spanish*/ "el #pozo de un pueblo# conduce a" }, - }); + hintTextTable[RHT_GRAVEYARD_WARP_PAD_REGION_TO_SHADOW_TEMPLE_ENTRYWAY] = HintText(CustomMessage("They say that at the #back of the Graveyard#, there is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #derrière le Cimetière# gît #[[1]]#.", {QM_RED, QM_BLUE})), + // /*spanish*/en la #parte trasera del cementerio# se halla #[[1]]#. + + + hintTextTable[RHT_LAKE_HYLIA_TO_WATER_TEMPLE_LOBBY] = HintText(CustomMessage("They say that deep #under a vast lake#, one can find #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #sous le lac# gît #[[1]]#.", {QM_RED, QM_BLUE})), + // /*spanish*/en las #profundidades de un lago inmenso# se halla #[[1]]#. + + + hintTextTable[RHT_GERUDO_FORTRESS_TO_GERUDO_TRAINING_GROUNDS_LOBBY] = HintText(CustomMessage("They say that paying a #fee to the Gerudos# grants access to #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#entrée payante des Gerudo# donne accès à #[[1]]#.", {QM_RED, QM_BLUE})), + // /*spanish*/pagarle una #tasa a las gerudo# da acceso a #[[1]]#. + + hintTextTable[RHT_ZORAS_FOUNTAIN_TO_JABU_JABUS_BELLY_BEGINNING] = HintText(CustomMessage("They say that inside #Jabu-Jabu#, one can find #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #dans Jabu-Jabu# se trouve #[[1]]#.", {QM_RED, QM_BLUE})), + // /*spanish*/dentro de #Jabu-Jabu# se halla #[[1]]#. + + hintTextTable[RHT_KAKARIKO_VILLAGE_TO_BOTTOM_OF_THE_WELL] = HintText(CustomMessage("They say that a #village well# leads to #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, dans le fond du #Puits du village# gît #[[1]]#.", {QM_RED, QM_BLUE})), + // /*spanish*/el #pozo de un pueblo# conduce a #[[1]]#. /*-------------------------- | EXIT HINT TEXT | ---------------------------*/ - // maybe make a new type for this? I'm not sure if it really matters - hintTable[RHT_LINKS_POCKET] = HintText::Exclude({ - // obscure text - Text{ "Link's Pocket", /*french*/ "les Poches de @", /*spanish*/ "el bolsillo de @" }, - }); + hintTextTable[RHT_LINKS_POCKET] = HintText(CustomMessage("Link's Pocket", + /*german*/ "", + /*french*/ "les Poches de @")); + // /*spanish*/el bolsillo de @ - hintTable[RHT_KOKIRI_FOREST] = HintText::Exclude({ - // obscure text - Text{ "Kokiri Forest", /*french*/ "la Forêt Kokiri", /*spanish*/ "el Bosque Kokiri" }, - }); + hintTextTable[RHT_KOKIRI_FOREST] = HintText(CustomMessage("Kokiri Forest", + /*german*/ "", + /*french*/ "la Forêt Kokiri")); + // /*spanish*/el Bosque Kokiri - hintTable[RHT_THE_LOST_WOODS] = HintText::Exclude({ - // obscure text - Text{ "the Lost Woods", /*french*/ "les Bois Perdus", /*spanish*/ "el Bosque Perdido" }, - }); + hintTextTable[RHT_THE_LOST_WOODS] = HintText(CustomMessage("the Lost Woods", + /*german*/ "", + /*french*/ "les Bois Perdus")); + // /*spanish*/el Bosque Perdido + hintTextTable[RHT_SACRED_FOREST_MEADOW] = HintText(CustomMessage("Sacred Forest Meadow", + /*german*/ "", + /*french*/ "le Bosquet Sacré")); + // /*spanish*/la pradera sagrada del bosque - hintTable[RHT_SACRED_FOREST_MEADOW] = HintText::Exclude({ - // obscure text - Text{ "Sacred Forest Meadow", /*french*/ "le Bosquet Sacré", /*spanish*/ "la pradera sagrada del bosque" }, - }); + hintTextTable[RHT_HYRULE_FIELD] = HintText(CustomMessage("Hyrule Field", + /*german*/ "", + /*french*/ "la Plaine d'Hyrule")); + // /*spanish*/la Llanura de Hyrule - hintTable[RHT_HYRULE_FIELD] = HintText::Exclude({ - // obscure text - Text{ "Hyrule Field", /*french*/ "la Plaine d'Hyrule", /*spanish*/ "la Llanura de Hyrule" }, - }); + hintTextTable[RHT_LAKE_HYLIA] = HintText(CustomMessage("Lake Hylia", + /*german*/ "", + /*french*/ "le Lac Hylia")); + // /*spanish*/el Lago Hylia - hintTable[RHT_LAKE_HYLIA] = HintText::Exclude({ - // obscure text - Text{ "Lake Hylia", /*french*/ "le Lac Hylia", /*spanish*/ "el Lago Hylia" }, - }); + hintTextTable[RHT_GERUDO_VALLEY] = HintText(CustomMessage("Gerudo Valley", + /*german*/ "", + /*french*/ "la Vallée Gerudo")); + // /*spanish*/el Valle Gerudo - hintTable[RHT_GERUDO_VALLEY] = HintText::Exclude({ - // obscure text - Text{ "Gerudo Valley", /*french*/ "la Vallée Gerudo", /*spanish*/ "el Valle Gerudo" }, - }); + hintTextTable[RHT_GERUDO_FORTRESS] = HintText(CustomMessage("Gerudo's Fortress", + /*german*/ "", + /*french*/ "le Repaire des Voleurs")); + // /*spanish*/la Fortaleza Gerudo - hintTable[RHT_GERUDO_FORTRESS] = HintText::Exclude({ - // obscure text - Text{ "Gerudo's Fortress", /*french*/ "le Repaire des Voleurs", /*spanish*/ "la Fortaleza Gerudo" }, - }); + hintTextTable[RHT_HAUNTED_WASTELAND] = HintText(CustomMessage("Haunted Wasteland", + /*german*/ "", + /*french*/ "le Désert Hanté")); + // /*spanish*/el desierto encantado - hintTable[RHT_HAUNTED_WASTELAND] = HintText::Exclude({ - // obscure text - Text{ "Haunted Wasteland", /*french*/ "le Désert Hanté", /*spanish*/ "el desierto encantado" }, - }); + hintTextTable[RHT_DESERT_COLOSSUS] = HintText(CustomMessage("Desert Colossus", + /*german*/ "", + /*french*/ "le Colosse du Désert")); + // /*spanish*/el Coloso del Desierto - hintTable[RHT_DESERT_COLOSSUS] = HintText::Exclude({ - // obscure text - Text{ "Desert Colossus", /*french*/ "le Colosse du Désert", /*spanish*/ "el Coloso del Desierto" }, - }); + hintTextTable[RHT_THE_MARKET] = HintText(CustomMessage("the Market", + /*german*/ "", + /*french*/ "la Place du Marché")); + // /*spanish*/la plaza del mercado - hintTable[RHT_THE_MARKET] = HintText::Exclude({ - // obscure text - Text{ "the Market", /*french*/ "la Place du Marché", /*spanish*/ "la plaza del mercado" }, - }); + hintTextTable[RHT_TEMPLE_OF_TIME] = HintText(CustomMessage("Temple of Time", + /*german*/ "", + /*french*/ "le Temple du Temps")); + // /*spanish*/el Templo del Tiempo + hintTextTable[RHT_CASTLE_GROUNDS] = HintText(CustomMessage("the Castle Grounds", + /*german*/ "", + /*french*/ "le Château d'Hyrule")); + // /*spanish*/ + hintTextTable[RHT_HYRULE_CASTLE] = HintText(CustomMessage("Hyrule Castle", + /*german*/ "", + /*french*/ "le Château d'Hyrule")); + // /*spanish*/el Castillo de Hyrule - hintTable[RHT_TEMPLE_OF_TIME] = HintText::Exclude({ - // obscure text - Text{ "Temple of Time", /*french*/ "le Temple du Temps", /*spanish*/ "el Templo del Tiempo" }, - }); + hintTextTable[RHT_OUTSIDE_GANONS_CASTLE] = HintText(CustomMessage("outside Ganon's Castle", + /*german*/ "", + /*french*/ "les alentours du Château de Ganon")); + // /*spanish*/el exterior del Castillo de Ganon - hintTable[RHT_CASTLE_GROUNDS] = HintText::Exclude({ - // obscure text - Text{ "the Castle Grounds", /*french*/ "le Château d'Hyrule", /*spanish*/ "" }, - }); + hintTextTable[RHT_CASTLE_GROUNDS] = HintText(CustomMessage("the Castle Grounds", + /*german*/ "", + /*french*/ "le Château d'Hyrule")); + // /*spanish*/ + hintTextTable[RHT_KAKARIKO_VILLAGE] = HintText(CustomMessage("Kakariko Village", + /*german*/ "", + /*french*/ "le Village Cocorico")); + // /*spanish*/Kakariko - hintTable[RHT_HYRULE_CASTLE] = HintText::Exclude({ - // obscure text - Text{ "Hyrule Castle", /*french*/ "le Château d'Hyrule", /*spanish*/ "el Castillo de Hyrule" }, - }); + hintTextTable[RHT_THE_GRAVEYARD] = HintText(CustomMessage("the Graveyard", + /*german*/ "", + /*french*/ "le Cimetière")); + // /*spanish*/el cementerio - hintTable[RHT_OUTSIDE_GANONS_CASTLE] = HintText::Exclude({ - // obscure text - Text{ "outside Ganon's Castle", /*french*/ "les alentours du Château de Ganon", - /*spanish*/ "el exterior del Castillo de Ganon" }, - }); + hintTextTable[RHT_DEATH_MOUNTAIN_TRAIL] = HintText(CustomMessage("Death Mountain Trail", + /*german*/ "", + /*french*/ "le Chemin du Péril")); + // /*spanish*/el sendero de la Montaña de la Muerte - hintTable[RHT_CASTLE_GROUNDS] = HintText::Exclude({ - // obscure text - Text{ "the Castle Grounds", /*french*/ "le Château d'Hyrule", /*spanish*/ "" }, - }); + hintTextTable[RHT_GORON_CITY] = HintText(CustomMessage("Goron City", + /*german*/ "", + /*french*/ "le Village Goron")); + // /*spanish*/la Ciudad Goron - hintTable[RHT_KAKARIKO_VILLAGE] = HintText::Exclude({ - // obscure text - Text{ "Kakariko Village", /*french*/ "le Village Cocorico", /*spanish*/ "Kakariko" }, - }); + hintTextTable[RHT_DEATH_MOUNTAIN_CRATER] = HintText(CustomMessage("Death Mountain Crater", + /*german*/ "", + /*french*/ "le Cratère du Péril")); + // /*spanish*/el cráter de la Montaña de la Muerte - hintTable[RHT_THE_GRAVEYARD] = HintText::Exclude({ - // obscure text - Text{ "the Graveyard", /*french*/ "le Cimetière", /*spanish*/ "el cementerio" }, - }); + hintTextTable[RHT_ZORAS_RIVER] = HintText(CustomMessage("Zora's River", + /*german*/ "", + /*french*/ "la Rivière Zora")); + // /*spanish*/el Río Zora - hintTable[RHT_DEATH_MOUNTAIN_TRAIL] = HintText::Exclude({ - // obscure text - Text{ "Death Mountain Trail", /*french*/ "le Chemin du Péril", - /*spanish*/ "el sendero de la Montaña de la Muerte" }, - }); + hintTextTable[RHT_ZORAS_DOMAIN] = HintText(CustomMessage("Zora's Domain", + /*german*/ "", + /*french*/ "le Domaine Zora")); + // /*spanish*/la Región de los Zora - hintTable[RHT_GORON_CITY] = HintText::Exclude({ - // obscure text - Text{ "Goron City", /*french*/ "le Village Goron", /*spanish*/ "la Ciudad Goron" }, - }); - - hintTable[RHT_DEATH_MOUNTAIN_CRATER] = HintText::Exclude({ - // obscure text - Text{ "Death Mountain Crater", /*french*/ "le Cratère du Péril", - /*spanish*/ "el cráter de la Montaña de la Muerte" }, - }); - - hintTable[RHT_ZORAS_RIVER] = HintText::Exclude({ - // obscure text - Text{ "Zora's River", /*french*/ "la Rivière Zora", /*spanish*/ "el Río Zora" }, - }); - - hintTable[RHT_ZORAS_DOMAIN] = HintText::Exclude({ - // obscure text - Text{ "Zora's Domain", /*french*/ "le Domaine Zora", /*spanish*/ "la Región de los Zora" }, - }); - - hintTable[RHT_ZORAS_FOUNTAIN] = HintText::Exclude({ - // obscure text - Text{ "Zora's Fountain", /*french*/ "la Fontaine Zora", /*spanish*/ "la Fuente Zora" }, - }); - - hintTable[RHT_LON_LON_RANCH] = HintText::Exclude({ - // obscure text - Text{ "Lon Lon Ranch", /*french*/ "le Ranch Lon Lon", /*spanish*/ "el Rancho Lon Lon" }, - }); + hintTextTable[RHT_ZORAS_FOUNTAIN] = HintText(CustomMessage("Zora's Fountain", + /*german*/ "", + /*french*/ "la Fontaine Zora")); + // /*spanish*/la Fuente Zora + hintTextTable[RHT_LON_LON_RANCH] = HintText(CustomMessage("Lon Lon Ranch", + /*german*/ "", + /*french*/ "le Ranch Lon Lon")); + // /*spanish*/el Rancho Lon Lon /*-------------------------- | REGION HINT TEXT | ---------------------------*/ - hintTable[RHT_KF_LINKS_HOUSE] = HintText::Region({ - // obscure text - Text{ "Link's House", /*french*/ "la #maison de @#", /*spanish*/ "la casa de @" }, - }); - - // hintTable[RHT_TOT_MAIN] = HintText::Region({ - // //obscure text - // Text{"the #Temple of Time#", /*french*/"le #Temple du Temps#", /*spanish*/"el Templo del - // Tiempo"}, - // }); - - hintTable[RHT_KF_MIDOS_HOUSE] = HintText::Region({ - // obscure text - Text{ "Mido's house", /*french*/ "la Cabane du Grand Mido", /*spanish*/ "la casa de Mido" }, - }); - - hintTable[RHT_KF_SARIAS_HOUSE] = HintText::Region({ - // obscure text - Text{ "Saria's House", /*french*/ "la Cabane de Saria", /*spanish*/ "la casa de Saria" }, - }); - - hintTable[RHT_KF_HOUSE_OF_TWINS] = HintText::Region({ - // obscure text - Text{ "the #House of Twins#", /*french*/ "la Cabane des Jumelles", /*spanish*/ "la casa de las gemelas" }, - }); - - hintTable[RHT_KF_KNOW_IT_ALL_HOUSE] = HintText::Region({ - // obscure text - Text{ "Know-It-All Brothers' House", /*french*/ "la Cabane des frères Je-Sais-Tout", - /*spanish*/ "la casa de los hermanos Sabelotodo" }, - }); - - hintTable[RHT_KF_KOKIRI_SHOP] = HintText::Region({ - // obscure text - Text{ "the #Kokiri Shop#", /*french*/ "le #Magasin Kokiri#", /*spanish*/ "la tienda kokiri" }, - }); - - hintTable[RHT_LH_LAB] = HintText::Region({ - // obscure text - Text{ "the #Lakeside Laboratory#", /*french*/ "le #Laboratoire du Lac#", - /*spanish*/ "el laboratorio del lago" }, - }); - - hintTable[RHT_LH_FISHING_HOLE] = HintText::Region({ - // obscure text - Text{ "the #Fishing Pond#", /*french*/ "l'#Étang#", /*spanish*/ "el estanque" }, - }); - - hintTable[RHT_GV_CARPENTER_TENT] = HintText::Region({ - // obscure text - Text{ "the #Carpenters' tent#", /*french*/ "la #Tente des charpentiers#", - /*spanish*/ "la #tienda de campaña de los carpinteros#" }, - }); - - hintTable[RHT_MARKET_GUARD_HOUSE] = HintText::Region({ - // obscure text - Text{ "the #Guard House#", /*french*/ "le #poste de garde#", /*spanish*/ "la caseta de guardia" }, - }); - - hintTable[RHT_MARKET_MASK_SHOP] = HintText::Region({ - // obscure text - Text{ "the #Happy Mask Shop#", /*french*/ "la #Foire Aux Masques#", - /*spanish*/ "la tienda de La Máscara Feliz" }, - }); - - hintTable[RHT_MARKET_BOMBCHU_BOWLING] = HintText::Region({ - // obscure text - Text{ "the #Bombchu Bowling Alley#", /*french*/ "le #Bowling Teigneux#", /*spanish*/ "la Bolera Bombchu" }, - }); - - hintTable[RHT_MARKET_POTION_SHOP] = HintText::Region({ - // obscure text - Text{ "the #Market Potion Shop#", /*french*/ "l'#apothicaire de la Place du Marché#", - /*spanish*/ "la tienda de pociones de la plaza del mercado" }, - }); - - hintTable[RHT_MARKET_TREASURE_CHEST_GAME] = HintText::Region({ - // obscure text - Text{ "the #Treasure Chest Shop#", /*french*/ "la #Chasse-aux-Trésors#", /*spanish*/ "el Cofre del Tesoro" }, - }); - - hintTable[RHT_MARKET_BOMBCHU_SHOP] = HintText::Region({ - // obscure text - Text{ "the #Bombchu Shop#", /*french*/ "le #Magasin de Missiles#", /*spanish*/ "la Tienda Bombchu" }, - }); - - hintTable[RHT_MARKET_MAN_IN_GREEN_HOUSE] = HintText::Region({ - // obscure text - Text{ "Man in Green's House", /*french*/ "la #Maison de l'Homme en Vert#", - /*spanish*/ "la casa del hombre de verde" }, - }); - - hintTable[RHT_KAK_WINDMILL] = HintText::Region({ - // obscure text - Text{ "the #Windmill#", /*french*/ "le #Moulin#", /*spanish*/ "el #molino#" }, - }); - - hintTable[RHT_KAK_CARPENTER_BOSS_HOUSE] = HintText::Region({ - // obscure text - Text{ "the #Carpenters' Boss House#", /*french*/ "la #Maison du Chef des ouvriers#", - /*spanish*/ "la casa del capataz de los carpinteros" }, - }); - - hintTable[RHT_KAK_HOUSE_OF_SKULLTULA] = HintText::Region({ - // obscure text - Text{ "the #House of Skulltula#", /*french*/ "la #Maison des Skulltulas#", - /*spanish*/ "la casa de las Skulltulas" }, - }); - - hintTable[RHT_KAK_IMPAS_HOUSE] = HintText::Region({ - // obscure text - Text{ "Impa's House", /*french*/ "la #Maison d'Impa#", /*spanish*/ "la casa de Impa" }, - }); - - hintTable[RHT_KAK_IMPAS_HOUSE_BACK] = HintText::Region({ - // obscure text - Text{ "Impa's cow cage", /*french*/ "la #cage à vache d'Impa#", /*spanish*/ "la jaula de la vaca de Impa" }, - }); - - hintTable[RHT_KAK_ODD_POTION_BUILDING] = HintText::Region({ - // obscure text - Text{ "Granny's Potion Shop", /*french*/ "la #maison bleue de Cocorico#", - /*spanish*/ "la tienda de pociones de la abuela" }, - }); - - hintTable[RHT_GRAVEYARD_DAMPES_HOUSE] = HintText::Region({ - // obscure text - Text{ "Dampé's Hut", /*french*/ "la #Cabane du Fossoyeur#", /*spanish*/ "la cabaña de Dampé" }, - }); - - hintTable[RHT_GC_SHOP] = HintText::Region({ - // obscure text - Text{ "the #Goron Shop#", /*french*/ "la #Boutique Goron#", /*spanish*/ "la #tienda goron#" }, - }); - - hintTable[RHT_ZD_SHOP] = HintText::Region({ - // obscure text - Text{ "the #Zora Shop#", /*french*/ "la #Boutique Zora#", /*spanish*/ "la #tienda zora#" }, - }); - - hintTable[RHT_LLR_TALONS_HOUSE] = HintText::Region({ - // obscure text - Text{ "Talon's House", /*french*/ "la #Maison de Talon#", /*spanish*/ "la casa de Talon" }, - }); - - hintTable[RHT_LLR_STABLES] = HintText::Region({ - // obscure text - Text{ "a #stable#", /*french*/ "l'#Étable#", /*spanish*/ "el establo" }, - }); - - hintTable[RHT_LLR_TOWER] = HintText::Region({ - // obscure text - Text{ "the #Lon Lon Tower#", /*french*/ "le #silo du Ranch Lon Lon#", /*spanish*/ "la torre Lon Lon" }, - }); - - hintTable[RHT_MARKET_BAZAAR] = HintText::Region({ - // obscure text - Text{ "the #Market Bazaar#", /*french*/ "le #Bazar de la Place du Marché#", - /*spanish*/ "el bazar de la plaza del mercado" }, - }); - - hintTable[RHT_MARKET_SHOOTING_GALLERY] = HintText::Region({ - // obscure text - Text{ "a #Slingshot Shooting Gallery#", /*french*/ "le #Jeu d'Adresse de la Place du Marché#", - /*spanish*/ "el Tiro al Blanco con tirachinas" }, - }); - - hintTable[RHT_KAK_BAZAAR] = HintText::Region({ - // obscure text - Text{ "the #Kakariko Bazaar#", /*french*/ "le #Bazar de Cocorico#", /*spanish*/ "el bazar de Kakariko" }, - }); - - hintTable[RHT_KAK_POTION_SHOP_FRONT] = HintText::Region({ - // obscure text - Text{ "the #Kakariko Potion Shop#", /*french*/ "l'#apothicaire de Cocorico#", - /*spanish*/ "la tienda de pociones de Kakariko" }, - }); - - hintTable[RHT_KAK_POTION_SHOP_BACK] = HintText::Region({ - // obscure text - Text{ "the #Kakariko Potion Shop#", /*french*/ "l'#apothicaire de Cocorico#", - /*spanish*/ "la tienda de pociones de Kakariko" }, - }); - - hintTable[RHT_KAK_SHOOTING_GALLERY] = HintText::Region({ - // obscure text - Text{ "a #Bow Shooting Gallery#", /*french*/ "le #jeu d'adresse de Cocorico#", - /*spanish*/ "el Tiro al Blanco con arco" }, - }); - - hintTable[RHT_COLOSSUS_GREAT_FAIRY_FOUNTAIN] = HintText::Region({ - // obscure text - Text{ "a #Great Fairy Fountain#", /*french*/ "une #Fontaine Royale des Fées#", - /*spanish*/ "una fuente de la Gran Hada" }, - }); - - hintTable[RHT_HC_GREAT_FAIRY_FOUNTAIN] = HintText::Region({ - // obscure text - Text{ "a #Great Fairy Fountain#", /*french*/ "une #Fontaine Royale des Fées#", - /*spanish*/ "una fuente de la Gran Hada" }, - }); - - hintTable[RHT_OGC_GREAT_FAIRY_FOUNTAIN] = HintText::Region({ - // obscure text - Text{ "a #Great Fairy Fountain#", /*french*/ "une #Fontaine Royale des Fées#", - /*spanish*/ "una fuente de la Gran Hada" }, - }); - - hintTable[RHT_DMC_GREAT_FAIRY_FOUNTAIN] = HintText::Region({ - // obscure text - Text{ "a #Great Fairy Fountain#", /*french*/ "une #Fontaine Royale des Fées#", - /*spanish*/ "una fuente de la Gran Hada" }, - }); - - hintTable[RHT_DMT_GREAT_FAIRY_FOUNTAIN] = HintText::Region({ - // obscure text - Text{ "a #Great Fairy Fountain#", /*french*/ "une #Fontaine Royale des Fées#", - /*spanish*/ "una fuente de la Gran Hada" }, - }); - - hintTable[RHT_ZF_GREAT_FAIRY_FOUNTAIN] = HintText::Region({ - // obscure text - Text{ "a #Great Fairy Fountain#", /*french*/ "une #Fontaine Royale des Fées#", - /*spanish*/ "una fuente de la Gran Hada" }, - }); - - hintTable[RHT_GRAVEYARD_SHIELD_GRAVE] = HintText::Region({ - // obscure text - Text{ "a #grave with a free chest#", /*french*/ "le #tombeau avec un trésor#", - /*spanish*/ "la #tumba con un cofre#" }, - }); - - hintTable[RHT_GRAVEYARD_HEART_PIECE_GRAVE] = HintText::Region({ - // obscure text - Text{ "a chest spawned by #Sun's Song#", /*french*/ "un #coffre apparaît avec le Chant du Soleil#", - /*spanish*/ "la #tumba de la Canción del Sol#" }, - }); - - hintTable[RHT_GRAVEYARD_COMPOSERS_GRAVE] = HintText::Region({ - // obscure text - Text{ "the #Composers' Grave#", /*french*/ "la #Tombe royale#", /*spanish*/ "el #Panteón Real#" }, - }); - - hintTable[RHT_GRAVEYARD_DAMPES_GRAVE] = HintText::Region({ - // obscure text - Text{ "Dampé's Grave", /*french*/ "la #Tombe d'Igor#", /*spanish*/ "la #tumba de Dampé#" }, - }); - - hintTable[RHT_DMT_COW_GROTTO] = HintText::Region({ - // obscure text - Text{ "a solitary #Cow#", /*french*/ "la #grotte avec une vache#", /*spanish*/ "una #vaca# solitaria" }, - }); - - hintTable[RHT_HC_STORMS_GROTTO] = HintText::Region({ - // obscure text - Text{ "a sandy grotto with #fragile walls#", /*french*/ "la #grotte avec des murs fragiles#", - /*spanish*/ "la arenosa gruta de #frágiles paredes#" }, - }); - - hintTable[RHT_HF_TEKTITE_GROTTO] = HintText::Region({ - // obscure text - Text{ "a pool guarded by a #Tektite#", /*french*/ "l'#étang sous-terrain avec un Araknon#", - /*spanish*/ "un charco custodiado por un #Tektite#" }, - }); - - hintTable[RHT_HF_NEAR_KAK_GROTTO] = HintText::Region({ - // obscure text - Text{ "a #Big Skulltula# guarding a Gold one", /*french*/ "la #grotte d'araignées#", - /*spanish*/ "una #gran Skulltula# custodiando una dorada" }, - }); - - hintTable[RHT_HF_COW_GROTTO] = HintText::Region({ - // obscure text - Text{ "a grotto full of #spider webs#", /*french*/ "la #grotte couverte de toiles d'araignées#", - /*spanish*/ "una gruta llena de #telarañas#" }, - }); - - hintTable[RHT_KAK_REDEAD_GROTTO] = HintText::Region({ - // obscure text - Text{ "#ReDeads# guarding a chest", /*french*/ "le tombeau de #deux morts#", - /*spanish*/ "los #ReDeads# que custodian un cofre" }, - }); - - hintTable[RHT_SFM_WOLFOS_GROTTO] = HintText::Region({ - // obscure text - Text{ "#Wolfos# guarding a chest", /*french*/ "la #grotte iridescente#", - /*spanish*/ "los #Wolfos# que custodian un cofre" }, - }); - - hintTable[RHT_GV_OCTOROK_GROTTO] = HintText::Region({ - // obscure text - Text{ "an #Octorok# guarding a rich pool", /*french*/ "un #étang sous-terrain avec un Octorok#", - /*spanish*/ "un #Octorok# que custodia un lujoso charco" }, - }); - - hintTable[RHT_DEKU_THEATER] = HintText::Region({ - // obscure text - Text{ "the #Lost Woods Stage#", /*french*/ "le #théâtre sylvestre#", - /*spanish*/ "el #escenario del Bosque Perdido#" }, - }); - - hintTable[RHT_ZR_OPEN_GROTTO] = HintText::Region({ - // obscure text - Text{ "a #generic grotto#", /*french*/ "une #grotte avec un trésor#", /*spanish*/ "una #cueva genérica#" }, - }); - - hintTable[RHT_DMC_UPPER_GROTTO] = HintText::Region({ - // obscure text - Text{ "a #generic grotto#", /*french*/ "une #grotte avec un trésor#", /*spanish*/ "una #cueva genérica#" }, - }); - - hintTable[RHT_DMT_STORMS_GROTTO] = HintText::Region({ - // obscure text - Text{ "a #generic grotto#", /*french*/ "une #grotte avec un trésor#", /*spanish*/ "una #cueva genérica#" }, - }); - - hintTable[RHT_KAK_OPEN_GROTTO] = HintText::Region({ - // obscure text - Text{ "a #generic grotto#", /*french*/ "une #grotte avec un trésor#", /*spanish*/ "una #cueva genérica#" }, - }); - - hintTable[RHT_HF_NEAR_MARKET_GROTTO] = HintText::Region({ - // obscure text - Text{ "a #generic grotto#", /*french*/ "une #grotte avec un trésor#", /*spanish*/ "una #cueva genérica#" }, - }); - - hintTable[RHT_HF_OPEN_GROTTO] = HintText::Region({ - // obscure text - Text{ "a #generic grotto#", /*french*/ "une #grotte avec un trésor#", /*spanish*/ "una #cueva genérica#" }, - }); - - hintTable[RHT_HF_SOUTHEAST_GROTTO] = HintText::Region({ - // obscure text - Text{ "a #generic grotto#", /*french*/ "une #grotte avec un trésor#", /*spanish*/ "una #cueva genérica#" }, - }); - - hintTable[RHT_KF_STORMS_GROTTO] = HintText::Region({ - // obscure text - Text{ "a #generic grotto#", /*french*/ "une #grotte avec un trésor#", /*spanish*/ "una #cueva genérica#" }, - }); - - hintTable[RHT_LW_NEAR_SHORTCUTS_GROTTO] = HintText::Region({ - // obscure text - Text{ "a #generic grotto#", /*french*/ "une #grotte avec un trésor#", /*spanish*/ "una #cueva genérica#" }, - }); - - hintTable[RHT_HF_INSIDE_FENCE_GROTTO] = HintText::Region({ - // obscure text - Text{ "a #single Upgrade Deku Scrub#", /*french*/ "une #grotte avec une peste Mojo#", - /*spanish*/ "una cueva con un #solitario mercader deku#" }, - }); - - hintTable[RHT_LW_SCRUBS_GROTTO] = HintText::Region({ - // obscure text - Text{ "#2 Deku Scrubs# including an Upgrade one", /*french*/ "une #grotte avec deux pestes Mojo#", - /*spanish*/ "una cueva con #dos mercaderes deku#" }, - }); - - hintTable[RHT_COLOSSUS_GROTTO] = HintText::Region({ - // obscure text - Text{ "2 Deku Scrubs", /*french*/ "une #grotte avec deux pestes Mojo#", - /*spanish*/ "una cueva con #dos mercaderes deku#" }, - }); - - hintTable[RHT_ZR_STORMS_GROTTO] = HintText::Region({ - // obscure text - Text{ "2 Deku Scrubs", /*french*/ "une #grotte avec deux pestes Mojo#", - /*spanish*/ "una cueva con #dos mercaderes deku#" }, - }); - - hintTable[RHT_SFM_STORMS_GROTTO] = HintText::Region({ - // obscure text - Text{ "2 Deku Scrubs", /*french*/ "une #grotte avec deux pestes Mojo#", - /*spanish*/ "una cueva con #dos mercaderes deku#" }, - }); - - hintTable[RHT_GV_STORMS_GROTTO] = HintText::Region({ - // obscure text - Text{ "2 Deku Scrubs", /*french*/ "une #grotte avec deux pestes Mojo#", - /*spanish*/ "una cueva con #dos mercaderes deku#" }, - }); - - hintTable[RHT_LH_GROTTO] = HintText::Region({ - // obscure text - Text{ "3 Deku Scrubs", /*french*/ "une #grotte avec trois pestes Mojo#", - /*spanish*/ "una cueva con #tres mercaderes deku#" }, - }); - - hintTable[RHT_DMC_HAMMER_GROTTO] = HintText::Region({ - // obscure text - Text{ "3 Deku Scrubs", /*french*/ "une #grotte avec trois pestes Mojo#", - /*spanish*/ "una cueva con #tres mercaderes deku#" }, - }); - - hintTable[RHT_GC_GROTTO] = HintText::Region({ - // obscure text - Text{ "3 Deku Scrubs", /*french*/ "une #grotte avec trois pestes Mojo#", - /*spanish*/ "una cueva con #tres mercaderes deku#" }, - }); - - hintTable[RHT_LLR_GROTTO] = HintText::Region({ - // obscure text - Text{ "3 Deku Scrubs", /*french*/ "une #grotte avec trois pestes Mojo#", - /*spanish*/ "una cueva con #tres mercaderes deku#" }, - }); - - hintTable[RHT_ZR_FAIRY_GROTTO] = HintText::Region({ - // obscure text - Text{ "a small #Fairy Fountain#", /*french*/ "une #fontaine de fées#", - /*spanish*/ "una pequeña #fuente de hadas#" }, - }); - - hintTable[RHT_HF_FAIRY_GROTTO] = HintText::Region({ - // obscure text - Text{ "a small #Fairy Fountain#", /*french*/ "une #fontaine de fées#", - /*spanish*/ "una pequeña #fuente de hadas#" }, - }); - - hintTable[RHT_SFM_FAIRY_GROTTO] = HintText::Region({ - // obscure text - Text{ "a small #Fairy Fountain#", /*french*/ "une #fontaine de fées#", - /*spanish*/ "una pequeña #fuente de hadas#" }, - }); - - hintTable[RHT_ZD_STORMS_GROTTO] = HintText::Region({ - // obscure text - Text{ "a small #Fairy Fountain#", /*french*/ "une #fontaine de fées#", - /*spanish*/ "una pequeña #fuente de hadas#" }, - }); - - hintTable[RHT_GF_STORMS_GROTTO] = HintText::Region({ - // obscure text - Text{ "a small #Fairy Fountain#", /*french*/ "une #fontaine de fées#", - /*spanish*/ "una pequeña #fuente de hadas#" }, - }); + hintTextTable[RHT_KF_LINKS_HOUSE] = HintText(CustomMessage("Link's House", + /*german*/ "", + /*french*/ "la #maison de @#")); + // /*spanish*/la casa de @ + + hintTextTable[RHT_KF_MIDOS_HOUSE] = HintText(CustomMessage("Mido's house", + /*german*/ "", + /*french*/ "la Cabane du Grand Mido")); + // /*spanish*/la casa de Mido + hintTextTable[RHT_KF_SARIAS_HOUSE] = HintText(CustomMessage("Saria's House", + /*german*/ "", + /*french*/ "la Cabane de Saria")); + // /*spanish*/la casa de Saria + + hintTextTable[RHT_KF_HOUSE_OF_TWINS] = HintText(CustomMessage("the #House of Twins#", + /*german*/ "", + /*french*/ "la Cabane des Jumelles")); + // /*spanish*/la casa de las gemelas + + hintTextTable[RHT_KF_KNOW_IT_ALL_HOUSE] = HintText(CustomMessage("Know-It-All Brothers' House", + /*german*/ "", + /*french*/ "la Cabane des frères Je-Sais-Tout")); + // /*spanish*/la casa de los hermanos Sabelotodo + + hintTextTable[RHT_KF_KOKIRI_SHOP] = HintText(CustomMessage("the #Kokiri Shop#", + /*german*/ "", + /*french*/ "le #Magasin Kokiri#")); + // /*spanish*/la tienda kokiri + hintTextTable[RHT_LH_LAB] = HintText(CustomMessage("the #Lakeside Laboratory#", + /*german*/ "", + /*french*/ "le #Laboratoire du Lac#")); + // /*spanish*/el laboratorio del lago + + hintTextTable[RHT_LH_FISHING_HOLE] = HintText(CustomMessage("the #Fishing Pond#", + /*german*/ "", + /*french*/ "l'#Étang#")); + // /*spanish*/el estanque + + hintTextTable[RHT_GV_CARPENTER_TENT] = HintText(CustomMessage("the #Carpenters' tent#", + /*german*/ "", + /*french*/ "la #Tente des charpentiers#")); + // /*spanish*/la #tienda de campaña de los carpinteros# + + hintTextTable[RHT_MARKET_GUARD_HOUSE] = HintText(CustomMessage("the #Guard House#", + /*german*/ "", + /*french*/ "le #poste de garde#")); + // /*spanish*/la caseta de guardia + + hintTextTable[RHT_MARKET_MASK_SHOP] = HintText(CustomMessage("the #Happy Mask Shop#", + /*german*/ "", + /*french*/ "la #Foire Aux Masques#")); + // /*spanish*/la tienda de La Máscara Feliz + + hintTextTable[RHT_MARKET_BOMBCHU_BOWLING] = HintText(CustomMessage("the #Bombchu Bowling Alley#", + /*german*/ "", + /*french*/ "le #Bowling Teigneux#")); + // /*spanish*/la Bolera Bombchu + + hintTextTable[RHT_MARKET_POTION_SHOP] = HintText(CustomMessage("the #Market Potion Shop#", + /*german*/ "", + /*french*/ "l'#apothicaire de la Place du Marché#")); + // /*spanish*/la tienda de pociones de la plaza del mercado + + hintTextTable[RHT_MARKET_TREASURE_CHEST_GAME] = HintText(CustomMessage("the #Treasure Chest Shop#", + /*german*/ "", + /*french*/ "la #Chasse-aux-Trésors#")); + // /*spanish*/el Cofre del Tesoro + + hintTextTable[RHT_MARKET_BOMBCHU_SHOP] = HintText(CustomMessage("the #Bombchu Shop#", + /*german*/ "", + /*french*/ "le #Magasin de Missiles#")); + // /*spanish*/la Tienda Bombchu + + hintTextTable[RHT_MARKET_MAN_IN_GREEN_HOUSE] = HintText(CustomMessage("Man in Green's House", + /*german*/ "", + /*french*/ "la #Maison de l'Homme en Vert#")); + // /*spanish*/la casa del hombre de verde + + hintTextTable[RHT_KAK_WINDMILL] = HintText(CustomMessage("the #Windmill#", + /*german*/ "", + /*french*/ "le #Moulin#")); + // /*spanish*/el #molino# + + hintTextTable[RHT_KAK_CARPENTER_BOSS_HOUSE] = HintText(CustomMessage("the #Carpenters' Boss House#", + /*german*/ "", + /*french*/ "la #Maison du Chef des ouvriers#")); + // /*spanish*/la casa del capataz de los carpinteros + + hintTextTable[RHT_KAK_HOUSE_OF_SKULLTULA] = HintText(CustomMessage("the #House of Skulltula#", + /*german*/ "", + /*french*/ "la #Maison des Skulltulas#")); + // /*spanish*/la casa de las Skulltulas + + hintTextTable[RHT_KAK_IMPAS_HOUSE] = HintText(CustomMessage("Impa's House", + /*german*/ "", + /*french*/ "la #Maison d'Impa#")); + // /*spanish*/la casa de Impa + + hintTextTable[RHT_KAK_IMPAS_HOUSE_BACK] = HintText(CustomMessage("Impa's cow cage", + /*german*/ "", + /*french*/ "la #cage à vache d'Impa#")); + // /*spanish*/la jaula de la vaca de Impa + + hintTextTable[RHT_KAK_ODD_POTION_BUILDING] = HintText(CustomMessage("Granny's Potion Shop", + /*german*/ "", + /*french*/ "la #maison bleue de Cocorico#")); + // /*spanish*/la tienda de pociones de la abuela + + hintTextTable[RHT_GRAVEYARD_DAMPES_HOUSE] = HintText(CustomMessage("Dampé's Hut", + /*german*/ "", + /*french*/ "la #Cabane du Fossoyeur#")); + // /*spanish*/la cabaña de Dampé + + hintTextTable[RHT_GC_SHOP] = HintText(CustomMessage("the #Goron Shop#", + /*german*/ "", + /*french*/ "la #Boutique Goron#")); + // /*spanish*/la #tienda goron# + + hintTextTable[RHT_ZD_SHOP] = HintText(CustomMessage("the #Zora Shop#", + /*german*/ "", + /*french*/ "la #Boutique Zora#")); + // /*spanish*/la #tienda zora# + + hintTextTable[RHT_LLR_TALONS_HOUSE] = HintText(CustomMessage("Talon's House", + /*german*/ "", + /*french*/ "la #Maison de Talon#")); + // /*spanish*/la casa de Talon + + hintTextTable[RHT_LLR_STABLES] = HintText(CustomMessage("a #stable#", + /*german*/ "", + /*french*/ "l'#Étable#")); + // /*spanish*/el establo + + hintTextTable[RHT_LLR_TOWER] = HintText(CustomMessage("the #Lon Lon Tower#", + /*german*/ "", + /*french*/ "le #silo du Ranch Lon Lon#")); + // /*spanish*/la torre Lon Lon + + hintTextTable[RHT_MARKET_BAZAAR] = HintText(CustomMessage("the #Market Bazaar#", + /*german*/ "", + /*french*/ "le #Bazar de la Place du Marché#")); + // /*spanish*/el bazar de la plaza del mercado + + hintTextTable[RHT_MARKET_SHOOTING_GALLERY] = HintText(CustomMessage("a #Slingshot Shooting Gallery#", + /*german*/ "", + /*french*/ "le #Jeu d'Adresse de la Place du Marché#")); + // /*spanish*/el Tiro al Blanco con tirachinas + + hintTextTable[RHT_KAK_BAZAAR] = HintText(CustomMessage("the #Kakariko Bazaar#", + /*german*/ "", + /*french*/ "le #Bazar de Cocorico#")); + // /*spanish*/el bazar de Kakariko + + hintTextTable[RHT_KAK_POTION_SHOP_FRONT] = HintText(CustomMessage("the #Kakariko Potion Shop#", + /*german*/ "", + /*french*/ "l'#apothicaire de Cocorico#")); + // /*spanish*/la tienda de pociones de Kakariko + + hintTextTable[RHT_KAK_POTION_SHOP_BACK] = HintText(CustomMessage("the #Kakariko Potion Shop#", + /*german*/ "", + /*french*/ "l'#apothicaire de Cocorico#")); + // /*spanish*/la tienda de pociones de Kakariko + + hintTextTable[RHT_KAK_SHOOTING_GALLERY] = HintText(CustomMessage("a #Bow Shooting Gallery#", + /*german*/ "", + /*french*/ "le #jeu d'adresse de Cocorico#")); + // /*spanish*/el Tiro al Blanco con arco + + hintTextTable[RHT_COLOSSUS_GREAT_FAIRY_FOUNTAIN] = HintText(CustomMessage("a #Great Fairy Fountain#", + /*german*/ "", + /*french*/ "une #Fontaine Royale des Fées#")); + // /*spanish*/una fuente de la Gran Hada + + hintTextTable[RHT_HC_GREAT_FAIRY_FOUNTAIN] = HintText(CustomMessage("a #Great Fairy Fountain#", + /*german*/ "", + /*french*/ "une #Fontaine Royale des Fées#")); + // /*spanish*/una fuente de la Gran Hada + + hintTextTable[RHT_OGC_GREAT_FAIRY_FOUNTAIN] = HintText(CustomMessage("a #Great Fairy Fountain#", + /*german*/ "", + /*french*/ "une #Fontaine Royale des Fées#")); + // /*spanish*/una fuente de la Gran Hada + + hintTextTable[RHT_DMC_GREAT_FAIRY_FOUNTAIN] = HintText(CustomMessage("a #Great Fairy Fountain#", + /*german*/ "", + /*french*/ "une #Fontaine Royale des Fées#")); + // /*spanish*/una fuente de la Gran Hada + + hintTextTable[RHT_DMT_GREAT_FAIRY_FOUNTAIN] = HintText(CustomMessage("a #Great Fairy Fountain#", + /*german*/ "", + /*french*/ "une #Fontaine Royale des Fées#")); + // /*spanish*/una fuente de la Gran Hada + + hintTextTable[RHT_ZF_GREAT_FAIRY_FOUNTAIN] = HintText(CustomMessage("a #Great Fairy Fountain#", + /*german*/ "", + /*french*/ "une #Fontaine Royale des Fées#")); + // /*spanish*/una fuente de la Gran Hada + + hintTextTable[RHT_GRAVEYARD_SHIELD_GRAVE] = HintText(CustomMessage("a #grave with a free chest#", + /*german*/ "", + /*french*/ "le #tombeau avec un trésor#")); + // /*spanish*/la #tumba con un cofre# + + hintTextTable[RHT_GRAVEYARD_HEART_PIECE_GRAVE] = HintText(CustomMessage("a chest spawned by #Sun's Song#", + /*german*/ "", + /*french*/ "un #coffre apparaît avec le Chant du Soleil#")); + // /*spanish*/la #tumba de la Canción del Sol# + + hintTextTable[RHT_GRAVEYARD_COMPOSERS_GRAVE] = HintText(CustomMessage("the #Composers' Grave#", + /*german*/ "", + /*french*/ "la #Tombe royale#")); + // /*spanish*/el #Panteón Real# + + hintTextTable[RHT_GRAVEYARD_DAMPES_GRAVE] = HintText(CustomMessage("Dampé's Grave", + /*german*/ "", + /*french*/ "la #Tombe d'Igor#")); + // /*spanish*/la #tumba de Dampé# + + hintTextTable[RHT_DMT_COW_GROTTO] = HintText(CustomMessage("a solitary #Cow#", + /*german*/ "", + /*french*/ "la #grotte avec une vache#")); + // /*spanish*/una #vaca# solitaria + hintTextTable[RHT_HC_STORMS_GROTTO] = HintText(CustomMessage("a sandy grotto with #fragile walls#", + /*german*/ "", + /*french*/ "la #grotte avec des murs fragiles#")); + // /*spanish*/la arenosa gruta de #frágiles paredes# + + hintTextTable[RHT_HF_TEKTITE_GROTTO] = HintText(CustomMessage("a pool guarded by a #Tektite#", + /*german*/ "", + /*french*/ "l'#étang sous-terrain avec un Araknon#")); + // /*spanish*/un charco custodiado por un #Tektite# + + hintTextTable[RHT_HF_NEAR_KAK_GROTTO] = HintText(CustomMessage("a #Big Skulltula# guarding a Gold one", + /*german*/ "", + /*french*/ "la #grotte d'araignées#")); + // /*spanish*/una #gran Skulltula# custodiando una dorada + + hintTextTable[RHT_HF_COW_GROTTO] = HintText(CustomMessage("a grotto full of #spider webs#", + /*german*/ "", + /*french*/ "la #grotte couverte de toiles d'araignées#")); + // /*spanish*/una gruta llena de #telarañas# + + hintTextTable[RHT_KAK_REDEAD_GROTTO] = HintText(CustomMessage("#ReDeads# guarding a chest", + /*german*/ "", + /*french*/ "le tombeau de #deux morts#")); + // /*spanish*/los #ReDeads# que custodian un cofre + + hintTextTable[RHT_SFM_WOLFOS_GROTTO] = HintText(CustomMessage("#Wolfos# guarding a chest", + /*german*/ "", + /*french*/ "la #grotte iridescente#")); + // /*spanish*/los #Wolfos# que custodian un cofre + + hintTextTable[RHT_GV_OCTOROK_GROTTO] = HintText(CustomMessage("an #Octorok# guarding a rich pool", + /*german*/ "", + /*french*/ "un #étang sous-terrain avec un Octorok#")); + // /*spanish*/un #Octorok# que custodia un lujoso charco + + hintTextTable[RHT_DEKU_THEATER] = HintText(CustomMessage("the #Lost Woods Stage#", + /*german*/ "", + /*french*/ "le #théâtre sylvestre#")); + // /*spanish*/el #escenario del Bosque Perdido# + + hintTextTable[RHT_ZR_OPEN_GROTTO] = HintText(CustomMessage("a #generic grotto#", + /*german*/ "", + /*french*/ "une #grotte avec un trésor#")); + // /*spanish*/una #cueva genérica# + hintTextTable[RHT_DMC_UPPER_GROTTO] = HintText(CustomMessage("a #generic grotto#", + /*german*/ "", + /*french*/ "une #grotte avec un trésor#")); + // /*spanish*/una #cueva genérica# + + hintTextTable[RHT_DMT_STORMS_GROTTO] = HintText(CustomMessage("a #generic grotto#", + /*german*/ "", + /*french*/ "une #grotte avec un trésor#")); + // /*spanish*/una #cueva genérica# + + hintTextTable[RHT_KAK_OPEN_GROTTO] = HintText(CustomMessage("a #generic grotto#", + /*german*/ "", + /*french*/ "une #grotte avec un trésor#")); + // /*spanish*/una #cueva genérica# + + hintTextTable[RHT_HF_NEAR_MARKET_GROTTO] = HintText(CustomMessage("a #generic grotto#", + /*german*/ "", + /*french*/ "une #grotte avec un trésor#")); + // /*spanish*/una #cueva genérica# + + hintTextTable[RHT_HF_OPEN_GROTTO] = HintText(CustomMessage("a #generic grotto#", + /*german*/ "", + /*french*/ "une #grotte avec un trésor#")); + // /*spanish*/una #cueva genérica# + hintTextTable[RHT_HF_SOUTHEAST_GROTTO] = HintText(CustomMessage("a #generic grotto#", + /*german*/ "", + /*french*/ "une #grotte avec un trésor#")); + // /*spanish*/una #cueva genérica# + + hintTextTable[RHT_KF_STORMS_GROTTO] = HintText(CustomMessage("a #generic grotto#", + /*german*/ "", + /*french*/ "une #grotte avec un trésor#")); + // /*spanish*/una #cueva genérica# + + hintTextTable[RHT_LW_NEAR_SHORTCUTS_GROTTO] = HintText(CustomMessage("a #generic grotto#", + /*german*/ "", + /*french*/ "une #grotte avec un trésor#")); + // /*spanish*/una #cueva genérica# + + hintTextTable[RHT_HF_INSIDE_FENCE_GROTTO] = HintText(CustomMessage("a #single Upgrade Deku Scrub#", + /*german*/ "", + /*french*/ "une #grotte avec une peste Mojo#")); + // /*spanish*/una cueva con un #solitario mercader deku# + + hintTextTable[RHT_LW_SCRUBS_GROTTO] = HintText(CustomMessage("#2 Deku Scrubs# including an Upgrade one", + /*german*/ "", + /*french*/ "une #grotte avec deux pestes Mojo#")); + // /*spanish*/una cueva con #dos mercaderes deku# + + hintTextTable[RHT_COLOSSUS_GROTTO] = HintText(CustomMessage("2 Deku Scrubs", + /*german*/ "", + /*french*/ "une #grotte avec deux pestes Mojo#")); + // /*spanish*/una cueva con #dos mercaderes deku# + + hintTextTable[RHT_ZR_STORMS_GROTTO] = HintText(CustomMessage("2 Deku Scrubs", + /*german*/ "", + /*french*/ "une #grotte avec deux pestes Mojo#")); + // /*spanish*/una cueva con #dos mercaderes deku# + + hintTextTable[RHT_SFM_STORMS_GROTTO] = HintText(CustomMessage("2 Deku Scrubs", + /*german*/ "", + /*french*/ "une #grotte avec deux pestes Mojo#")); + // /*spanish*/una cueva con #dos mercaderes deku# + + hintTextTable[RHT_GV_STORMS_GROTTO] = HintText(CustomMessage("2 Deku Scrubs", + /*german*/ "", + /*french*/ "une #grotte avec deux pestes Mojo#")); + // /*spanish*/una cueva con #dos mercaderes deku# + + hintTextTable[RHT_LH_GROTTO] = HintText(CustomMessage("3 Deku Scrubs", + /*german*/ "", + /*french*/ "une #grotte avec trois pestes Mojo#")); + // /*spanish*/una cueva con #tres mercaderes deku# + + hintTextTable[RHT_DMC_HAMMER_GROTTO] = HintText(CustomMessage("3 Deku Scrubs", + /*german*/ "", + /*french*/ "une #grotte avec trois pestes Mojo#")); + // /*spanish*/una cueva con #tres mercaderes deku# + + hintTextTable[RHT_GC_GROTTO] = HintText(CustomMessage("3 Deku Scrubs", + /*german*/ "", + /*french*/ "une #grotte avec trois pestes Mojo#")); + // /*spanish*/una cueva con #tres mercaderes deku# + + hintTextTable[RHT_LLR_GROTTO] = HintText(CustomMessage("3 Deku Scrubs", + /*german*/ "", + /*french*/ "une #grotte avec trois pestes Mojo#")); + // /*spanish*/una cueva con #tres mercaderes deku# + + hintTextTable[RHT_ZR_FAIRY_GROTTO] = HintText(CustomMessage("a small #Fairy Fountain#", + /*german*/ "", + /*french*/ "une #fontaine de fées#")); + // /*spanish*/una pequeña #fuente de hadas# + + hintTextTable[RHT_HF_FAIRY_GROTTO] = HintText(CustomMessage("a small #Fairy Fountain#", + /*german*/ "", + /*french*/ "une #fontaine de fées#")); + // /*spanish*/una pequeña #fuente de hadas# + + hintTextTable[RHT_SFM_FAIRY_GROTTO] = HintText(CustomMessage("a small #Fairy Fountain#", + /*german*/ "", + /*french*/ "une #fontaine de fées#")); + // /*spanish*/una pequeña #fuente de hadas# + + hintTextTable[RHT_ZD_STORMS_GROTTO] = HintText(CustomMessage("a small #Fairy Fountain#", + /*german*/ "", + /*french*/ "une #fontaine de fées#")); + // /*spanish*/una pequeña #fuente de hadas# + + hintTextTable[RHT_GF_STORMS_GROTTO] = HintText(CustomMessage("a small #Fairy Fountain#", + /*german*/ "", + /*french*/ "une #fontaine de fées#")); + // /*spanish*/una pequeña #fuente de hadas# /*-------------------------- | JUNK HINT TEXT | ---------------------------*/ - hintTable[RHT_JUNK02] = HintText::Junk({ - // obscure text - Text{ "They say you must read the names of \"Special Deal\" shop items carefully.", - /*french*/ "Selon moi, les \"Offres spéciales\" sont parfois trompeuses... Lisez les attentivement!", - /*spanish*/ "Según dicen, se debería prestar atención a los nombres de las ofertas especiales." }, - }); - - hintTable[RHT_JUNK03] = HintText::Junk({ - // obscure text - Text{ "They say that Zelda is a poor leader.", /*french*/ "Selon moi, Zelda ne ferait pas un bon monarque.", - /*spanish*/ "Según dicen, Zelda es mala líder." }, - }); - - hintTable[RHT_JUNK04] = HintText::Junk({ - // obscure text - Text{ "These hints can be quite useful. This is an exception.", - /*french*/ "Ces indices sont très utiles, à l'exception de celui-ci.", - /*spanish*/ "Las pistas suelen servir de ayuda. En cambio, esta no." }, - }); - - hintTable[RHT_JUNK05] = HintText::Junk({ - // obscure text - Text{ "They say that the Lizalfos in Dodongo's Cavern like to play in lava.", - /*french*/ "Selon moi, les Lézalfos de la Caverne Dodongo aiment patauger dans la lave.", - /*spanish*/ "Según dicen, a los Lizalfos de la Cueva de los Dodongos les gusta jugar en la lava." }, - }); - - hintTable[RHT_JUNK06] = HintText::Junk({ - // obscure text - Text{ "They say that all the Zora drowned in Wind Waker.", - /*french*/ "Selon moi, les Zoras se sont noyés dans Wind Waker.", - /*spanish*/ "Según dicen, en Wind Waker todos los zora se ahogaron." }, - }); - - hintTable[RHT_JUNK07] = HintText::Junk({ - // obscure text - Text{ "If Gorons eat rocks, does that mean I'm in danger?", - /*french*/ "Ne dis pas au Gorons que je suis ici. Ils mangent des roches, tu sais!", - /*spanish*/ "Si los Goron se tragan las piedras, ¿no me hace ser una especia vulnarable o algo así" }, - }); - - hintTable[RHT_JUNK08] = HintText::Junk({ - // obscure text - Text{ - "'Member when Ganon was a blue pig?^I 'member.", - /*french*/ "Dans mon temps, Ganon était un cochon bleu...^Pff! Les jeunes de nos jours, et leur Ganondorf!", - /*spanish*/ "¿T'acuerdas cuando Ganon era un cerdo azul?^Qué tiempos, chico." }, - }); - - hintTable[RHT_JUNK09] = HintText::Junk({ - // obscure text - Text{ "One who does not have Triforce can't go in.", /*french*/ "Ceux sans Triforce doivent rebrousser chemin.", - /*spanish*/ "Aquel que no porte la Trifuerza no podrá pasar." }, - }); - - hintTable[RHT_JUNK10] = HintText::Junk({ - // obscure text - Text{ "Save your future, end the Happy Mask Salesman.", - /*french*/ "Selon moi, tu t'éviteras des jours de malheur si tu vaincs le vendeur de masques...", - /*spanish*/ "Salva tu futuro, acaba con el dueño de La Máscara Feliz." }, - }); - - hintTable[RHT_JUNK11] = HintText::Junk({ - // obscure text - Text{ "Glitches are a pathway to many abilities some consider to be... Unnatural.", /*french*/ - "Les glitchs sont un moyen d'acquérir de nombreuses facultés considérées par certains comme... contraire " - "à la nature.", - /*spanish*/ "Los glitches son el camino a muchas habilidades que varios consideran... nada natural." }, - }); - - hintTable[RHT_JUNK12] = HintText::Junk({ - // obscure text - Text{ "I'm stoned. Get it?", /*french*/ "Allez, roche, papier, ciseau...&Roche.", - /*spanish*/ "Me he quedado de piedra. ¿Lo pillas?" }, - }); - - hintTable[RHT_JUNK13] = HintText::Junk({ - // obscure text - Text{ "Hoot! Hoot! Would you like me to repeat that?", /*french*/ "Hou hou! Veux-tu que je répète tout ça?", - /*spanish*/ "¡Buuu, buuu! ¿Te lo vuelvo a repetir?" }, - }); - - hintTable[RHT_JUNK14] = HintText::Junk({ - // obscure text - Text{ "Gorons are stupid. They eat rocks.", /*french*/ "Les Gorons sont des vraies têtes dures.", - /*spanish*/ "Los Goron son tontos. Se comen las piedras." }, - }); - - hintTable[RHT_JUNK15] = HintText::Junk({ - // obscure text - Text{ "They say that Lon Lon Ranch prospered under Ingo.", - /*french*/ "Selon moi, le Ranch Lon Lon était plus prospère sous Ingo.", - /*spanish*/ "Según dicen, el Rancho Lon Lon prosperó gracias a Ingo." }, - }); - - hintTable[RHT_JUNK16] = HintText::Junk({ - // obscure text - Text{ "The single rupee is a unique item.", /*french*/ "Nul objet n'est plus unique que le rubis vert.", - /*spanish*/ "La rupia de uno es un objeto singular." }, - }); - - hintTable[RHT_JUNK17] = HintText::Junk({ - // obscure text - Text{ "Without the Lens of Truth, the Treasure Chest Mini-Game is a 1 out of 32 chance.^Good luck!", - /*french*/ "Gagner la Chasse-aux-Trésors est 1 chance sur 32.^Bonne chance!", /*spanish*/ - "Sin la Lupa de la Verdad, ganarías 1/32 veces en el Cofre del Tesoro.^¡Buena suerte con ello!" }, - }); - - hintTable[RHT_JUNK18] = HintText::Junk({ - // obscure text - Text{ "Use bombs wisely.", /*french*/ "Utilise les bombes avec précaution.", - /*spanish*/ "No desperdicies las bombas." }, - }); - - hintTable[RHT_JUNK19] = HintText::Junk({ - // obscure text - Text{ "They say that Volvagia hates splinters", /*french*/ "Selon moi, Volvagia déteste les échardes.", - /*spanish*/ "Según dicen, Volvagia le teme a las astillas." }, - }); - - hintTable[RHT_JUNK20] = HintText::Junk({ - // obscure text - Text{ "They say that funky monkeys can be spotted on Friday.", - /*french*/ "Selon moi, des capucins coquins sortent le vendredi.", - /*spanish*/ "Según dicen, en los viernes puedes hallar monos marchosos." }, - }); - - hintTable[RHT_JUNK21] = HintText::Junk({ - // obscure text - Text{ "I found you, faker!", /*french*/ "Ah-ha! Je t'ai trouvé!", /*spanish*/ "¡Ahí estás, impostor!" }, - }); - - hintTable[RHT_JUNK22] = HintText::Junk({ - // obscure text - Text{ "They say the Groose is loose.", /*french*/ "Selon moi, Hergo est le vrai héros.", - /*spanish*/ "Según dicen, Malton es un espanto." }, - }); - - hintTable[RHT_JUNK23] = HintText::Junk({ - // obscure text - Text{ - "They say that players who select the \"ON\" option for \"MOTION CONTROL\" are the real \"Zelda players!\"", - /*french*/ "Selon moi, ceux qui utilisent les contrôles gyroscopiques sont les VRAIS joueurs.", /*spanish*/ - "Según dicen, aquellos que juegan usando el control por movimiento son los verdaderos jugadores de " - "Zelda." }, - }); - - hintTable[RHT_JUNK24] = HintText::Junk({ - // obscure text - Text{ "What happened to Sheik?", /*french*/ "Donc... Qu'est-ce qui arrive avec Sheik?", - /*spanish*/ "¿Qué la habrá pasado a Sheik?" }, - }); - - hintTable[RHT_JUNK25] = HintText::Junk({ - // obscure text - Text{ "L2P @.", /*french*/ "Arrête de lire les indices et joue comme un grand, @.", - /*spanish*/ "Mira que eres novato, @." }, - }); - - hintTable[RHT_JUNK26] = HintText::Junk({ - // obscure text - Text{ "I've heard you can cheat at Sploosh Kaboom.", - /*french*/ "Selon moi, il y a une carte aux trésors à Mercantîle... Duh!", - /*spanish*/ "He oído por ahí que puedes hacer trampa en el Sploosh Kaboom." }, - }); - - hintTable[RHT_JUNK27] = HintText::Junk({ - // obscure text - Text{ "I'm Lonk from Pennsylvania.", /*french*/ "Je suis Lonk, le héros de Pennsylvanie!", - /*spanish*/ "Soy Lonk, de Pensilvania." }, - }); - - hintTable[RHT_JUNK28] = HintText::Junk({ - // obscure text - Text{ "I bet you'd like to have more bombs.", /*french*/ "Je parie que tu veux plus de bombes.", - /*spanish*/ "Me apuesto a que quisieras tener más bombas." }, - }); - - hintTable[RHT_JUNK29] = HintText::Junk({ - // obscure text - Text{ "When all else fails, use Fire.", /*french*/ "Quand rien ne marche, utilise le feu.", - /*spanish*/ "Cuando nada funcione, usa el fuego." }, - }); - - hintTable[RHT_JUNK30] = HintText::Junk({ - // obscure text - Text{ "Here's a hint, @. Don't be bad.", /*french*/ "Selon moi, la #Triforce# n'est pas dans le jeu... Duh!", - /*spanish*/ "Aquí tienes una pista, @: deja de ser manco." }, - }); - - hintTable[RHT_JUNK31] = HintText::Junk({ - // obscure text - Text{ "Game Over. Return of Ganon.", /*french*/ "Partie terminée. RETour de Ganon.", - /*spanish*/ "Fin de la partida. El regreso de Ganon." }, - }); - - hintTable[RHT_JUNK32] = HintText::Junk({ - // obscure text - Text{ "May the way of the Hero lead to the Triforce.", - /*french*/ "Que le chemin du héros te mène à la Triforce.", - /*spanish*/ "Puede que la senda del héroe te lleve hacia la Trifuerza." }, - }); - - hintTable[RHT_JUNK33] = HintText::Junk({ - // obscure text - Text{ "Can't find an item? Scan an Amiibo.", /*french*/ "Tu cherches de quoi? Utilise un Amiibo!", - /*spanish*/ "¿No encuentras algo? Escanea un amiibo." }, - }); - - hintTable[RHT_JUNK34] = HintText::Junk({ - // obscure text - Text{ "They say this game has just a few glitches.", - /*french*/ "Selon moi, ce jeu est complètement exempt de glitchs.", - /*spanish*/ "Dicen que este juego apenas tiene glitches." }, - }); - - hintTable[RHT_JUNK35] = HintText::Junk({ - // obscure text - Text{ "BRRING BRRING This is Ulrira. Wrong number?", - /*french*/ "DRING DRING!! Pépé le Ramollo à l'appareil... Quoi? Faux numéro?", - /*spanish*/ "¡Ring! ¡Ring! Al habla Ulrira. ¿Me he equivocado de número?" }, - }); - - hintTable[RHT_JUNK36] = HintText::Junk({ - // obscure text - Text{ "Tingle Tingle Kooloo Limpah!", /*french*/ "Tingle! Tingle! Kooloolin... Pah!", - /*spanish*/ "Tingle, Tingle, Kurulín... ¡PA!" }, - }); - - hintTable[RHT_JUNK37] = HintText::Junk({ - // obscure text - Text{ "L is real 2401", /*french*/ "L is real 2401", /*spanish*/ "L es real 2401." }, - }); - - hintTable[RHT_JUNK38] = HintText::Junk({ - // obscure text - Text{ "They say that Ganondorf will appear in the next Mario Tennis.", - /*french*/ "Selon moi, Ganondorf sera la nouvelle recrue dans Mario Tennis.", - /*spanish*/ "Según dicen, Ganondorf estará en el próximo Mario Tennis." }, - }); - - hintTable[RHT_JUNK39] = HintText::Junk({ - // obscure text - Text{ "Medigoron sells the earliest Breath of the Wild demo.", - /*french*/ "Selon moi, Medigoron vend une démo de #Breath of the Wild#.", - /*spanish*/ "Medigoron vende la primera demo del Breath of the Wild." }, - }); - - hintTable[RHT_JUNK40] = HintText::Junk({ - // obscure text - Text{ "Can you move me? I don't get great service here.", - /*french*/ "Peux-tu me déplacer? J'ai pas une bonne réception ici.", - /*spanish*/ "¿Puedes llevarme a otro lado? Aquí nadie me presta atención." }, - }); - - hintTable[RHT_JUNK41] = HintText::Junk({ - // obscure text - Text{ "They say if you use Strength on the truck, you can find Mew.", - /*french*/ "Selon moi, #Mew# se trouve dessous le camion... Duh!", - /*spanish*/ "Según dicen, puedes hallar un Mew usando Fuerza contra el camión de Ciudad Carmín." }, - }); - - hintTable[RHT_JUNK42] = HintText::Junk({ - // obscure text - Text{ "I'm a helpful hint Gossip Stone!^See, I'm helping.", - /*french*/ "Salut! Je suis une pierre de bons conseils!^Tiens, tu vois? J'aide bien, hein?", - /*spanish*/ "Soy una Piedra Sheikah muy útil.^¡Mira cómo te ayudo!" }, - }); - - hintTable[RHT_JUNK43] = HintText::Junk({ - // obscure text - Text{ - "Dear @, please come to the castle. I've baked a cake for you.&Yours truly, Princess Zelda.", /*french*/ - "Mon très cher @:&Viens vite au château, je t'ai préparé&un délicieux gâteau...^À bientôt, Princesse Zelda", - /*spanish*/ - "Querido @: Por favor, ven al castillo. He hecho una tarta para ti.&Sinceramente tuya: Princesa Zelda." }, - }); - - hintTable[RHT_JUNK44] = HintText::Junk({ - // obscure text - Text{ "They say all toasters toast toast.", /*french*/ "Selon moi, les grille-pains grillent du pain.", - /*spanish*/ "Según dicen, todas las tostadoras tostan tostadas tostadas." }, - }); - - hintTable[RHT_JUNK45] = HintText::Junk({ - // obscure text - Text{ "You thought it would be a useful hint, but it was me, junk hint!", - /*french*/ "Tu t'attendais à un bon indice... Mais c'était moi, un mauvais indice!", /*spanish*/ - "Je... Creeías que iba a ser una piedra de utilidad, ¡pero no, era yo, la piedra de la agonía!" }, - }); - - hintTable[RHT_JUNK46] = HintText::Junk({ - // obscure text - Text{ "They say that quest guidance can be found at a talking rock.", - /*french*/ "Selon moi, des #indices# se trouvent auprès d'une pierre parlante... Duh!", - /*spanish*/ "Según dicen, puedes consultarle ayuda a rocas parlanchinas." }, - }); - - hintTable[RHT_JUNK47] = HintText::Junk({ - // obscure text - Text{ "They say that the final item you're looking for can be found somewhere in Hyrule.", - /*french*/ "Selon moi, le #dernier objet# se trouve quelque part dans Hyrule... Duh!", - /*spanish*/ "Según dicen, el último objeto que te falte puede estar en cualquier rincón de Hyrule." }, - }); - - hintTable[RHT_JUNK48] = HintText::Junk({ - // obscure text - Text{ "Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.", - /*french*/ "Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.", - /*spanish*/ "Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep." }, - }); - - hintTable[RHT_JUNK49] = HintText::Junk({ - // obscure text - Text{ "They say that Barinade fears Deku Nuts.", /*french*/ "Selon moi, Barinade a la frousse des noix Mojo.", - /*spanish*/ "Según dicen, lo que más teme a Barinade son las nueces deku." }, - }); - - hintTable[RHT_JUNK50] = HintText::Junk({ - // obscure text - Text{ "They say that Flare Dancers do not fear Goron-crafted blades.", - /*french*/ "Selon moi, le danse-flamme n'a pas peur des armes de Goron.", - /*spanish*/ "Según dicen, los Bailafuegos no le temen a las armas forjadas por Gorons." }, - }); - - hintTable[RHT_JUNK51] = HintText::Junk({ - // obscure text - Text{ "They say that Morpha is easily trapped in a corner.", - /*french*/ "Selon moi, Morpha est facilement coincé.", - /*spanish*/ "Según dicen, puedes atrapar a Morpha con facilidad en una esquina." }, - }); - - hintTable[RHT_JUNK52] = HintText::Junk({ - // obscure text - Text{ "They say that Bongo Bongo really hates the cold.", - /*french*/ "Selon moi, Bongo Bongo a facilement froid aux doigts.", - /*spanish*/ "Según dicen, Bongo Bongo odia a muerte el frío." }, - }); - - hintTable[RHT_JUNK53] = HintText::Junk({ - // obscure text - Text{ "They say that your sword is most powerful when you put it away.", - /*french*/ "Selon moi, ton épée est à pleine puissance quand tu la rengaines.", - /*spanish*/ "Según dicen, tu espada se vuelve más poderosa si la guardas." }, - }); - - hintTable[RHT_JUNK54] = HintText::Junk({ - // obscure text - Text{ "They say that bombing the hole Volvagia last flew into can be rewarding.", - /*french*/ "Selon moi, le trou où se creuse Volvagia est vulnérable aux bombes.", /*spanish*/ - "Según dicen, trae buena suerte colocar una bomba en el último agujero de donde salió Volvagia." }, - }); - - hintTable[RHT_JUNK55] = HintText::Junk({ - // obscure text - Text{ "They say that invisible ghosts can be exposed with Deku Nuts.", - /*french*/ "Selon moi, des fantômes invisibles apparaissent avec des noix Mojo.", - /*spanish*/ "Según dicen, puedes exponer a los espectros invisibles con nueces deku." }, - }); - - hintTable[RHT_JUNK56] = HintText::Junk({ - // obscure text - Text{ "They say that the real Phantom Ganon is bright and loud.", - /*french*/ "Selon moi, le vrai spectre de Ganon est clair et bruyant.", - /*spanish*/ "Según dicen, el verdadero Ganon Fantasma es brillante y ruidoso." }, - }); - - hintTable[RHT_JUNK57] = HintText::Junk({ - // obscure text - Text{ "They say that walking backwards is very fast.", - /*french*/ "Selon moi, tu fais marche arrière très rapidement pour un héros.", - /*spanish*/ "Según dicen, es más rápido caminar hacia atrás." }, - }); - - hintTable[RHT_JUNK58] = HintText::Junk({ - // obscure text - Text{ - "They say that leaping above the Market entrance enriches most children.", - /*french*/ "Selon moi, les enfants riches se pavanent en haut du pont-levis.", - /*spanish*/ "Según dicen, saltar por las cadenas a la entrada de la plaza enriquece a muchos chiquillos." }, - }); - - hintTable[RHT_JUNK59] = HintText::Junk({ - // obscure text - Text{ "They say Ingo is not very good at planning ahead.", - /*french*/ "Selon moi, Ingo ne fait pas un très bon geôlier.", - /*spanish*/ "Según dicen, a Ingo no se le da especialmente bien planificar con antelación." }, - }); - - hintTable[RHT_JUNK60] = HintText::Junk({ - // obscure text - Text{ "You found a spiritual Stone! By which I mean, I worship Nayru.", - /*french*/ "Vous avez trouvé une Pierre Ancestrale! En effet, je vénère la déesse Hylia.", - /*spanish*/ "¡Has encontrado una piedra espiritual! Es que le rindo culto a Nayru..." }, - }); - - hintTable[RHT_JUNK61] = HintText::Junk({ - // obscure text - Text{ "They say that a flying strike with a Deku Stick is no stronger than a grounded one.", - /*french*/ "Selon moi, un coup de bâton sauté n'est pas meilleur qu'au sol.", - /*spanish*/ "Según dicen, los golpes aéreos con palos deku son tan fuertes como los normales." }, - }); - - hintTable[RHT_JUNK62] = HintText::Junk({ - // obscure text - Text{ "Open your eyes.^Open your eyes.^Wake up, @.", - /*french*/ "Réveille-toi...^Réveille-toi.^Ouvre les yeux, @.", - /*spanish*/ "Abre los ojos...^Abre los ojos...^Despierta, @..." }, - }); - - hintTable[RHT_JUNK63] = HintText::Junk({ - // obscure text - Text{ "They say that the Nocturne of Shadow can bring you very close to Ganon.", - /*french*/ "Selon moi, le nocturne de l'ombre peut t'amener très près de Ganon.", - /*spanish*/ "Según dicen, el Nocturno de la sombra te puede acercar mucho a Ganon." }, - }); - - hintTable[RHT_JUNK64] = HintText::Junk({ - // obscure text - Text{ "They say that Twinrova always casts the same spell the first three times.", - /*french*/ "Selon moi, Twinrova lance toujours les mêmes trois premiers sorts.", - /*spanish*/ "Según dicen, Birova siempre lanza el mismo hechizo las tres primeras veces." }, - }); - - hintTable[RHT_JUNK65] = HintText::Junk({ - // obscure text - Text{ "They say that the nightly builds may be unstable.", - /*french*/ "Selon moi, les \"nightly builds\" peuvent être instables.", - /*spanish*/ "Según dicen, las últimas nightlies pueden llegar a ser algo inestables." }, - }); - - hintTable[RHT_JUNK66] = HintText::Junk({ - // obscure text - Text{ "You're playing a Randomizer. I'm randomized!^Here's a random number: #4#.&Enjoy your Randomizer!", - /*french*/ "Tu joues à un randomizer. Je suis aléatoire!^Voici un nombre aléatoire: #4#.&Bonne partie!", - /*spanish*/ - "¡Estás jugando un Randomizer! ¡Yo también estoy aleatorizada!^Aquí tienes un número aleatorio: " - "#8#.&¡Diviértete!" }, - }); - - hintTable[RHT_JUNK67] = HintText::Junk({ - // obscure text - Text{ "They say Ganondorf's bolts can be reflected with glass or steel.", - /*french*/ "Selon moi, les éclairs de Ganon se reflètent sur l'acier et le verre.", - /*spanish*/ "Según dicen, puedes reflejar las esferas de energía de Ganondorf con cristal y acero." }, - }); - - hintTable[RHT_JUNK68] = HintText::Junk({ - // obscure text - Text{ "They say Ganon's tail is vulnerable to nuts, arrows, swords, explosives, hammers...^...sticks, seeds, " - "boomerangs...^...rods, shovels, iron balls, angry bees...", - /*french*/ - "Selon moi, la queue de Ganon est vulnérable aux noix, flèches, épées, bombes, marteaux...^...bâtons, " - "graines, boomerangs...^...baguettes, pelles, boulets de fer, abeilles enragées...", - /*spanish*/ - "Según dicen, la cola de Ganon es vulnerable a nueces, flechas, espadas, explosivos, " - "martillos...^...palos, semillas, bumeráns...^...cetros, palas, bolas de hierro, abejas..." }, - }); - - hintTable[RHT_JUNK69] = HintText::Junk({ - // obscure text - Text{ - "They say that you're wasting time reading this hint, but I disagree. Talk to me again!", - /*french*/ "Selon moi... tu sais quoi? Parle-moi encore, et je te le dirai!", /*spanish*/ - "Según dicen, pierdes el tiempo en leer esta pista, pero no pienso igual. ¡Vuelve a hablarme, ya verás!" }, - }); - - hintTable[RHT_JUNK70] = HintText::Junk({ - // obscure text - Text{ "They say Ganondorf knows where to find the instrument of his doom.", - /*french*/ "Selon moi, Ganondorf sait où il a caché son point faible.", - /*spanish*/ "Según dicen, Ganondorf sabe dónde hallar el instrumento de su perdición." }, - }); - - hintTable[RHT_JUNK71] = HintText::Junk({ - // obscure text - Text{ "I heard @ is pretty good at Zelda.", /*french*/ "Apparemment, @ est super bon à Zelda.", - /*spanish*/ "He oído que a @ se le dan muy bien los Zelda." }, - }); - - hintTable[RHT_JUNK72] = HintText::Junk({ - // obscure text - Text{ "Hi @, we've been trying to reach you about your car's extended warranty. ", - /*french*/ "Bonjour, @. Vous avez une voiture? Vous savez, nous offrons des assurances abordables...", - /*spanish*/ - "Buenas, @. Le llamamos para ofrecerle un nuevo seguro de hogar que puede pagar en cómodos plazos, sin " - "intereses ni comisiones." }, - }); - - hintTable[RHT_JUNK73] = HintText::Junk({ - // obscure text - Text{ "They say that the best weapon against Iron Knuckles is item 176.", - /*french*/ "Selon moi, les hache-viandes sont vulnérables contre l'objet 176.", - /*spanish*/ "Según dicen, la mejor arma para enfrentarse a los Nudillos de hierro es el objeto 176." }, - }); - - hintTable[RHT_JUNK74] = HintText::Junk({ - // obscure text - Text{ "They say that it's actually possible to beat the running man.", - /*french*/ "Selon moi, il est possible de battre le coureur.&Donc, tu prends ton arc, et...", - /*spanish*/ "Según dicen, con mucha perseverancia puedes ganarle al corredor con la capucha de conejo." }, - }); - - hintTable[RHT_JUNK75] = HintText::Junk({ - // obscure text - Text{ "They say that the stone-cold guardian of the Well is only present during work hours.", - /*french*/ "Selon moi, le gardien de pierre du Puits quitte le soir pour aller se coucher.", - /*spanish*/ "Según dicen, la inmensa roca que bloquea el pozo solo trabaja en horas laborales." }, - }); - - hintTable[RHT_JUNK76] = HintText::Junk({ - // obscure text - Text{ - "They say this hint makes more sense in other languages.", - /*french*/ "Selon moi, ces indices auraient pu être mieux traduits... Duh!", - /*spanish*/ "Según dicen, esta pista revela algo de vital importancia si cambias el idioma del juego..." }, - }); - - hintTable[RHT_JUNK77] = HintText::Junk({ - // obscure text - Text{ "BOK? No way.", /*french*/ "BD'accord? Hors de question.", /*spanish*/ "¿BVale? Ni hablar." }, - }); + hintTextTable[RHT_JUNK02] = HintText(CustomMessage("They say you must read the names of \"Special Deal\" shop items carefully.", + /*german*/ "", + /*french*/ "Selon moi, les \"Offres spéciales\" sont parfois trompeuses... Lisez les attentivement!")); + // /*spanish*/"Según dicen, se debería prestar atención a los nombres de las ofertas especiales." + + + hintTextTable[RHT_JUNK03] = HintText(CustomMessage("They say that Zelda is a poor leader.", + /*german*/ "", + /*french*/ "Selon moi, Zelda ne ferait pas un bon monarque.")); + // /*spanish*/Según dicen, Zelda es mala líder. + + hintTextTable[RHT_JUNK04] = HintText(CustomMessage("These hints can be quite useful. This is an exception.", + /*german*/ "", + /*french*/ "Ces indices sont très utiles, à l'exception de celui-ci.")); + // /*spanish*/Las pistas suelen servir de ayuda. En cambio, esta no. + + hintTextTable[RHT_JUNK05] = HintText(CustomMessage("They say that the Lizalfos in Dodongo's Cavern like to play in lava.", + /*german*/ "", + /*french*/ "Selon moi, les Lézalfos de la Caverne Dodongo aiment patauger dans la lave.")); + // /*spanish*/Según dicen, a los Lizalfos de la Cueva de los Dodongos les gusta jugar en la lava. + + hintTextTable[RHT_JUNK06] = HintText(CustomMessage("They say that all the Zora drowned in Wind Waker.", + /*german*/ "", + /*french*/ "Selon moi, les Zoras se sont noyés dans Wind Waker.")); + // /*spanish*/Según dicen, en Wind Waker todos los zora se ahogaron. + + hintTextTable[RHT_JUNK07] = HintText(CustomMessage("If Gorons eat rocks, does that mean I'm in danger?", + /*german*/ "", + /*french*/ "Ne dis pas au Gorons que je suis ici. Ils mangent des roches, tu sais!")); + // /*spanish*/Si los Goron se tragan las piedras, ¿no me hace ser una especia vulnarable o algo así + + hintTextTable[RHT_JUNK08] = HintText(CustomMessage("'Member when Ganon was a blue pig?^I 'member.", + /*german*/ "", + /*french*/ "Dans mon temps, Ganon était un cochon bleu...^Pff! Les jeunes de nos jours, et leur Ganondorf!")); + // /*spanish*/¿T'acuerdas cuando Ganon era un cerdo azul?^Qué tiempos, chico. + + hintTextTable[RHT_JUNK09] = HintText(CustomMessage("One who does not have Triforce can't go in.", + /*german*/ "", + /*french*/ "Ceux sans Triforce doivent rebrousser chemin.")); + // /*spanish*/Aquel que no porte la Trifuerza no podrá pasar. + + hintTextTable[RHT_JUNK10] = HintText(CustomMessage("Save your future, end the Happy Mask Salesman.", + /*german*/ "", + /*french*/ "Selon moi, tu t'éviteras des jours de malheur si tu vaincs le vendeur de masques...")); + // /*spanish*/Salva tu futuro, acaba con el dueño de La Máscara Feliz. + + hintTextTable[RHT_JUNK11] = HintText(CustomMessage("Glitches are a pathway to many abilities some consider to be... Unnatural.", + /*german*/ "Los glitches son el camino a muchas habilidades que varios consideran... nada natural.", + /*french*/ "Les glitchs sont un moyen d'acquérir de nombreuses facultés considérées par certains comme... contraire ")); + // /*spanish*/à la nature. + + hintTextTable[RHT_JUNK12] = HintText(CustomMessage("I'm stoned. Get it?", + /*german*/ "", + /*french*/ "Allez, roche, papier, ciseau...&Roche.")); + // /*spanish*/Me he quedado de piedra. ¿Lo pillas? + + hintTextTable[RHT_JUNK13] = HintText(CustomMessage("Hoot! Hoot! Would you like me to repeat that?", + /*german*/ "", + /*french*/ "Hou hou! Veux-tu que je répète tout ça?")); + // /*spanish*/¡Buuu, buuu! ¿Te lo vuelvo a repetir? + + hintTextTable[RHT_JUNK14] = HintText(CustomMessage("Gorons are stupid. They eat rocks.", + /*german*/ "", + /*french*/ "Les Gorons sont des vraies têtes dures.")); + // /*spanish*/Los Goron son tontos. Se comen las piedras. + + hintTextTable[RHT_JUNK15] = HintText(CustomMessage("They say that Lon Lon Ranch prospered under Ingo.", + /*german*/ "", + /*french*/ "Selon moi, le Ranch Lon Lon était plus prospère sous Ingo.")); + // /*spanish*/Según dicen, el Rancho Lon Lon prosperó gracias a Ingo. + + hintTextTable[RHT_JUNK16] = HintText(CustomMessage("The single rupee is a unique item.", + /*german*/ "", + /*french*/ "Nul objet n'est plus unique que le rubis vert.")); + // /*spanish*/La rupia de uno es un objeto singular. + + hintTextTable[RHT_JUNK17] = HintText(CustomMessage("Without the Lens of Truth, the Treasure Chest Mini-Game is a 1 out of 32 chance.^Good luck!", + /*german*/ "", + /*french*/ "Gagner la Chasse-aux-Trésors est 1 chance sur 32.^Bonne chance!")); + // /*spanish*/Sin la Lupa de la Verdad, ganarías 1/32 veces en el Cofre del Tesoro.^¡Buena suerte con ello! + + hintTextTable[RHT_JUNK18] = HintText(CustomMessage("Use bombs wisely.", + /*german*/ "", + /*french*/ "Utilise les bombes avec précaution.")); + // /*spanish*/No desperdicies las bombas. + + hintTextTable[RHT_JUNK19] = HintText(CustomMessage("They say that Volvagia hates splinters", + /*german*/ "", + /*french*/ "Selon moi, Volvagia déteste les échardes.")); + // /*spanish*/Según dicen, Volvagia le teme a las astillas. + + hintTextTable[RHT_JUNK20] = HintText(CustomMessage("They say that funky monkeys can be spotted on Friday.", + /*german*/ "", + /*french*/ "Selon moi, des capucins coquins sortent le vendredi.")); + // /*spanish*/Según dicen, en los viernes puedes hallar monos marchosos. + + hintTextTable[RHT_JUNK21] = HintText(CustomMessage("I found you, faker!", + /*german*/ "", + /*french*/ "Ah-ha! Je t'ai trouvé!")); + // /*spanish*/¡Ahí estás, impostor! + + hintTextTable[RHT_JUNK22] = HintText(CustomMessage("They say the Groose is loose.", + /*german*/ "", + /*french*/ "Selon moi, Hergo est le vrai héros.")); + // /*spanish*/Según dicen, Malton es un espanto. + + hintTextTable[RHT_JUNK23] = HintText(CustomMessage("They say that players who select the \"ON\" option for \"MOTION CONTROL\" are the real \"Zelda players!\"", + /*german*/ "", + /*french*/ "Selon moi, ceux qui utilisent les contrôles gyroscopiques sont les VRAIS joueurs.")); + // /*spanish*/ "Según dicen, aquellos que juegan usando el control por movimiento son los verdaderos jugadores de Zelda." + + hintTextTable[RHT_JUNK24] = HintText(CustomMessage("What happened to Sheik?", + /*german*/ "", + /*french*/ "Donc... Qu'est-ce qui arrive avec Sheik?")); + // /*spanish*/¿Qué la habrá pasado a Sheik? + + hintTextTable[RHT_JUNK25] = HintText(CustomMessage("L2P @.", + /*german*/ "", + /*french*/ "Arrête de lire les indices et joue comme un grand, @.")); + // /*spanish*/Mira que eres novato, @. + + hintTextTable[RHT_JUNK26] = HintText(CustomMessage("I've heard you can cheat at Sploosh Kaboom.", + /*german*/ "", + /*french*/ "Selon moi, il y a une carte aux trésors à Mercantîle... Duh!")); + // /*spanish*/He oído por ahí que puedes hacer trampa en el Sploosh Kaboom. + + hintTextTable[RHT_JUNK27] = HintText(CustomMessage("I'm Lonk from Pennsylvania.", + /*german*/ "", + /*french*/ "Je suis Lonk, le héros de Pennsylvanie!")); + // /*spanish*/Soy Lonk, de Pensilvania. + + hintTextTable[RHT_JUNK28] = HintText(CustomMessage("I bet you'd like to have more bombs.", + /*german*/ "", + /*french*/ "Je parie que tu veux plus de bombes.")); + // /*spanish*/Me apuesto a que quisieras tener más bombas. + + hintTextTable[RHT_JUNK29] = HintText(CustomMessage("When all else fails, use Fire.", + /*german*/ "", + /*french*/ "Quand rien ne marche, utilise le feu.")); + // /*spanish*/Cuando nada funcione, usa el fuego. + + hintTextTable[RHT_JUNK30] = HintText(CustomMessage("Here's a hint, @. Don't be bad.", + /*german*/ "", + /*french*/ "Selon moi, la #Triforce# n'est pas dans le jeu... Duh!")); + // /*spanish*/Aquí tienes una pista, @: deja de ser manco. + + hintTextTable[RHT_JUNK31] = HintText(CustomMessage("Game Over. Return of Ganon.", + /*german*/ "", + /*french*/ "Partie terminée. RETour de Ganon.")); + // /*spanish*/Fin de la partida. El regreso de Ganon. + + hintTextTable[RHT_JUNK32] = HintText(CustomMessage("May the way of the Hero lead to the Triforce.", + /*german*/ "", + /*french*/ "Que le chemin du héros te mène à la Triforce.")); + // /*spanish*/Puede que la senda del héroe te lleve hacia la Trifuerza. + + hintTextTable[RHT_JUNK33] = HintText(CustomMessage("Can't find an item? Scan an Amiibo.", + /*german*/ "", + /*french*/ "Tu cherches de quoi? Utilise un Amiibo!")); + // /*spanish*/¿No encuentras algo? Escanea un amiibo. + + hintTextTable[RHT_JUNK34] = HintText(CustomMessage("They say this game has just a few glitches.", + /*german*/ "", + /*french*/ "Selon moi, ce jeu est complètement exempt de glitchs.")); + // /*spanish*/Dicen que este juego apenas tiene glitches. + + hintTextTable[RHT_JUNK35] = HintText(CustomMessage("BRRING BRRING This is Ulrira. Wrong number?", + /*german*/ "", + /*french*/ "DRING DRING!! Pépé le Ramollo à l'appareil... Quoi? Faux numéro?")); + // /*spanish*/¡Ring! ¡Ring! Al habla Ulrira. ¿Me he equivocado de número? + + hintTextTable[RHT_JUNK36] = HintText(CustomMessage("Tingle Tingle Kooloo Limpah!", + /*german*/ "", + /*french*/ "Tingle! Tingle! Kooloolin... Pah!")); + // /*spanish*/Tingle, Tingle, Kurulín... ¡PA! + + hintTextTable[RHT_JUNK37] = HintText(CustomMessage("L is real 2401", + /*german*/ "", + /*french*/ "L is real 2401")); + // /*spanish*/L es real 2401. + + hintTextTable[RHT_JUNK38] = HintText(CustomMessage("They say that Ganondorf will appear in the next Mario Tennis.", + /*german*/ "", + /*french*/ "Selon moi, Ganondorf sera la nouvelle recrue dans Mario Tennis.")); + // /*spanish*/Según dicen, Ganondorf estará en el próximo Mario Tennis. + + hintTextTable[RHT_JUNK39] = HintText(CustomMessage("Medigoron sells the earliest Breath of the Wild demo.", + /*german*/ "", + /*french*/ "Selon moi, Medigoron vend une démo de #Breath of the Wild#.")); + // /*spanish*/Medigoron vende la primera demo del Breath of the Wild. + + hintTextTable[RHT_JUNK40] = HintText(CustomMessage("Can you move me? I don't get great service here.", + /*german*/ "", + /*french*/ "Peux-tu me déplacer? J'ai pas une bonne réception ici.")); + // /*spanish*/¿Puedes llevarme a otro lado? Aquí nadie me presta atención. + + hintTextTable[RHT_JUNK41] = HintText(CustomMessage("They say if you use Strength on the truck, you can find Mew.", + /*german*/ "", + /*french*/ "Selon moi, #Mew# se trouve dessous le camion... Duh!")); + // /*spanish*/Según dicen, puedes hallar un Mew usando Fuerza contra el camión de Ciudad Carmín. + + hintTextTable[RHT_JUNK42] = HintText(CustomMessage("I'm a helpful hint Gossip Stone!^See, I'm helping.", + /*german*/ "", + /*french*/ "Salut! Je suis une pierre de bons conseils!^Tiens, tu vois? J'aide bien, hein?")); + // /*spanish*/Soy una Piedra Sheikah muy útil.^¡Mira cómo te ayudo! + + hintTextTable[RHT_JUNK43] = HintText(CustomMessage("Dear @, please come to the castle. I've baked a cake for you.&Yours truly, Princess Zelda.", + /*german*/ "", + /*french*/ "Mon très cher @:&Viens vite au château, je t'ai préparé&un délicieux gâteau...^À bientôt, Princesse Zelda")); + // /*spanish*/Querido @: Por favor, ven al castillo. He hecho una tarta para ti.&Sinceramente tuya: Princesa Zelda. + + hintTextTable[RHT_JUNK44] = HintText(CustomMessage("They say all toasters toast toast.", + /*german*/ "", + /*french*/ "Selon moi, les grille-pains grillent du pain.")); + // /*spanish*/Según dicen, todas las tostadoras tostan tostadas tostadas. + + hintTextTable[RHT_JUNK45] = HintText(CustomMessage("You thought it would be a useful hint, but it was me, junk hint!", + /*german*/ "", + /*french*/ "Tu t'attendais à un bon indice... Mais c'était moi, un mauvais indice!")); + // /*spanish*/Je... Creeías que iba a ser una piedra de utilidad, ¡pero no, era yo, la piedra de la agonía! + + hintTextTable[RHT_JUNK46] = HintText(CustomMessage("They say that quest guidance can be found at a talking rock.", + /*german*/ "", + /*french*/ "Selon moi, des #indices# se trouvent auprès d'une pierre parlante... Duh!")); + // /*spanish*/Según dicen, puedes consultarle ayuda a rocas parlanchinas. + + hintTextTable[RHT_JUNK47] = HintText(CustomMessage("They say that the final item you're looking for can be found somewhere in Hyrule.", + /*german*/ "", + /*french*/ "Selon moi, le #dernier objet# se trouve quelque part dans Hyrule... Duh!")); + // /*spanish*/Según dicen, el último objeto que te falte puede estar en cualquier rincón de Hyrule. + + hintTextTable[RHT_JUNK48] = HintText(CustomMessage("Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.", + /*german*/ "", + /*french*/ "Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.")); + // /*spanish*/Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep. + + hintTextTable[RHT_JUNK49] = HintText(CustomMessage("They say that Barinade fears Deku Nuts.", + /*german*/ "", + /*french*/ "Selon moi, Barinade a la frousse des noix Mojo.")); + // /*spanish*/Según dicen, lo que más teme a Barinade son las nueces deku. + + hintTextTable[RHT_JUNK50] = HintText(CustomMessage("They say that Flare Dancers do not fear Goron-crafted blades.", + /*german*/ "", + /*french*/ "Selon moi, le danse-flamme n'a pas peur des armes de Goron.")); + // /*spanish*/Según dicen, los Bailafuegos no le temen a las armas forjadas por Gorons. + + hintTextTable[RHT_JUNK51] = HintText(CustomMessage("They say that Morpha is easily trapped in a corner.", + /*german*/ "", + /*french*/ "Selon moi, Morpha est facilement coincé.")); + // /*spanish*/Según dicen, puedes atrapar a Morpha con facilidad en una esquina. + + hintTextTable[RHT_JUNK52] = HintText(CustomMessage("They say that Bongo Bongo really hates the cold.", + /*german*/ "", + /*french*/ "Selon moi, Bongo Bongo a facilement froid aux doigts.")); + // /*spanish*/Según dicen, Bongo Bongo odia a muerte el frío. + + hintTextTable[RHT_JUNK53] = HintText(CustomMessage("They say that your sword is most powerful when you put it away.", + /*german*/ "", + /*french*/ "Selon moi, ton épée est à pleine puissance quand tu la rengaines.")); + // /*spanish*/Según dicen, tu espada se vuelve más poderosa si la guardas. + + hintTextTable[RHT_JUNK54] = HintText(CustomMessage("They say that bombing the hole Volvagia last flew into can be rewarding.", + /*german*/ "", + /*french*/ "Selon moi, le trou où se creuse Volvagia est vulnérable aux bombes.")); + // /*spanish*/Según dicen, trae buena suerte colocar una bomba en el último agujero de donde salió Volvagia. + + hintTextTable[RHT_JUNK55] = HintText(CustomMessage("They say that invisible ghosts can be exposed with Deku Nuts.", + /*german*/ "", + /*french*/ "Selon moi, des fantômes invisibles apparaissent avec des noix Mojo.")); + // /*spanish*/Según dicen, puedes exponer a los espectros invisibles con nueces deku. + + hintTextTable[RHT_JUNK56] = HintText(CustomMessage("They say that the real Phantom Ganon is bright and loud.", + /*german*/ "", + /*french*/ "Selon moi, le vrai spectre de Ganon est clair et bruyant.")); + // /*spanish*/Según dicen, el verdadero Ganon Fantasma es brillante y ruidoso. + + hintTextTable[RHT_JUNK57] = HintText(CustomMessage("They say that walking backwards is very fast.", + /*german*/ "", + /*french*/ "Selon moi, tu fais marche arrière très rapidement pour un héros.")); + // /*spanish*/Según dicen, es más rápido caminar hacia atrás. + + hintTextTable[RHT_JUNK58] = HintText(CustomMessage("They say that leaping above the Market entrance enriches most children.", + /*german*/ "", + /*french*/ "Selon moi, les enfants riches se pavanent en haut du pont-levis.")); + // /*spanish*/Según dicen, saltar por las cadenas a la entrada de la plaza enriquece a muchos chiquillos. + + hintTextTable[RHT_JUNK59] = HintText(CustomMessage("They say Ingo is not very good at planning ahead.", + /*german*/ "", + /*french*/ "Selon moi, Ingo ne fait pas un très bon geôlier.")); + // /*spanish*/Según dicen, a Ingo no se le da especialmente bien planificar con antelación. + + hintTextTable[RHT_JUNK60] = HintText(CustomMessage("You found a spiritual Stone! By which I mean, I worship Nayru.", + /*german*/ "", + /*french*/ "Vous avez trouvé une Pierre Ancestrale! En effet, je vénère la déesse Hylia.")); + // /*spanish*/¡Has encontrado una piedra espiritual! Es que le rindo culto a Nayru... + + hintTextTable[RHT_JUNK61] = HintText(CustomMessage("They say that a flying strike with a Deku Stick is no stronger than a grounded one.", + /*german*/ "", + /*french*/ "Selon moi, un coup de bâton sauté n'est pas meilleur qu'au sol.")); + // /*spanish*/Según dicen, los golpes aéreos con palos deku son tan fuertes como los normales. + + hintTextTable[RHT_JUNK62] = HintText(CustomMessage("Open your eyes.^Open your eyes.^Wake up, @.", + /*german*/ "", + /*french*/ "Réveille-toi...^Réveille-toi.^Ouvre les yeux, @.")); + // /*spanish*/Abre los ojos...^Abre los ojos...^Despierta, @... + + hintTextTable[RHT_JUNK63] = HintText(CustomMessage("They say that the Nocturne of Shadow can bring you very close to Ganon.", + /*german*/ "", + /*french*/ "Selon moi, le nocturne de l'ombre peut t'amener très près de Ganon.")); + // /*spanish*/Según dicen, el Nocturno de la sombra te puede acercar mucho a Ganon. + + hintTextTable[RHT_JUNK64] = HintText(CustomMessage("They say that Twinrova always casts the same spell the first three times.", + /*german*/ "", + /*french*/ "Selon moi, Twinrova lance toujours les mêmes trois premiers sorts.")); + // /*spanish*/Según dicen, Birova siempre lanza el mismo hechizo las tres primeras veces. + + hintTextTable[RHT_JUNK65] = HintText(CustomMessage("They say that the nightly builds may be unstable.", + /*german*/ "", + /*french*/ "Selon moi, les \"nightly builds\" peuvent être instables.")); + // /*spanish*/Según dicen, las últimas nightlies pueden llegar a ser algo inestables. + + hintTextTable[RHT_JUNK66] = HintText(CustomMessage("You're playing a Randomizer. I'm randomized!^Here's a random number: #4#.&Enjoy your Randomizer!", + /*german*/ "", + /*french*/ "Tu joues à un randomizer. Je suis aléatoire!^Voici un nombre aléatoire: #4#.&Bonne partie!")); + // /*spanish*/¡Estás jugando un Randomizer! ¡Yo también estoy aleatorizada!^Aquí tienes un número aleatorio: #8#.&¡Diviértete! + + hintTextTable[RHT_JUNK67] = HintText(CustomMessage("They say Ganondorf's bolts can be reflected with glass or steel.", + /*german*/ "", + /*french*/ "Selon moi, les éclairs de Ganon se reflètent sur l'acier et le verre.")); + // /*spanish*/Según dicen, puedes reflejar las esferas de energía de Ganondorf con cristal y acero. + + hintTextTable[RHT_JUNK68] = HintText(CustomMessage("They say Ganon's tail is vulnerable to nuts, arrows, swords, explosives, hammers...^...sticks, seeds, " + "boomerangs...^...rods, shovels, iron balls, angry bees...", + /*german*/ "", + /*french*/ "Selon moi, la queue de Ganon est vulnérable aux noix, flèches, épées, bombes, marteaux...^...bâtons, " + "graines, boomerangs...^...baguettes, pelles, boulets de fer, abeilles enragées...")); + // /*spanish*/Según dicen, la cola de Ganon es vulnerable a nueces, flechas, espadas, explosivos, + // martillos...^...palos, semillas, bumeráns...^...cetros, palas, bolas de hierro, abejas... + + hintTextTable[RHT_JUNK69] = HintText(CustomMessage("They say that you're wasting time reading this hint, but I disagree. Talk to me again!", + /*german*/ "", + /*french*/ "Selon moi... tu sais quoi? Parle-moi encore, et je te le dirai!")); + // /*spanish*/Según dicen, pierdes el tiempo en leer esta pista, pero no pienso igual. ¡Vuelve a hablarme, ya verás! + + hintTextTable[RHT_JUNK70] = HintText(CustomMessage("They say Ganondorf knows where to find the instrument of his doom.", + /*german*/ "", + /*french*/ "Selon moi, Ganondorf sait où il a caché son point faible.")); + // /*spanish*/Según dicen, Ganondorf sabe dónde hallar el instrumento de su perdición. + + hintTextTable[RHT_JUNK71] = HintText(CustomMessage("I heard @ is pretty good at Zelda.", + /*german*/ "", + /*french*/ "Apparemment, @ est super bon à Zelda.")); + // /*spanish*/He oído que a @ se le dan muy bien los Zelda. + + hintTextTable[RHT_JUNK72] = HintText(CustomMessage("Hi @, we've been trying to reach you about your car's extended warranty. ", + /*german*/ "", + /*french*/ "Bonjour, @. Vous avez une voiture? Vous savez, nous offrons des assurances abordables...")); + // /*spanish*/Buenas, @. Le llamamos para ofrecerle un nuevo seguro de hogar que puede pagar en cómodos plazos, sin + // intereses ni comisiones. + + hintTextTable[RHT_JUNK73] = HintText(CustomMessage("They say that the best weapon against Iron Knuckles is item 176.", + /*german*/ "", + /*french*/ "Selon moi, les hache-viandes sont vulnérables contre l'objet 176.")); + // /*spanish*/Según dicen, la mejor arma para enfrentarse a los Nudillos de hierro es el objeto 176. + + hintTextTable[RHT_JUNK74] = HintText(CustomMessage("They say that it's actually possible to beat the running man.", + /*german*/ "", + /*french*/ "Selon moi, il est possible de battre le coureur.&Donc, tu prends ton arc, et...")); + // /*spanish*/Según dicen, con mucha perseverancia puedes ganarle al corredor con la capucha de conejo. + + hintTextTable[RHT_JUNK75] = HintText(CustomMessage("They say that the stone-cold guardian of the Well is only present during work hours.", + /*german*/ "", + /*french*/ "Selon moi, le gardien de pierre du Puits quitte le soir pour aller se coucher.")); + // /*spanish*/Según dicen, la inmensa roca que bloquea el pozo solo trabaja en horas laborales. + + hintTextTable[RHT_JUNK76] = HintText(CustomMessage("They say this hint makes more sense in other languages.", + /*german*/ "", + /*french*/ "Selon moi, ces indices auraient pu être mieux traduits... Duh!")); + // /*spanish*/Según dicen, esta pista revela algo de vital importancia si cambias el idioma del juego... + + hintTextTable[RHT_JUNK77] = HintText(CustomMessage("BOK? No way.", + /*german*/ "", + /*french*/ "BD'accord? Hors de question.")); + // /*spanish*/¿BVale? Ni hablar. // ^ junk hints above are from 3drando // v junk hints below are new to soh rando @@ -2087,1436 +1777,1103 @@ void HintTable_Init() { #define HINT_TEXT_NEEDS_TRANSLATION_FR \ "Erreur 0x69a504:&Traduction manquante^C'est de la faute à Purple Hato!&J'vous jure!" - hintTable[RHT_JUNK78] = HintText::Junk({ - //obscure text - Text{"They say blarg...^...or at least briaguya does.", /*french*/"Tout ce que j'ai à dire, c'est blarg...^... 'fin c'est plutôt ce que briaguya dirait.", /*spanish*/"blarg"}, - }); - - hintTable[RHT_JUNK79] = HintText::Junk({ - //obscure text - Text{"They say this peace is what all true warriors strive for.", /*french*/"Selon moi, cette paix est ce pour quoi luttent tous les vrais guerriers.", /*spanish*/"blarg"}, - }); - - hintTable[RHT_JUNK80] = HintText::Junk({ - //obscure text - Text{"They say this ship is what all true gamers strive for.", /*french*/"Selon moi, cette version du port est ce pour quoi luttent tous les vrais gamers.", /*spanish*/"blarg"}, - }); - - hintTable[RHT_JUNK81] = HintText::Junk({ - //obscure text - Text{"They say that Glowsticks can be found in the Raveyard.", /*french*/"On peut trouver des Bâtons Lumineux sur le dancefloor du cimetière.", /*spanish*/"blarg"}, - }); - - hintTable[RHT_JUNK_WTC_1] = HintText::Junk({ - Text{ "They say %rthere are no more than 18&people on this island.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_WTC_2] = HintText::Junk({ - Text{ "They say I am one yet many", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_WTC_3] = HintText::Junk({ - Text{ "They say its all in the name of guiding&humanity down the right path.", HINT_TEXT_NEEDS_TRANSLATION_FR, - "blarg" }, - }); - - hintTable[RHT_JUNK_WTC_4] = HintText::Junk({ - Text{ "They say \"Repetition requested\"", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_WTC_5] = HintText::Junk({ - Text{ "They say %rThe red tells only the truth!", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_WTC_6] = HintText::Junk({ - Text{ "They say good tidings to you^my traitorous @", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_WTC_7] = HintText::Junk({ - Text{ "They say when the seagulls cried,&none were left alive.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_WTC_7] = HintText::Junk({ - Text{ "They say when the seagulls cried,&none were left alive.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_WTC_8] = HintText::Junk({ - Text{ "They say she is lying with the red letters!", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_WTC_9] = HintText::Junk({ - Text{ "They say we'll meet again,&when something else cries.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_WTC_10] = HintText::Junk({ - Text{ "They say \"Forgive me, but-^Your script will not be used.&....After all...^The one writing the rest of " - "the script...&will be me.\"", - HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_WTC_11] = HintText::Junk({ - Text{ "They say tea is best enjoyed...^\"\"With your fellow monsters.\"\"", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_WTC_12] = HintText::Junk({ - Text{ "They say I shall make you some black tea. With my own hands, not magic.", HINT_TEXT_NEEDS_TRANSLATION_FR, - "blarg" }, - }); - - hintTable[RHT_JUNK_SEI_1] = HintText::Junk({ - Text{ "They say you know I've kiboshed before...^and I will kibosh again.", HINT_TEXT_NEEDS_TRANSLATION_FR, - "blarg" }, - }); - - hintTable[RHT_JUNK_SEI_2] = HintText::Junk({ - Text{ "They say if relationship @ walks through that door,^they will KILL independent @.", - HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_SEI_3] = HintText::Junk({ - Text{ "They say you gotta have the BIG Salad.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_SEI_4] = HintText::Junk({ - Text{ "They say it's a festivus miracle", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_SEI_5] = HintText::Junk({ - Text{ "They say there are no houses in Tuscany to rent.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_SEI_6] = HintText::Junk({ - Text{ "They say my last boyfriend had a real&Kroner comprehension problem.", HINT_TEXT_NEEDS_TRANSLATION_FR, - "blarg" }, - }); - - hintTable[RHT_JUNK_SEI_7] = HintText::Junk({ - Text{ "They say it's a festivus miracle.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_SEI_8] = HintText::Junk({ - Text{ "They say Louis quit the importing&to focus on the exporting.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_SEI_9] = HintText::Junk({ - Text{ "They say no thanks, I can't drink coffee&late at night, it keeps me up.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_SEI_10] = HintText::Junk({ - Text{ "They say it's not a lie if you believe it.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_SEI_11] = HintText::Junk({ - Text{ "They say there was a second spitter.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_SEI_12] = HintText::Junk({ - Text{ "They say there was a second spitter.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_SEI_13] = HintText::Junk({ - Text{ "They say the jerk store called,^they're running out of YOU.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_SEI_14] = HintText::Junk({ - Text{ "They say when you look annoyed all the time,&people thing you are busy.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_SEI_15] = HintText::Junk({ - Text{ "They say when you look annoyed all the time,&people think you are busy.", HINT_TEXT_NEEDS_TRANSLATION_FR, - "blarg" }, - }); - - hintTable[RHT_JUNK_SEI_16] = HintText::Junk({ - Text{ "They say he fires people like its a bodily function.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_SEI_17] = HintText::Junk({ - Text{ "They say he threatened to move the ship to New Jersey&just to upset people.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_SEI_18] = HintText::Junk({ - Text{ "They say there was significant shrinkage.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_SEI_19] = HintText::Junk({ - Text{ "They say if it wasn't for the toilet there'd be no books.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_SEI_20] = HintText::Junk({ - Text{ "They say if it wasn't for the toilet there'd be no books.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_SEI_21] = HintText::Junk({ - Text{ "They say don't trust men in capes.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_SEI_22] = HintText::Junk({ - Text{ "They say @'s uncle works for Nintendo.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_SEI_23] = HintText::Junk({ - Text{ "They say @'s stole the marble rye.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_SEI_24] = HintText::Junk({ - Text{ "They say there is no better harmony&than the black and white cookie.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_SEI_25] = HintText::Junk({ - Text{ "They say @ hasn't vomited since 1983.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_SEI_26] = HintText::Junk({ - Text{ "They say you gotta have the early bird special.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_SEI_27] = HintText::Junk({ - Text{ "They say a donation has been made in your name&to the human fund.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_SEI_28] = HintText::Junk({ - Text{ "They say you want to be my latex salesman.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_SEI_29] = HintText::Junk({ - Text{ "They say if every instinct you have is wrong...^... then the opposite would have to be right.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_OTR_MEANS_1] = HintText::Junk({ - Text{ "They say OTR stands for&Over the Rainbow", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[RHT_JUNK_OTR_MEANS_2] = HintText::Junk({ - Text{ "They say that OTR stands for&Onions, Tomatoes, and Radishes", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[RHT_JUNK_OTR_MEANS_3] = HintText::Junk({ - Text{ "They say that OTR stands for&Ocarina of Time Resources", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[RHT_JUNK_OTR_MEANS_4] = HintText::Junk({ - Text{ "They say that OTR stands for&Over the Road", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[RHT_JUNK_OTR_MEANS_5] = HintText::Junk({ - Text{ "They say that OTR stands for&Off the Record", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[RHT_JUNK_OTR_MEANS_6] = HintText::Junk({ - Text{ "They say that OTR stands for&Office of Tax and Revenue", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[RHT_JUNK_OTR_MEANS_7] = HintText::Junk({ - Text{ "They say OTR stands for&Over the Rainbow", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[RHT_JUNK_OTR_MEANS_8] = HintText::Junk({ - Text{ "They say that OTR stands for&Office of Trade Relations", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[RHT_JUNK_OTR_MEANS_9] = HintText::Junk({ - Text{ "They say that OTR stands for&Original Theatrical Release", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[RHT_JUNK_OTR_MEANS_10] = HintText::Junk({ - Text{ "They say that OTR stands for&Operational Test Requirement", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[RHT_JUNK_OTR_MEANS_11] = HintText::Junk({ - Text{ "They say that OTR stands for&Operational Trouble Report", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[RHT_JUNK_OTR_MEANS_12] = HintText::Junk({ - Text{ "They say that OTR stands for&Oxygen Transmission Rate", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[RHT_JUNK_OTR_MEANS_13] = HintText::Junk({ - Text{ "They say that OTR stands for&One Touch Recording", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[RHT_JUNK_OTR_MEANS_14] = HintText::Junk({ - Text{ "They say that OTR stands for&Olympic Torch Relay", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[RHT_JUNK_OTR_MEANS_15] = HintText::Junk({ - Text{ "They say that OTR stands for&Off the Rack", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[RHT_JUNK_OTR_MEANS_16] = HintText::Junk({ - Text{ "They say that OTR stands for&Overhead Transfer Rate", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[RHT_JUNK_OTR_MEANS_17] = HintText::Junk({ - Text{ "They say that OTR stands for&Operational TurnaRound", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[RHT_JUNK_OTR_MEANS_18] = HintText::Junk({ - Text{ "They say that OTR stands for&Opportunity to Recall", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[RHT_JUNK_OTR_MEANS_19] = HintText::Junk({ - Text{ "They say that OTR stands for&Operability Test Report", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[RHT_JUNK_OTR_MEANS_20] = HintText::Junk({ - Text{ "They say that OTR stands for&Overall Tuning Range", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[RHT_JUNK_OTR_MEANS_21] = HintText::Junk({ - Text{ "They say that OTR stands for&One Time Requisition", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[RHT_JUNK_OTR_MEANS_22] = HintText::Junk({ - Text{ "They say that OTR stands for&Oblivious to Reality", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[RHT_JUNK_OTR_MEANS_23] = HintText::Junk({ - Text{ "They say that OTR stands for&On the Run", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[RHT_JUNK_OTR_MEANS_24] = HintText::Junk({ - Text{ "They say that OTR stands for&On Time Reporting", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[RHT_JUNK_OTR_MEANS_25] = HintText::Junk({ - Text{ "They say that OTR stands for&Order to Receipt", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[RHT_JUNK_OTR_MEANS_26] = HintText::Junk({ - Text{ "They say that OTR stands for&Other Terrestrial Radio", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[RHT_JUNK_OTR_MEANS_27] = HintText::Junk({ - Text{ "They say that OTR stands for&On Target Reports", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[RHT_JUNK_OTR_MEANS_28] = HintText::Junk({ - Text{ "They say that OTR stands for&One Time Repair", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[RHT_JUNK_OTR_MEANS_29] = HintText::Junk({ - Text{ "They say that OTR stands for&Own the Room", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[RHT_JUNK_OTR_MEANS_30] = HintText::Junk({ - Text{ "They say that OTR stands for&Online Text Repository", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_MISC_1] = HintText::Junk({ - Text{ "They say %gKenix%w isn't a developer...^...Just a PR guy", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_MISC_2] = HintText::Junk({ - Text {"They say... No", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg"}, - }); - - hintTable[RHT_JUNK_MISC_3] = HintText::Junk({ - Text{ "They say BIG RIGS: OTR", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" } - }); - - hintTable[RHT_JUNK_MISC_4] = HintText::Junk({ - Text{ "They say you wanted to see me %pMr. Kenix%w?", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_MISC_5] = HintText::Junk({ - Text{ "They say Louis once saw an&equals not get set equals", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_MISC_6] = HintText::Junk({ - Text{ "They say only you can find your rom.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_MISC_7] = HintText::Junk({ - Text{ "They say ZAPD is good software.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_MISC_8] = HintText::Junk({ - Text{ "They say you can encounter&a parascode in tall grass.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_MISC_9] = HintText::Junk({ - Text{ "They say the ship sails on March 32nd.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_MISC_10] = HintText::Junk({ - Text{ "They say bombing dodongos is fun.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_MISC_11] = HintText::Junk({ - Text{ "They say shopkeepers don't give credits.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_MISC_12] = HintText::Junk({ - Text{ "They say shopkeepers don't give credits.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_MISC_13] = HintText::Junk({ - Text{ "They say Malon is glitched.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_MISC_14] = HintText::Junk({ - Text{ "They say do I look like I know&what a DList is?", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_MISC_15] = HintText::Junk({ - Text{ "They say do I look like I know&what an AList is?", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_MISC_16] = HintText::Junk({ - Text{ "They say the king drinks enthusiastically", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_MISC_17] = HintText::Junk({ - Text{ "They say Rubies are on the path to&Lamp Oil, Rope, and Bombs", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_SG_1] = HintText::Junk({ - Text{ "They say %rError. Human is dead, mismatch.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_SG_2] = HintText::Junk({ - Text{ "They say this is the choice of the&steins gate.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_SG_3] = HintText::Junk({ - Text{ "They say el psy kongroo.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_SG_4] = HintText::Junk({ - Text{ "They say tutturu~.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - - hintTable[RHT_JUNK_SG_5] = HintText::Junk({ - Text{ "They say im not Christina!.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_SG_6] = HintText::Junk({ - Text{ "They say you know where to find an IBN5100.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[RHT_JUNK_SG_7] = HintText::Junk({ - Text{ "They say when you're on a chicken bender&grab a box of chicken tenders.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); + hintTextTable[RHT_JUNK78] = HintText(CustomMessage("They say blarg...^...or at least briaguya does.", + /*german*/ "", + /*french*/ "Tout ce que j'ai à dire, c'est blarg...^... 'fin c'est plutôt ce que briaguya dirait.")); + // /*spanish*/blarg + + hintTextTable[RHT_JUNK79] = HintText(CustomMessage("They say this peace is what all true warriors strive for.", + /*german*/ "", + /*french*/ "Selon moi, cette paix est ce pour quoi luttent tous les vrais guerriers.")); + // /*spanish*/blarg - hintTable[RHT_JUNK_SG_8] = HintText::Junk({ - Text{ "Juicy Chicken #1! Wow!.", HINT_TEXT_NEEDS_TRANSLATION_FR, - "blarg" }, - }); + hintTextTable[RHT_JUNK80] = HintText(CustomMessage("They say this ship is what all true gamers strive for.", + /*german*/ "", + /*french*/ "Selon moi, cette version du port est ce pour quoi luttent tous les vrais gamers.")); + // /*spanish*/blarg + + hintTextTable[RHT_JUNK81] = HintText(CustomMessage("They say that Glowsticks can be found in the Raveyard.", + /*german*/ "", + /*french*/ "On peut trouver des Bâtons Lumineux sur le dancefloor du cimetière.")); + // /*spanish*/blarg + + hintTextTable[RHT_JUNK_WTC_1] = HintText(CustomMessage("They say %rthere are no more than 18&people on this island.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_WTC_2] = HintText(CustomMessage("They say I am one yet many", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_WTC_3] = HintText(CustomMessage("They say its all in the name of guiding&humanity down the right path.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_WTC_4] = HintText(CustomMessage("They say \"Repetition requested\"", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_WTC_5] = HintText(CustomMessage("They say %rThe red tells only the truth!", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_WTC_6] = HintText(CustomMessage("They say good tidings to you^my traitorous @", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_WTC_7] = HintText(CustomMessage("They say when the seagulls cried,&none were left alive.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_WTC_8] = HintText(CustomMessage("They say she is lying with the red letters!", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_WTC_9] = HintText(CustomMessage("They say we'll meet again,&when something else cries.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_WTC_10] = HintText(CustomMessage("They say \"Forgive me, but-^Your script will not be used.&....After all...^The one writing the rest of " + "the script...&will be me.\"", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_WTC_11] = HintText(CustomMessage("They say tea is best enjoyed...^\"\"With your fellow monsters.\"\"", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + + hintTextTable[RHT_JUNK_WTC_12] = HintText(CustomMessage("They say I shall make you some black tea. With my own hands, not magic.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_SEI_1] = HintText(CustomMessage("They say you know I've kiboshed before...^and I will kibosh again.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_SEI_2] = HintText(CustomMessage("They say if relationship @ walks through that door,^they will KILL independent @.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_SEI_3] = HintText(CustomMessage("They say you gotta have the BIG Salad.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_SEI_4] = HintText(CustomMessage("They say it's a festivus miracle", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_SEI_5] = HintText(CustomMessage("They say there are no houses in Tuscany to rent.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_SEI_6] = HintText(CustomMessage("They say my last boyfriend had a real&Kroner comprehension problem.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_SEI_7] = HintText(CustomMessage("They say it's a festivus miracle.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_SEI_8] = HintText(CustomMessage("They say Louis quit the importing&to focus on the exporting.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_SEI_9] = HintText(CustomMessage("They say no thanks, I can't drink coffee&late at night, it keeps me up.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_SEI_10] = HintText(CustomMessage("They say it's not a lie if you believe it.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_SEI_11] = HintText(CustomMessage("They say there was a second spitter.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_SEI_12] = HintText(CustomMessage("They say there was a second spitter.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_SEI_13] = HintText(CustomMessage("They say the jerk store called,^they're running out of YOU.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_SEI_14] = HintText(CustomMessage("They say when you look annoyed all the time,&people thing you are busy.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_SEI_15] = HintText(CustomMessage("They say when you look annoyed all the time,&people think you are busy.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_SEI_16] = HintText(CustomMessage("They say he fires people like its a bodily function.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_SEI_17] = HintText(CustomMessage("They say he threatened to move the ship to New Jersey&just to upset people.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_SEI_18] = HintText(CustomMessage("They say there was significant shrinkage.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_SEI_19] = HintText(CustomMessage("They say if it wasn't for the toilet there'd be no books.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_SEI_20] = HintText(CustomMessage("They say if it wasn't for the toilet there'd be no books.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_SEI_21] = HintText(CustomMessage("They say don't trust men in capes.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_SEI_22] = HintText(CustomMessage("They say @'s uncle works for Nintendo.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_SEI_23] = HintText(CustomMessage("They say @'s stole the marble rye.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_SEI_24] = HintText(CustomMessage("They say there is no better harmony&than the black and white cookie.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_SEI_25] = HintText(CustomMessage("They say @ hasn't vomited since 1983.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_SEI_26] = HintText(CustomMessage("They say you gotta have the early bird special.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_SEI_27] = HintText(CustomMessage("They say a donation has been made in your name&to the human fund.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_SEI_28] = HintText(CustomMessage("They say you want to be my latex salesman.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_SEI_29] = HintText(CustomMessage("They say if every instinct you have is wrong...^... then the opposite would have to be right.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_OTR_MEANS_1] = HintText(CustomMessage("They say OTR stands for&Over the Rainbow", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_OTR_MEANS_2] = HintText(CustomMessage("They say that OTR stands for&Onions, Tomatoes, and Radishes", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_OTR_MEANS_3] = HintText(CustomMessage("They say that OTR stands for&Ocarina of Time Resources", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_OTR_MEANS_4] = HintText(CustomMessage("They say that OTR stands for&Over the Road", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_OTR_MEANS_5] = HintText(CustomMessage("They say that OTR stands for&Off the Record", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_OTR_MEANS_6] = HintText(CustomMessage("They say that OTR stands for&Office of Tax and Revenue", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_OTR_MEANS_7] = HintText(CustomMessage("They say OTR stands for&Over the Rainbow", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_OTR_MEANS_8] = HintText(CustomMessage("They say that OTR stands for&Office of Trade Relations", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_OTR_MEANS_9] = HintText(CustomMessage("They say that OTR stands for&Original Theatrical Release", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_OTR_MEANS_10] = HintText(CustomMessage("They say that OTR stands for&Operational Test Requirement", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_OTR_MEANS_11] = HintText(CustomMessage("They say that OTR stands for&Operational Trouble Report", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_OTR_MEANS_12] = HintText(CustomMessage("They say that OTR stands for&Oxygen Transmission Rate", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_OTR_MEANS_13] = HintText(CustomMessage("They say that OTR stands for&One Touch Recording", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_OTR_MEANS_14] = HintText(CustomMessage("They say that OTR stands for&Olympic Torch Relay", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_OTR_MEANS_15] = HintText(CustomMessage("They say that OTR stands for&Off the Rack", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_OTR_MEANS_16] = HintText(CustomMessage("They say that OTR stands for&Overhead Transfer Rate", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_OTR_MEANS_17] = HintText(CustomMessage("They say that OTR stands for&Operational TurnaRound", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_OTR_MEANS_18] = HintText(CustomMessage("They say that OTR stands for&Opportunity to Recall", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_OTR_MEANS_19] = HintText(CustomMessage("They say that OTR stands for&Operability Test Report", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_OTR_MEANS_20] = HintText(CustomMessage("They say that OTR stands for&Overall Tuning Range", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_OTR_MEANS_21] = HintText(CustomMessage("They say that OTR stands for&One Time Requisition", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_OTR_MEANS_22] = HintText(CustomMessage("They say that OTR stands for&Oblivious to Reality", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_OTR_MEANS_23] = HintText(CustomMessage("They say that OTR stands for&On the Run", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_OTR_MEANS_24] = HintText(CustomMessage("They say that OTR stands for&On Time Reporting", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_OTR_MEANS_25] = HintText(CustomMessage("They say that OTR stands for&Order to Receipt", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_OTR_MEANS_26] = HintText(CustomMessage("They say that OTR stands for&Other Terrestrial Radio", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_OTR_MEANS_27] = HintText(CustomMessage("They say that OTR stands for&On Target Reports", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_OTR_MEANS_28] = HintText(CustomMessage("They say that OTR stands for&One Time Repair", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_OTR_MEANS_29] = HintText(CustomMessage("They say that OTR stands for&Own the Room", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_OTR_MEANS_30] = HintText(CustomMessage("They say that OTR stands for&Online Text Repository", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_MISC_1] = HintText(CustomMessage("They say #Kenix# isn't a developer...^...Just a PR guy", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR, + {QM_GREEN})); + + hintTextTable[RHT_JUNK_MISC_2] = HintText(CustomMessage("They say... No", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_MISC_3] = HintText(CustomMessage("They say BIG RIGS: OTR", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_MISC_4] = HintText(CustomMessage("They say you wanted to see me #Mr. Kenix#?", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR, + {QM_PINK})); + + hintTextTable[RHT_JUNK_MISC_5] = HintText(CustomMessage("They say Louis once saw an&equals not get set equals", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_MISC_6] = HintText(CustomMessage("They say only you can find your rom.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_MISC_7] = HintText(CustomMessage("They say ZAPD is good software.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_MISC_8] = HintText(CustomMessage("They say you can encounter&a parascode in tall grass.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_MISC_9] = HintText(CustomMessage("They say the ship sails on March 32nd.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_MISC_10] = HintText(CustomMessage("They say bombing dodongos is fun.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_MISC_11] = HintText(CustomMessage("They say shopkeepers don't give credits.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_MISC_12] = HintText(CustomMessage("They say shopkeepers don't give credits.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_MISC_13] = HintText(CustomMessage("They say Malon is glitched.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_MISC_14] = HintText(CustomMessage("They say do I look like I know&what a DList is?", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_MISC_15] = HintText(CustomMessage("They say do I look like I know&what an AList is?", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_MISC_16] = HintText(CustomMessage("They say the king drinks enthusiastically", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_MISC_17] = HintText(CustomMessage("They say Rubies are on the path to&Lamp Oil, Rope, and Bombs", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_SG_1] = HintText(CustomMessage("They say %rError. Human is dead, mismatch.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_SG_2] = HintText(CustomMessage("They say this is the choice of the&steins gate.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_SG_3] = HintText(CustomMessage("They say el psy kongroo.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_SG_4] = HintText(CustomMessage("They say tutturu~.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_SG_5] = HintText(CustomMessage("They say im not Christina!.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_SG_6] = HintText(CustomMessage("They say you know where to find an IBN5100.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_SG_7] = HintText(CustomMessage("They say when you're on a chicken bender&grab a box of chicken tenders.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); + + hintTextTable[RHT_JUNK_SG_8] = HintText(CustomMessage("Juicy Chicken #1! Wow!.", + /*german*/ "", + /*french*/ HINT_TEXT_NEEDS_TRANSLATION_FR)); /*-------------------------- | DUNGEON HINT TEXT | ---------------------------*/ - hintTable[RHT_DEKU_TREE] = HintText::DungeonName( - { - // obscure text - Text{ "an ancient tree", /*french*/ "le vieil arbre", /*spanish*/ "un ancestral árbol" }, - }, - {}, - // clear text - Text{ "Deku Tree", /*french*/ "l'Arbre Mojo", /*spanish*/ "el Gran Árbol Deku" }); + + hintTextTable[RHT_DEKU_TREE] = HintText(CustomMessage("Deku Tree", + /*german*/ "", + /*french*/ "l'Arbre Mojo"), + // /*spanish*/el Gran Árbol Deku + {}, + {CustomMessage("an ancient tree", + /*german*/ "", + /*french*/ "le vieil arbre")}); + // /*spanish*/un ancestral árbol - hintTable[RHT_DODONGOS_CAVERN] = HintText::DungeonName( - { - // obscure text - Text{ "an immense cavern", /*french*/ "l'immense caverne", /*spanish*/ "una descomunal cueva" }, - }, - {}, - // clear text - Text{ "Dodongo's Cavern", /*french*/ "la Caverne Dodongo", /*spanish*/ "la Cueva de los Dodongos" }); + hintTextTable[RHT_DODONGOS_CAVERN] = HintText(CustomMessage("Dodongo's Cavern", + /*german*/ "", + /*french*/ "la Caverne Dodongo"), + // /*spanish*/la Cueva de los Dodongos + {}, + {CustomMessage("an immense cavern", + /*german*/ "", + /*french*/ "l'immense caverne")}); + // /*spanish*/una descomunal cueva - hintTable[RHT_JABU_JABUS_BELLY] = HintText::DungeonName( - { - // obscure text - Text{ "the belly of a deity", /*french*/ "le ventre d'un gardien", - /*spanish*/ "la tripa de cierta deidad" }, - }, - {}, - // clear text - Text{ "Jabu-Jabu's Belly", /*french*/ "le Ventre de Jabu-Jabu", /*spanish*/ "tripa de Jabu-Jabu" }); + hintTextTable[RHT_JABU_JABUS_BELLY] = HintText(CustomMessage("Jabu-Jabu's Belly", + /*german*/ "", + /*french*/ "le Ventre de Jabu-Jabu"), + // /*spanish*/tripa de Jabu-Jabu + {}, + {CustomMessage("the belly of a deity", + /*german*/ "", + /*french*/ "le ventre d'un gardien")}); + // /*spanish*/la tripa de cierta deidad - hintTable[RHT_FOREST_TEMPLE] = HintText::DungeonName( - { - // obscure text - Text{ "a deep forest", /*french*/ "la profonde forêt", /*spanish*/ "las profundidades del bosque" }, - }, - {}, - // clear text - Text{ "Forest Temple", /*french*/ "le Temple de la Forêt", /*spanish*/ "el Templo del Bosque" }); + hintTextTable[RHT_FOREST_TEMPLE] = HintText(CustomMessage("Forest Temple", + /*german*/ "", + /*french*/ "le Temple de la Forêt"), + // /*spanish*/el Templo del Bosque + {}, + {CustomMessage("a deep forest", + /*german*/ "", + /*french*/ "la profonde forêt")}); + // /*spanish*/las profundidades del bosque - hintTable[RHT_FIRE_TEMPLE] = HintText::DungeonName( - { - // obscure text - Text{ "a high mountain", /*french*/ "la grande montagne", /*spanish*/ "una alta montaña" }, - }, - {}, - // clear text - Text{ "Fire Temple", /*french*/ "le Temple du Feu", /*spanish*/ "el Templo del Fuego" }); + hintTextTable[RHT_FIRE_TEMPLE] = HintText(CustomMessage("Fire Temple", + /*german*/ "", + /*french*/ "le Temple du Feu"), + // /*spanish*/el Templo del Fuego + {}, + {CustomMessage("a high mountain", + /*german*/ "", + /*french*/ "la grande montagne")}); + // /*spanish*/una alta montaña - hintTable[RHT_WATER_TEMPLE] = HintText::DungeonName( - { - // obscure text - Text{ "a vast lake", /*french*/ "le vaste lac", /*spanish*/ "un lago inmenso" }, - }, - {}, - // clear text - Text{ "Water Temple", /*french*/ "le Temple de l'Eau", /*spanish*/ "el Templo del Agua" }); + hintTextTable[RHT_WATER_TEMPLE] = HintText(CustomMessage("Water Temple", + /*german*/ "", + /*french*/ "le Temple de l'Eau"), + // /*spanish*/el Templo del Agua + {}, + {CustomMessage("a vast lake", + /*german*/ "", + /*french*/ "le vaste lac")}); + // /*spanish*/un lago inmenso - hintTable[RHT_SPIRIT_TEMPLE] = HintText::DungeonName( - { - // obscure text - Text{ "the goddess of the sand", /*french*/ "la déesse des sables", /*spanish*/ "la diosa de las arenas" }, - }, - {}, - // clear text - Text{ "Spirit Temple", /*french*/ "le Temple de l'Esprit", /*spanish*/ "el Templo del Espíritu" } + hintTextTable[RHT_SPIRIT_TEMPLE] = HintText(CustomMessage("Spirit Temple", + /*german*/ "", + /*french*/ "le Temple de l'Esprit"), + // /*spanish*/el Templo del Espíritu + {}, + {CustomMessage("the goddess of the sand", + /*german*/ "", + /*french*/ "la déesse des sables")}); + // /*spanish*/la diosa de las arenas - ); + hintTextTable[RHT_SHADOW_TEMPLE] = HintText(CustomMessage("Shadow Temple", + /*german*/ "", + /*french*/ "le Temple de l'Ombre"), + // /*spanish*/el Templo de las Sombras + {}, + {CustomMessage("the house of the dead", + /*german*/ "", + /*french*/ "la maison des morts")}); + // /*spanish*/la casa de la muerte - hintTable[RHT_SHADOW_TEMPLE] = HintText::DungeonName( - { - // obscure text - Text{ "the house of the dead", /*french*/ "la maison des morts", /*spanish*/ "la casa de la muerte" }, - }, - {}, - // clear text - Text{ "Shadow Temple", /*french*/ "le Temple de l'Ombre", /*spanish*/ "el Templo de las Sombras" }); + hintTextTable[RHT_ICE_CAVERN] = HintText(CustomMessage("Ice Cavern", + /*german*/ "", + /*french*/ "la caverne de glace"), + // /*spanish*/la caverna de hielo + {}, + {CustomMessage("a frozen maze", + /*german*/ "", + /*french*/ "le dédale glacé")}); + // /*spanish*/un gélido laberinto - hintTable[RHT_ICE_CAVERN] = HintText::DungeonName( - { - // obscure text - Text{ "a frozen maze", /*french*/ "le dédale glacé", /*spanish*/ "un gélido laberinto" }, - }, - {}, - // clear text - Text{ "Ice Cavern", /*french*/ "la caverne de glace", /*spanish*/ "la caverna de hielo" }); + hintTextTable[RHT_BOTTOM_OF_THE_WELL] = HintText(CustomMessage("Bottom of the Well", + /*german*/ "", + /*french*/ "le fonds du Puits"), + // /*spanish*/el fondo del pozo + {}, + {CustomMessage("a shadow\'s prison", + /*german*/ "", + /*french*/ "la prison d'une ombre")}); + // /*spanish*/la prisión de las sombras - hintTable[RHT_BOTTOM_OF_THE_WELL] = HintText::DungeonName( - { - // obscure text - Text{ "a shadow\'s prison", /*french*/ "la prison d'une ombre", /*spanish*/ "la prisión de las sombras" }, - }, - {}, - // clear text - Text{ "Bottom of the Well", /*french*/ "le fonds du Puits", /*spanish*/ "el fondo del pozo" }); + hintTextTable[RHT_GERUDO_TRAINING_GROUND] = HintText(CustomMessage("Gerudo Training Grounds", + /*german*/ "", + /*french*/ "le Gymnase Gerudo"), + // /*spanish*/el Centro de Instrucción Gerudo + {}, + {CustomMessage("the test of thieves", + /*german*/ "", + /*french*/ "l'épreuve des voleurs")}); + // /*spanish*/la prueba de las bandidas - hintTable[RHT_GERUDO_TRAINING_GROUND] = HintText::DungeonName( - { - // obscure text - Text{ "the test of thieves", /*french*/ "l'épreuve des voleurs", /*spanish*/ "la prueba de las bandidas" }, - }, - {}, - // clear text - Text{ "Gerudo Training Grounds", /*french*/ "le Gymnase Gerudo", - /*spanish*/ "el Centro de Instrucción Gerudo" }); - - hintTable[RHT_GANONS_CASTLE] = HintText::DungeonName( - { - // obscure text - Text{ "a conquered citadel", /*french*/ "la citadelle assiégée", /*spanish*/ "una conquistada ciudadela" }, - }, - {}, - // clear text - Text{ "Inside Ganon's Castle", /*french*/ "l'intérieur du Château de Ganon", - /*spanish*/ "el interior del Castillo de Ganon" }); + hintTextTable[RHT_GANONS_CASTLE] = HintText(CustomMessage("Inside Ganon's Castle", + /*german*/ "", + /*french*/ "l'intérieur du Château de Ganon"), + // /*spanish*/el interior del Castillo de Ganon + {}, + {CustomMessage("a conquered citadel", + /*german*/ "", + /*french*/ "la citadelle assiégée")}); + // /*spanish*/una conquistada ciudadela /*-------------------------- | BOSS HINT TEXT | ---------------------------*/ - hintTable[RHT_QUEEN_GOHMA] = HintText::Boss({ - // obscure text - Text{"the #Parasitic Armored Arachnid# holds", /*french*/"le #monstre insectoïde géant# possède", /*spanish*/"el #arácnido parasitario acorazado# porta"}, - }, {}, - //clear text - Text{"#Queen Gohma# holds", /*french*/"la #Reine Gohma# possède", /*spanish*/"la #Reina Goma# porta"}); + hintTextTable[RHT_QUEEN_GOHMA] = HintText(CustomMessage("#Queen Gohma# holds", + /*german*/ "", + /*french*/ "la #Reine Gohma# possède"), + // /*spanish*/la #Reina Goma# porta + {}, + {CustomMessage("the #Parasitic Armored Arachnid# holds", + /*german*/ "", + /*french*/ "le #monstre insectoïde géant# possède")}); + // /*spanish*/el #arácnido parasitario acorazado# porta - hintTable[RHT_KING_DODONGO] = HintText::Boss({ - //obscure text - Text{"the #Infernal Dinosaur# holds", /*french*/"le #dinosaure infernal# possède", /*spanish*/"el #dinosaurio infernal# porta"}, - }, {}, - //clear text - Text{"#King Dodongo# holds", /*french*/"le #Roi Dodongo# possède", /*spanish*/"el #Rey Dodongo# porta"}); + hintTextTable[RHT_KING_DODONGO] = HintText(CustomMessage("#King Dodongo# holds", + /*german*/ "", + /*french*/ "le #Roi Dodongo# possède"), + // /*spanish*/el #Rey Dodongo# porta + {}, + {CustomMessage("the #Infernal Dinosaur# holds", + /*german*/ "", + /*french*/ "le #dinosaure infernal# possède")}); + // /*spanish*/el #dinosaurio infernal# porta - hintTable[RHT_BARINADE] = HintText::Boss({ - //obscure text - Text{"the #Bio-Electric Anemone# holds", /*french*/"l'#anémone bioélectrique# possède", /*spanish*/"la #anémona bioeléctrica# porta"}, - }, {}, - //clear text - Text{"#Barinade# holds", /*french*/"#Barinade# possède", /*spanish*/"#Barinade# porta"}); + hintTextTable[RHT_BARINADE] = HintText(CustomMessage("#Barinade# holds", + /*german*/ "", + /*french*/ "#Barinade# possède"), + // /*spanish*/#Barinade# porta + {}, + {CustomMessage("the #Bio-Electric Anemone# holds", + /*german*/ "", + /*french*/ "l'#anémone bioélectrique# possède")}); + // /*spanish*/la #anémona bioeléctrica# porta - hintTable[RHT_PHANTOM_GANON] = HintText::Boss({ - //obscure text - Text{"the #Evil Spirit from Beyond# holds", /*french*/"l'#esprit maléfique de l'au-delà# possède", /*spanish*/"el #espíritu maligno de ultratumba# porta"}, - }, {}, - //clear text - Text{"#Phantom Ganon# holds", /*french*/"#Ganon Spectral# possède", /*spanish*/"#Ganon Fantasma# porta"}); + hintTextTable[RHT_PHANTOM_GANON] = HintText(CustomMessage("#Phantom Ganon# holds", + /*german*/ "", + /*french*/ "#Ganon Spectral# possède"), + // /*spanish*/#Ganon Fantasma# porta + {}, + {CustomMessage("the #Evil Spirit from Beyond# holds", + /*german*/ "", + /*french*/ "l'#esprit maléfique de l'au-delà# possède")}); + // /*spanish*/el #espíritu maligno de ultratumba# porta - hintTable[RHT_VOLVAGIA] = HintText::Boss({ - //obscure text - Text{"the #Subterranean Lava Dragon# holds", /*french*/"le #dragon des profondeurs# possède", /*spanish*/"el #dragón de lava subterráneo# porta"}, - }, {}, - //clear text - Text{"#Volvagia# holds", /*french*/"#Volvagia# possède", /*spanish*/"#Volvagia# porta"}); + hintTextTable[RHT_VOLVAGIA] = HintText(CustomMessage("#Volvagia# holds", + /*german*/ "", + /*french*/ "#Volvagia# possède"), + // /*spanish*/#Volvagia# porta + {}, + {CustomMessage("the #Subterranean Lava Dragon# holds", + /*german*/ "", + /*french*/ "le #dragon des profondeurs# possède")}); + // /*spanish*/el #dragón de lava subterráneo# porta - hintTable[RHT_MORPHA] = HintText::Boss({ - //obscure text - Text{"the #Giant Aquatic Amoeba# holds", /*french*/"l'#amibe aquatique géante# possède", /*spanish*/"la #ameba acuática gigante# porta"}, - }, {}, - //clear text - Text{"#Morpha# holds", /*french*/"#Morpha# possède", /*spanish*/"#Morpha# porta"}); + hintTextTable[RHT_MORPHA] = HintText(CustomMessage("#Morpha# holds", + /*german*/ "", + /*french*/ "#Morpha# possède"), + // /*spanish*/#Morpha# porta + {}, + {CustomMessage("the #Giant Aquatic Amoeba# holds", + /*german*/ "", + /*french*/ "l'#amibe aquatique géante# possède")}); + // /*spanish*/la #ameba acuática gigante# porta - hintTable[RHT_BONGO_BONGO] = HintText::Boss({ - //obscure text - Text{"the #Phantom Shadow Beast# holds", /*french*/"le #monstre de l'ombre# possède", /*spanish*/"la #alimaña oscura espectral# porta"}, - }, {}, - //clear text - Text{"#Bongo Bongo# holds", /*french*/"#Bongo Bongo# possède", /*spanish*/"#Bongo Bongo# porta"}); - - hintTable[RHT_TWINROVA] = HintText::Boss({ - //obscure text - Text{"the #Sorceress Sisters# hold", /*french*/"#les sorcières jumelles# possède", /*spanish*/"las #hermanas hechiceras# portan"}, - }, {}, - //clear text - Text{"#Twinrova# holds", /*french*/"#Twinrova# possède", /*spanish*/"#Birova# porta"}); - // - // [RHT_LINKS_POCKET_BOSS] = HintText::Boss({ - // //obscure text - // Text{"#@'s pocket# rewards", /*french*/"#@ débute avec#", /*spanish*/"el #bolsillo de @# - // premia con"}, - // }, - // //clear text - // Text{"#@ already has#", /*french*/"#@ a déjà#", /*spanish*/"el #bolsillo de @ ya - // tiene#"} - // ); + hintTextTable[RHT_BONGO_BONGO] = HintText(CustomMessage("#Bongo Bongo# holds", + /*german*/ "", + /*french*/ "#Bongo Bongo# possède"), + // /*spanish*/#Bongo Bongo# porta + {}, + {CustomMessage("the #Phantom Shadow Beast# holds", + /*german*/ "", + /*french*/ "le #monstre de l'ombre# possède")}); + // /*spanish*/la #alimaña oscura espectral# porta + hintTextTable[RHT_TWINROVA] = HintText(CustomMessage("#Twinrova# holds", + /*german*/ "", + /*french*/ "#Twinrova# possède"), + // /*spanish*/#Birova# porta + {}, + {CustomMessage("the #Sorceress Sisters# hold", + /*german*/ "", + /*french*/ "#les sorcières jumelles# possède")}); + // /*spanish*/las #hermanas hechiceras# portan /*-------------------------- | BRIDGE HINT TEXT | ---------------------------*/ - hintTable[RHT_BRIDGE_OPEN_HINT] = HintText::Bridge({ - // obscure text - Text{ "The awakened ones have #already created a bridge# to the castle where the evil dwells.", - /*french*/ "Les êtres de sagesse ont#déjà créé un pont# vers le repaire du mal.", - /*spanish*/ "Los sabios #ya habrán creado un puente#&al castillo, de donde emana el mal.", - /*german*/"Die Weisen haben #bereits&eine Brücke zum Portal von&Ganons Schloss gelegt#..." }, - }); + hintTextTable[RHT_BRIDGE_OPEN_HINT] = HintText(CustomMessage("$lThe awakened ones have #already created a bridge# to the castle where the evil dwells.^", + /*german*/ "$lDie Weisen haben #bereits&eine Brücke zum Portal von&Ganons Schloss gelegt#...^", + /*french*/ "$lLes êtres de sagesse ont#déjà créé un pont# vers le repaire du mal.^", + {QM_LBLUE})); + // /*spanish*/$lLos sabios #ya habrán creado un puente#&al castillo, de donde emana el mal.^ - hintTable[RHT_BRIDGE_VANILLA_HINT] = HintText::Bridge({ - // obscure text - Text{ "The awakened ones require the #Shadow and Spirit Medallions# as well as the #Light Arrows#.", - /*french*/ - "Les êtres de sagesse attendront le héros muni des #Médaillons de l'Ombre et l'Esprit# et des #Flèches de Lumière#.", - /*spanish*/ - "Los sabios aguardarán a que el héroe obtenga tanto el #Medallón de las Sombras y el del Espíritu# junto " - "a la #flecha de luz#.", - /*german*/"Die Weisen werden darauf warten, dass der Held das #Amulett des Schattens, Amulett der Geister# und die #Licht-Pfeile# sammelt." }, - }); - hintTable[RHT_BRIDGE_STONES_HINT] = HintText::Bridge({ - // obscure text singular plural - Text{ - "The awakened ones will await for the Hero to collect #%d |Spiritual Stone|Spiritual Stones|#.", - /*french*/ "Les êtres de sagesse attendront le héros muni de #%d |Pierre Ancestrale|Pierres Ancestrales|#.", - /*spanish*/ "Los sabios aguardarán a que el héroe&obtenga #%d |piedra espiritual|piedras espirituales|#.", - /*german*/"Die Weisen werden darauf warten, dass der Held #%d |Heiligen Stein|Heilige Steine|# sammelt." }, - }); + hintTextTable[RHT_BRIDGE_VANILLA_HINT] = HintText(CustomMessage("$6The awakened ones require the #Shadow and Spirit Medallions# as well as the #Light Arrows#.^", + /*german*/ "$6Die Weisen werden darauf warten, dass der Held das #Amulett des Schattens, Amulett der Geister# und die #Licht-Pfeile# sammelt.^", + /*french*/ "$6Les êtres de sagesse attendront le héros muni des #Médaillons de l'Ombre et l'Esprit# et des #Flèches de Lumière#.^", + {QM_RED, QM_YELLOW})); + // /*spanish*/$6Los sabios aguardarán a que el héroe obtenga tanto el #Medallón de las Sombras y el del Espíritu# junto + // a la #flecha de luz#.^ - hintTable[RHT_BRIDGE_MEDALLIONS_HINT] = HintText::Bridge({ - // obscure text singular plural - Text{ "The awakened ones will await for the Hero to collect #%d |Medallion|Medallions|#.", - /*french*/ "Les êtres de sagesse attendront le héros muni de #%d |Médaillon|Médaillons|#.", - /*spanish*/ "Los sabios aguardarán a que el héroe&obtenga #%d |medallón|medallones|#.", - /*german*/"Die Weisen werden darauf warten, dass der Held #%d |Amulett|Amulette|# sammelt." }, - }); + hintTextTable[RHT_BRIDGE_STONES_HINT] = HintText(CustomMessage("$0The awakened ones will await for the Hero to collect #[[d]] Spiritual Stone||s|#.^", + /*german*/ "$0Die Weisen werden darauf warten, dass der Held #[[d]] |Heiligen Stein|Heilige Steine|# sammelt.^", + /*french*/ "$0Les êtres de sagesse attendront le héros muni de #[[d]] |Pierre Ancestrale|Pierres Ancestrales|#.^", + {QM_BLUE})); + // /*spanish*/$0Los sabios aguardarán a que el héroe&obtenga #[[d]] |piedra espiritual|piedras espirituales|#.^ - hintTable[RHT_BRIDGE_REWARDS_HINT] = HintText::Bridge({ - // obscure text singular plural - Text{ "The awakened ones will await for the Hero to collect #%d |Spiritual Stone or Medallion|Spiritual Stones " - "and Medallions|#.", - /*french*/ - "Les êtres de sagesse attendront le héros muni de #%d |Pierre Ancestrale ou Médaillon|Pierres Ancestrales ou Médaillons|#.", - /*spanish*/ - "Los sabios aguardarán a que el héroe obtenga #%d |piedra espiritual o medallón|piedras espirtuales y " - "medallones|#.", - /*german*/"Die Weisen werden darauf warten, dass der Held #%d |Heiligen Stein oder Amulett|Heilige Steine oder Amulette|# sammelt." }, - }); + hintTextTable[RHT_BRIDGE_MEDALLIONS_HINT] = HintText(CustomMessage("$8The awakened ones will await for the Hero to collect #[[d]] Medallion||s|#.^", + /*german*/ "$8Die Weisen werden darauf warten, dass der Held #[[d]] Amulett||e|# sammelt.^", + /*french*/ "$8Les êtres de sagesse attendront le héros muni de #[[d]] Médaillon||s|#.^", + {QM_RED})); + // /*spanish*/$8Los sabios aguardarán a que el héroe&obtenga #[[d]] |medallón|medallones|#.^ - hintTable[RHT_BRIDGE_DUNGEONS_HINT] = HintText::Bridge({ - // obscure text singular plural - Text{ "The awakened ones will await for the Hero to conquer #%d |Dungeon|Dungeons|#.", - /*french*/ "Les êtres de sagesse attendront la conquête de #%d |Donjon|Donjons|#.", - /*spanish*/ "Los sabios aguardarán a que el héroe complete #%d |mazmorra|mazmorras|#.", - /*german*/"Die Weisen werden darauf warten, dass der Held #%d |Labyrinth|Labyrinthe|# abschließt." }, - }); + hintTextTable[RHT_BRIDGE_REWARDS_HINT] = HintText(CustomMessage("$CThe awakened ones will await for the Hero to collect #[[d]]# |#Spiritual Stone# or #Medallion#|" + "#Spiritual Stones# and #Medallions#|.^", + /*german*/ "$CDie Weisen werden darauf warten, dass der Held #[[d]]# |#Heiligen Stein# oder #Amulett#|" + "#Heilige Steine# oder #Amulette#| sammelt.^", + /*french*/ "$CLes êtres de sagesse attendront le héros muni de #[[d]]# |#Pierre Ancestrale# ou #Médaillon#" + "|#Pierres Ancestrales# ou #Médaillons#|.^", + {QM_YELLOW, QM_BLUE, QM_RED})); + // /*spanish*/$CLos sabios aguardarán a que el héroe obtenga #[[d]]# |#piedra espiritual# o #medallón#| + //#piedras espirtuales# y #medallones#|.^ - hintTable[RHT_BRIDGE_TOKENS_HINT] = HintText::Bridge({ - // obscure text - Text{ "The awakened ones will await for the Hero to collect #%d |Gold Skulltula Token|Gold Skulltula Tokens|#.", - /*french*/ "Les êtres de sagesse attendront le héros muni de #%d |Symbole|Symboles| de Skulltula d'or#.", - /*spanish*/ "Los sabios aguardarán a que el héroe obtenga #%d |símbolo|símbolos| de skulltula dorada#.", - /*german*/"Die Weisen werden darauf warten, dass der Held #%d |Skulltula-Symbol|Skulltula-Symbole|# sammelt." }, - }); + hintTextTable[RHT_BRIDGE_DUNGEONS_HINT] = HintText(CustomMessage("$mThe awakened ones will await for the Hero to conquer #[[d]] Dungeon||s|#.^", + /*german*/ "$mDie Weisen werden darauf warten, dass der Held #[[d]] Labyrinth||e|# abschließt.^", + /*french*/ "$mLes êtres de sagesse attendront la conquête de #[[d]] Donjon||s|#.^", + {QM_PINK})); + // /*spanish*/$mLos sabios aguardarán a que el héroe complete #[[d]] mazmorra||s|#.^ + + hintTextTable[RHT_BRIDGE_TOKENS_HINT] = HintText(CustomMessage("$sThe awakened ones will await for the Hero to collect #[[d]] Gold Skulltula Token||s|#.^", + /*german*/ "$sDie Weisen werden darauf warten, dass der Held #[[d]] Skulltula-Symbol||e|# sammelt.^", + /*french*/ "$sLes êtres de sagesse attendront le héros muni de #[[d]] Symbole||s| de Skulltula d'or#.^", + {QM_YELLOW})); + // /*spanish*/$sLos sabios aguardarán a que el héroe obtenga #[[d]] símbolo||s| de skulltula dorada#.^ + + hintTextTable[RHT_BRIDGE_GREG_HINT] = HintText(CustomMessage("$gThe awakened ones will await for the Hero to find #Greg#.^", + {QM_GREEN})); - hintTable[RHT_BRIDGE_GREG_HINT] = HintText::Bridge({ - // obscure text - Text{ "The awakened ones will await for the Hero to find %gGreg%w.", - /*french*/ "The awakened ones will await for the Hero to find %gGreg%w.", - /*spanish*/ "The awakened ones will await for the Hero to find %gGreg%w." }, - }); /*-------------------------- | GANON BOSS KEY HINT TEXT | ---------------------------*/ - hintTable[RHT_GANON_BK_START_WITH_HINT] = HintText::GanonsBossKey({ - // obscure text - Text{ "And the #evil one#'s key will be #given from the start#.", - /*french*/ "Aussi, la #clé du Malin# sera #possession même du héros#.", - /*spanish*/ "Y obtendrás la llave del #señor del mal# desde el #inicio#.", - /*german*/"Und der #Schlüssel des Bösen#, wird #von Anfang an, im Besitz des Helden# sein." }, - }); + hintTextTable[RHT_GANON_BK_START_WITH_HINT] = HintText(CustomMessage("$bAnd the #evil one#'s key will be #given from the start#.^", + /*german*/ "$bUnd der #Schlüssel des Bösen#, wird #von Anfang an, im Besitz des Helden# sein.^", + /*french*/ "$bAussi, la #clé du Malin# sera #possession même du héros#.^", + {QM_PINK, QM_LBLUE})); + // /*spanish*/$bY obtendrás la llave del #señor del mal# desde el #inicio#.^ - hintTable[RHT_GANON_BK_VANILLA_HINT] = HintText::GanonsBossKey({ - // obscure text - Text{ "And the #evil one#'s key will be kept in a big chest #inside its tower#.", - /*french*/ "Aussi, la #clé du Malin# sera encoffrée #dans sa tour#.", - /*spanish*/ "Y la llave del #señor del mal# aguardará en un gran cofre de #su torre#.", - /*german*/"Und der #Schlüssel des Bösen#, wird in der großen Truhe #im Teufelsturm# zu finden sein." }, - }); + hintTextTable[RHT_GANON_BK_VANILLA_HINT] = HintText(CustomMessage("$bAnd the #evil one#'s key will be kept in a big chest #inside its tower#.^", + /*german*/ "$bUnd der #Schlüssel des Bösen#, wird in der großen Truhe #im Teufelsturm# zu finden sein.^", + /*french*/ "$bAussi, la #clé du Malin# sera encoffrée #dans sa tour#.^", + {QM_PINK, QM_LBLUE})); + // /*spanish*/$bY la llave del #señor del mal# aguardará en un gran cofre de #su torre#.^ - hintTable[RHT_GANON_BK_OWN_DUNGEON_HINT] = HintText::GanonsBossKey({ - // obscure text - Text{ "And the #evil one#'s key will be hidden somewhere #inside its castle#.", - /*french*/ "Aussi, la #clé du Malin# sera cachée #dans son vaste château#.", - /*spanish*/ "Y la llave del #señor del mal# aguardará en #algún lugar de su castillo#.", - /*german*/"Und der #Schlüssel des Bösen#, wird irgendwo #in Ganons Schloss# zu finden sein." }, - }); + hintTextTable[RHT_GANON_BK_OWN_DUNGEON_HINT] = HintText(CustomMessage("$bAnd the #evil one#'s key will be hidden somewhere #inside its castle#.^", + /*german*/ "$bUnd der #Schlüssel des Bösen#, wird irgendwo #in Ganons Schloss# zu finden sein.^", + /*french*/ "$bAussi, la #clé du Malin# sera cachée #dans son vaste château#.^", + {QM_PINK, QM_PINK})); + // /*spanish*/$bY la llave del #señor del mal# aguardará en #algún lugar de su castillo#.^ - hintTable[RHT_GANON_BK_OVERWORLD_HINT] = HintText::GanonsBossKey({ - // obscure text - Text{ "And the #evil one#'s key will be hidden #outside of dungeons# in Hyrule.", - /*french*/ "Aussi, la #clé du Malin# se trouve #hors des donjons# d'Hyrule.", - /*spanish*/ "Y la llave del #señor del mal# aguardará #fuera de las mazmorras# de Hyrule.", - /*german*/"Und der #Schlüssel des Bösen#, wird irgendwo #in Hyrule, außerhalb von Labyrinthen# zu finden sein." }, - }); + hintTextTable[RHT_GANON_BK_OVERWORLD_HINT] = HintText(CustomMessage("$bAnd the #evil one#'s key will be hidden #outside of dungeons# in Hyrule.^", + /*german*/ "$bUnd der #Schlüssel des Bösen#, wird irgendwo #in Hyrule, außerhalb von Labyrinthen# zu finden sein.^", + /*french*/ "$bAussi, la #clé du Malin# se trouve #hors des donjons# d'Hyrule.^", + {QM_PINK, QM_GREEN})); + // /*spanish*/$bY la llave del #señor del mal# aguardará #fuera de las mazmorras# de Hyrule.^ - hintTable[RHT_GANON_BK_ANY_DUNGEON_HINT] = HintText::GanonsBossKey({ - // obscure text - Text{ "And the #evil one#'s key will be hidden #inside a dungeon# in Hyrule.", - /*french*/ "Aussi, la #clé du Malin# se trouve #dans un donjon# d'Hyrule.", - /*spanish*/ "Y la llave del #señor del mal# aguardará #en una mazmorra# de Hyrule.", - /*german*/"Und der #Schlüssel des Bösen#, wird irgendwo #in Hyrule, innerhalb eines Labyrinths# zu finden sein." }, - }); + hintTextTable[RHT_GANON_BK_ANY_DUNGEON_HINT] = HintText(CustomMessage("$bAnd the #evil one#'s key will be hidden #inside a dungeon# in Hyrule.^", + /*german*/ "$bUnd der #Schlüssel des Bösen#, wird irgendwo #in Hyrule, innerhalb eines Labyrinths# zu finden sein.^", + /*french*/ "$bAussi, la #clé du Malin# se trouve #dans un donjon# d'Hyrule.^", + {QM_PINK, QM_PINK})); + // /*spanish*/$bY la llave del #señor del mal# aguardará #en una mazmorra# de Hyrule.^ - hintTable[RHT_GANON_BK_ANYWHERE_HINT] = HintText::GanonsBossKey({ - // obscure text - Text{ "And the #evil one#'s key will be hidden somewhere&#in Hyrule#.", - /*french*/ "Aussi, la #clé du Malin# se trouve quelque part #dans Hyrule#.", - /*spanish*/ "Y la llave del #señor del mal# aguardará en #cualquier lugar de Hyrule#.", - /*german*/"Und der #Schlüssel des Bösen#, wird irgendwo #in Hyrule# zu finden sein." }, - }); + hintTextTable[RHT_GANON_BK_ANYWHERE_HINT] = HintText(CustomMessage("$bAnd the #evil one#'s key will be hidden somewhere&#in Hyrule#.^", + /*german*/ "$bUnd der #Schlüssel des Bösen#, wird irgendwo #in Hyrule# zu finden sein.^", + /*french*/ "$bAussi, la #clé du Malin# se trouve quelque part #dans Hyrule#.^", + {QM_PINK, QM_BLUE})); + // /*spanish*/$bY la llave del #señor del mal# aguardará en #cualquier lugar de Hyrule#.^ - hintTable[RHT_GANON_BK_TRIFORCE_HINT] = HintText::GanonsBossKey({ - // obscure text - Text{ "And the #evil one#'s key will be given to the Hero once the #Triforce## is completed.", - /*french*/ "Aussi, la #clé du Malin# se&révèlera une fois la #Triforce#&assemblée.", - /*spanish*/ "Y el héroe recibirá la llave del #señor del mal# cuando haya completado la #Trifuerza#.", - /*german*/"Und der #Schlüssel des Bösen# wird verliehen, sobald das #Triforce# vervollständigt wurde." }, - }); + hintTextTable[RHT_GANON_BK_TRIFORCE_HINT] = HintText(CustomMessage("$bAnd the #evil one#'s key will be given to the Hero once the #Triforce## is completed.^", + /*german*/ "$bUnd der #Schlüssel des Bösen# wird verliehen, sobald das #Triforce# vervollständigt wurde.^", + /*french*/ "$bAussi, la #clé du Malin# se&révèlera une fois la #Triforce#&assemblée.^", + {QM_PINK, QM_YELLOW})); + // /*spanish*/$bY el héroe recibirá la llave del #señor del mal# cuando haya completado la #Trifuerza#.^ - hintTable[RHT_GANON_BK_SKULLTULA_HINT] = HintText::GanonsBossKey({ - // obscure text - Text { "And the #evil one#'s key will be provided by the cursed rich man once #100 Gold Skulltula Tokens# are retrieved.", - /*french*/ "Aussi, la #clé du Malin# sera&donnée par l'homme maudit une fois que #100 Symboles de Skulltula d'or# auront été trouvés.", - /*spanish*/ "Y el rico maldito entregará la llave&del #señor de mal# tras obtener&100 símbolos de skulltula dorada#."}, - }); + hintTextTable[RHT_GANON_BK_SKULLTULA_HINT] = HintText(CustomMessage("$bAnd the #evil one#'s key will be provided by the cursed rich man once #100 Gold Skulltula Tokens# are retrieved.^", + /*german*/ "", + /*french*/ "$bAussi, la #clé du Malin# sera&donnée par l'homme maudit une fois que #100 Symboles de Skulltula d'or# auront été trouvés.^", + {QM_PINK, QM_YELLOW})); + // /*spanish*/$bY el rico maldito entregará la llave&del #señor de mal# tras obtener&100 símbolos de skulltula dorada#.^ - /*-------------------------- - | LACS HINT TEXT | - ---------------------------*/ + hintTextTable[RHT_LACS_VANILLA_HINT] = HintText(CustomMessage("$bAnd the #evil one#'s key will be provided by #Zelda# once the #Shadow and Spirit Medallions# are retrieved.^", + /*german*/ "$bUnd der #Schlüssel des Bösen# wird von #Zelda# verliehen, sobald #die Amulette des Schattens und der Geister# geborgen wurden.^", + /*french*/ "$bAussi, la #clé du Malin# sera fournie par #Zelda# une fois que les #Médaillons de l'Ombre et de l'Esprit# seront récupérés.^", + {QM_PINK, QM_YELLOW, QM_RED})); + // /*spanish*/$bY #Zelda# entregará la llave del #señor del mal# tras obtener #el medallón de las sombras y del espíritu#.^ - hintTable[RHT_LACS_VANILLA_HINT] = HintText::LACS({ - // obscure text - Text{ - "And the #evil one#'s key will be provided by Zelda once the #Shadow and Spirit Medallions# are retrieved.", - /*french*/ "Aussi, la #clé du Malin# sera fournie par Zelda une fois que les #Médaillons de l'Ombre et de l'Esprit# seront récupérés.", - /*spanish*/ - "Y Zelda entregará la llave del #señor del mal# tras obtener #el medallón de las sombras y del " - "espíritu#.", - /*german*/"Und der #Schlüssel des Bösen# wird von Zelda verliehen, sobald #die Amulette des Schattens und der Geister# geborgen wurden." }, - }); + hintTextTable[RHT_LACS_MEDALLIONS_HINT] = HintText(CustomMessage("$bAnd the #evil one#'s key will be provided by #Zelda# once #[[d]] Medallion|# is|s# are| retrieved.^", + /*german*/ "$bUnd der #Schlüssel des Bösen# wird von #Zelda# verliehen, sobald #[[d]] Amulett|# geborgen wurde|e# geborgen wurden|.^", + /*french*/ "$bAussi, la #clé du Malin# sera fournie par #Zelda# une fois |qu' #[[d]] Médaillon# aura été récupéré|que #[[d]] Médaillons# auront été récupérés|.^", + {QM_PINK, QM_YELLOW, QM_RED})); + // /*spanish*/$bY #Zelda# entregará la llave&del #señor del mal# tras obtener #[[d]] |medallón|medallones|#.^ - hintTable[RHT_LACS_MEDALLIONS_HINT] = HintText::LACS({ - // obscure text singular plural - Text{ "And the #evil one#'s key will be provided by Zelda once #%d |Medallion# is|Medallions# are| retrieved.", - /*french*/ "Aussi, la #clé du Malin# sera fournie par Zelda une fois |qu' #%d Médaillon# aura été récupéré|que #%d Médaillons# auront été récupérés|.", - /*spanish*/ "Y Zelda entregará la llave&del #señor del mal# tras obtener #%d |medallón|medallones|#.", - /*german*/"Und der #Schlüssel des Bösen# wird von Zelda verliehen, sobald #%d |Amulett# geborgen wurde|Amulette# geborgen wurden|." }, - }); + hintTextTable[RHT_LACS_STONES_HINT] = HintText(CustomMessage("$bAnd the #evil one#'s key will be provided by #Zelda# once #[[d]] Spiritual Stone|# is|s# are| retrieved.^", + /*german*/ "$bUnd der #Schlüssel des Bösen# wird von #Zelda# verliehen, sobald #[[d]] Heilige|r Stein# geborgen wurde| Steine# geborgen wurden|.^", + /*french*/ "$bAussi, la #clé du Malin# sera fournie par #Zelda# une fois |qu' #[[d]] Pierre Ancestrale# aura été&récupérée|que #[[d]] Pierres Ancestrales# auront été récupérées|.^", + {QM_PINK, QM_YELLOW, QM_BLUE})); + // /*spanish*/$bY #Zelda# entregará la llave del #señor del mal# tras obtener #[[d]] piedra| espiritual|s espirituales|#.^ - hintTable[RHT_LACS_STONES_HINT] = HintText::LACS({ - // obscure text singular plural - Text{ - "And the #evil one#'s key will be provided by Zelda once #%d |Spiritual Stone# is|Spiritual Stones# are| " - "retrieved.", - /*french*/ "Aussi, la #clé du Malin# sera fournie par Zelda une fois |qu' #%d Pierre Ancestrale# aura été&récupérée|que #%d Pierres Ancestrales# auront été récupérées|.", - /*spanish*/ - "Y Zelda entregará la llave del #señor del mal# tras obtener #%d |piedra espiritual|piedras " - "espirituales|#.", - /*german*/"Und der #Schlüssel des Bösen# wird von Zelda verliehen, sobald #%d |Heiliger Stein# geborgen wurde|Heilige Steine# geborgen wurden|." }, - }); + hintTextTable[RHT_LACS_REWARDS_HINT] = HintText(CustomMessage("$bAnd the #evil one#'s key will be provided by #Zelda# once #[[d]]# #Spiritual Stone|# or #Medallion# is|s# and #Medallions# are| retrieved.^", + /*german*/ "$bUnd der #Schlüssel des Bösen# wird von #Zelda# verliehen, sobald #[[d]]# #Heilige|r Stein# oder #Amulett#&geborgen wurde| Steine# oder #Amulette#&geborgen wurden|.^", + /*french*/ "$bAussi, la #clé du Malin# sera fournie par #Zelda# une fois qu|' #[[d]]# #Pierre Ancestrale# ou #[[d]] Médaillon# sera récupéré|e&#[[d]]# #Pierres Ancestrales# et&#Médaillons# seront récupérés|.^", + {QM_PINK, QM_YELLOW, QM_YELLOW, QM_BLUE, QM_RED})); + // /*spanish*/$bY #Zelda# entregará la llave del #señor del mal# tras obtener #[[d]]# piedra| espiritual o medallón|s espirituales o medallones|#.^ - hintTable[RHT_LACS_REWARDS_HINT] = HintText::LACS({ - // obscure text singular plural - Text{ "And the #evil one#'s key will be provided by Zelda once #%d |Spiritual Stone or Medallion# " - "is|Spiritual Stones and Medallions# are| retrieved.", - /*french*/ - "Aussi, la #clé du Malin# sera fournie par Zelda une fois |qu' #%d Pierre Ancestrale ou %d Médaillon# sera récupéré|que&#%d Pierres Ancestrales et&Médaillons# seront récupérés|.", - /*spanish*/ - "Y Zelda entregará la llave del #señor del mal# tras obtener #%d |piedra espiritual o medallón|piedras " - "espirituales o medallones|#.", - /*german*/"Und der #Schlüssel des Bösen# wird von Zelda verliehen, sobald #%d |Heiliger Stein oder Amulett#&geborgen wurde|Heilige Steine oder Amulette#&geborgen wurden|." }, - }); + hintTextTable[RHT_LACS_DUNGEONS_HINT] = HintText(CustomMessage("$bAnd the #evil one#'s key will be provided by #Zelda# once #[[d]] Dungeon|# is|s# are| conquered.^", + /*german*/ "$bUnd der #Schlüssel des Bösen# wird von #Zelda# verliehen, sobald #[[d]] Labyrinth|# abgeschlossen wurde|e# abgeschlossen wurden|.^", + /*french*/ "$bAussi, la #clé du Malin# sera fournie par #Zelda# une fois qu|' #[[d]] donjon #sera conquis|e #[[d]] donjons# seront conquis|.^", + {QM_PINK, QM_YELLOW, QM_PINK})); + // /*spanish*/$bY #Zelda# entregará la llave del #señor del mal# tras completar #[[d]] mazmorra||s|#.^ - hintTable[RHT_LACS_DUNGEONS_HINT] = HintText::LACS({ - // obscure text singular plural - Text{ "And the #evil one#'s key will be provided by Zelda once #%d |Dungeon# is|Dungeons# are| conquered.", - /*french*/ "Aussi, la #clé du Malin# sera fournie par Zelda une fois |qu' #%d donjon #sera conquis|que #%d donjons# seront conquis|.", - /*spanish*/ "Y Zelda entregará la llave del #señor del mal# tras completar #%d |mazmorra|mazmorras|#.", - /*german*/"Und der #Schlüssel des Bösen# wird von Zelda verliehen, sobald #%d |Labyrinth# abgeschlossen wurde|Labyrinthe# abgeschlossen wurden|." }, - }); + hintTextTable[RHT_LACS_TOKENS_HINT] = HintText(CustomMessage("$bAnd the #evil one#'s key will be provided by #Zelda# once #[[d]] Gold Skulltula Token|# is|s# are| retrieved.^", + /*german*/ "$bUnd der #Schlüssel des Bösen# wird von #Zelda# verliehen, sobald #[[d]] Skulltula-Symbol|# gesammelt wurde|e# gesammelt wurden|.^", + /*french*/ "$bAussi, la #clé du Malin# sera fournie par #Zelda# une fois |qu' #[[d]] symbole de Skulltula d'or #sera récupuéré" + "|que &#[[d]] symboles de Skulltula d'or&#seront recupérés|.^", + {QM_PINK, QM_YELLOW, QM_YELLOW})); + // /*spanish*/$bY #Zelda# entregará la llave del #señor del mal# tras obtener #[[d]] símbolo + // ||s| de skulltula dorada#.^ - hintTable[RHT_LACS_TOKENS_HINT] = HintText::LACS({ - // obscure text singular plural - Text{ "And the #evil one#'s key will be provided by Zelda once #%d |Gold&Skulltula Token# is|Gold Skulltula " - "Tokens# are| retrieved.", - /*french*/ "Aussi, la #clé du Malin# sera fournie par Zelda une fois |qu' #%d symbole de Skulltula d'or #sera récupuéré|que &#%d symboles de Skulltula d'or&#seront recupérés|.", - /*spanish*/ - "Y Zelda entregará la llave del #señor del mal# tras obtener #%d |símbolo|símbolos| de skulltula " - "dorada#.", - /*german*/"Und der #Schlüssel des Bösen# wird von Zelda verliehen, sobald #%d |Skulltula-Symbol# gesammelt wurde|Skulltula-Symbole# gesammelt wurden|." }, - }); /*-------------------------- | TRIAL HINT TEXT | ---------------------------*/ - hintTable[RHT_SIX_TRIALS] = HintText::Exclude({ - // obscure text - Text{ "#Ganon's Tower# is protected by a powerful barrier.", - /*french*/ "#la Tour de Ganon# est protégée par une puissante barrière", - /*spanish*/ "la #torre de Ganon# está protegida por una poderosa barrera", - /*german*/"der #Teufelsturm# sei von einer mächtigen Barriere geschützt." }, - }); + hintTextTable[RHT_SIX_TRIALS] = HintText(CustomMessage("They say that #Ganon's Tower# is protected by a powerful barrier.", + /*german*/ "Man erzählt sich, daß der #Teufelsturm# sei von einer mächtigen Barriere geschützt sei.", + /*french*/ "Selon moi, #la Tour de Ganon# est protégée par une puissante barrière", {QM_PINK})); + // /*spanish*/Según dicen, la #torre de Ganon# está protegida por una poderosa barrera - hintTable[RHT_ZERO_TRIALS] = HintText::Exclude({ - // obscure text - Text{ "Sheik dispelled the barrier around #Ganon's Tower#.", - /*french*/ "Sheik a dissipé la barrière autour de #la Tour de Ganon#", - /*spanish*/ "Sheik disipó la barrera alrededor de la #torre de Ganon#.", - /*german*/"Shiek habe die Barriere um den #Teufelsturm# aufgelöst." }, - }); + hintTextTable[RHT_ZERO_TRIALS] = HintText(CustomMessage("They say that Sheik dispelled the barrier around #Ganon's Tower#.", + /*german*/ "Man erzählt sich, Shiek habe die Barriere um den #Teufelsturm# aufgelöst sei.", + /*french*/ "Selon moi, Sheik a dissipé la barrière autour de #la Tour de Ganon#", {QM_YELLOW})); + // /*spanish*/Según dicen, Sheik disipó la barrera alrededor de la #torre de Ganon#. - hintTable[RHT_FOUR_TO_FIVE_TRIALS] = HintText::Exclude({ - // obscure text - Text{ " was dispelled by Sheik.", /*french*/ " a été dissipée par Sheik.", - /*spanish*/ " se disipó gracias a Sheik.", - /*german*/" sei von Shiek aufgelöst worden." }, - }); + hintTextTable[RHT_TRIAL_OFF] = HintText(CustomMessage("They say that #[[1]]# was dispelled by Sheik.", + /*german*/ "Man erzählt sich, daß #[[1]]# sei von Shiek aufgelöst worden sei.", + /*french*/ "Selon moi, #[[1]]# a été dissipée par Sheik.", {QM_YELLOW})); + // /*spanish*/Según dicen, #[[1]]# se disipó gracias a Sheik. - hintTable[RHT_ONE_TO_THREE_TRIALS] = HintText::Exclude({ - // obscure text - Text{ " protects Ganons Tower.", /*french*/ " protège la Tour de Ganon.", - /*spanish*/ " protege la torre de Ganon", - /*german*/" schütze den Teufelsturm." }, - }); + hintTextTable[RHT_TRIAL_ON] = HintText(CustomMessage("They say that #[[1]]# protects Ganons Tower.", + /*german*/ "Man erzählt sich, daß #[[1]]# schütze den Teufelsturm sei.", + /*french*/ "Selon moi, #[[1]]# protège la Tour de Ganon.", {QM_PINK})); + // /*spanish*/Según dicen, #[[1]]# protege la torre de Ganon + + hintTextTable[RHT_LIGHT_TRIAL] = HintText(CustomMessage("the Light Trial", + /*german*/ "", + /*french*/ "l'épreuve de la Lumière")); + // /*spanish*/la prueba de la luz + + hintTextTable[RHT_FOREST_TRIAL] = HintText(CustomMessage("the Forest Trial", + /*german*/ "", + /*french*/ "l'épreuve de la Forêt")); + // /*spanish*/la prueba del bosque + + hintTextTable[RHT_FIRE_TRIAL] = HintText(CustomMessage("the Fire Trial", + /*german*/ "", + /*french*/ "l'épreuve du Feu")); + // /*spanish*/la prueba del fuego + + hintTextTable[RHT_WATER_TRIAL] = HintText(CustomMessage("the Water Trial", + /*german*/ "", + /*french*/ "l'épreuve de l'Eau")); + // /*spanish*/la prueba del agua + + hintTextTable[RHT_SPIRIT_TRIAL] = HintText(CustomMessage("the Spirit Trial", + /*german*/ "", + /*french*/ "l'épreuve de l'Esprit")); + // /*spanish*/la prueba del espíritu + + hintTextTable[RHT_SHADOW_TRIAL] = HintText(CustomMessage("the Shadow Trial", + /*german*/ "", + /*french*/ "l'épreuve de l'Ombre")); + // /*spanish*/la prueba de las sombras /*-------------------------- | ALTAR TEXT | ---------------------------*/ - hintTable[RHT_SPIRITUAL_STONE_TEXT_START] = HintText::Altar({ - // obscure text - Text{ "3 Spiritual Stones found in Hyrule...", - /*french*/ "Les trois Pierres Ancestrales cachées&dans Hyrule...", - /*spanish*/ "Tres piedras espirituales halladas por Hyrule...", - /*german*/"Drei Heilige Steine, zu finden in Hyrule..." }, - }); + hintTextTable[RHT_CHILD_ALTAR_STONES] = HintText(CustomMessage("3 Spiritual Stone's found in Hyrule...^$0#[[1]]#...^$1#[[2]]#...^$2#[[3]]#...^", + /*german*/ "Drei Heilige Steine, zu finden in Hyrule...$0#[[1]]#...^$1#[[2]]#...^$2#[[3]]#...^", + /*french*/ "Les trois Pierres Ancestrales cachées&dans Hyrule...$0#[[1]]#...^$1#[[2]]#...^$2#[[3]]#...^", + {QM_GREEN, QM_RED, QM_BLUE}, {true, true, true})); + // /*spanish*/ Tres piedras espirituales halladas por Hyrule...$0#[[1]]#...^$1#[[2]]#...^$2#[[3]]#...^ - hintTable[RHT_CHILD_ALTAR_TEXT_END_DOTOPEN] = HintText::Altar({ - // obscure text - Text{ "Ye who may become a Hero...&The path to the future is open...", - /*french*/ "À celui qui a quête de devenir&héros...&Le futur vous accueille béant...", - /*spanish*/ "Para aquel que se convierta en el héroe...&La puerta al futuro está a su disposición...", - /*german*/"Jener auf dem Weg des Helden...&Der Pfad zur Zukunft sei geöffnet..." }, - }); + hintTextTable[RHT_CHILD_ALTAR_TEXT_END_DOTOPEN] = HintText(CustomMessage("$oYe who may become a Hero...&The path to the future is open...", + /*german*/ "$oJener auf dem Weg des Helden...&Der Pfad zur Zukunft sei geöffnet...", + /*french*/ "$oÀ celui qui a quête de devenir&héros...&Le futur vous accueille béant...")); + // /*spanish*/$oPara aquel que se convierta en el héroe...&La puerta al futuro está a su disposición... - hintTable[RHT_CHILD_ALTAR_TEXT_END_DOTSONGONLY] = HintText::Altar({ - // obscure text - Text{ - "Ye who may become a Hero...&Stand with the Ocarina and&play the Song of Time.", - /*french*/ "À celui qui a quête de devenir&héros...&Portez l'Ocarina et jouez&le chant du temps.", - /*spanish*/ "Para aquel que se convierta en el héroe...&Tome la ocarina y&entone la Canción del Tiempo.", - /*german*/"Jener auf dem Weg des Helden...&Nehme er seine Okarina zur Hand und&spiele hier die Hymne der Zeit." }, - }); + hintTextTable[RHT_CHILD_ALTAR_TEXT_END_DOTSONGONLY] = HintText(CustomMessage("$cYe who may become a Hero...&Stand with the Ocarina and&play the Song of Time.", + /*german*/ "$cJener auf dem Weg des Helden...&Nehme er seine Okarina zur Hand und&spiele hier die Hymne der Zeit.", + /*french*/ "$cÀ celui qui a quête de devenir&héros...&Portez l'Ocarina et jouez&le chant du temps.")); + // /*spanish*/$cPara aquel que se convierta en el héroe...&Tome la ocarina y&entone la Canción del Tiempo. + + hintTextTable[RHT_CHILD_ALTAR_TEXT_END_DOTCLOSED] = HintText(CustomMessage("$iYe who may become a Hero...&Offer the spiritual stones and&play the Song of Time.", + /*german*/ "$iJener mit den drei Heiligen Steinen&nehme seine Okarina zur Hand und&spiele hier die Hymne der Zeit.", + /*french*/ "$iÀ celui qui a quête de devenir&héros... Présentez les Pierres&Ancestrales et jouez&le chant du temps.")); + // /*spanish*/$iPara aquel que se convierta en el héroe...&Tome las piedras espirituales y&entone la Canción del Tiempo. - hintTable[RHT_CHILD_ALTAR_TEXT_END_DOTCLOSED] = HintText::Altar({ - // obscure text - Text{ "Ye who may become a Hero...&Offer the spiritual stones and&play the Song of Time.", - /*french*/ - "À celui qui a quête de devenir&héros... Présentez les Pierres&Ancestrales et jouez&le chant du temps.", - /*spanish*/ - "Para aquel que se convierta en el héroe...&Tome las piedras espirituales y&entone la Canción del " - "Tiempo.", - /*german*/"Jener mit den drei Heiligen Steinen&nehme seine Okarina zur Hand und&spiele hier die Hymne der Zeit." }, - }); + hintTextTable[RHT_ADULT_ALTAR_MEDALLIONS] = HintText(CustomMessage("An awakening voice from the Sacred Realm will call those destined to be Sages, who dwell in the #five temples#.^" + "$8#[[1]]#...^$3#[[2]]#...^$4#[[3]]#...^$5#[[4]]#...^$6#[[5]]#...^$7#[[6]]#...^" , + /*german*/ "Beherrscht das Böse die Welt, weilen&jene Weisen, die von der Stimme des Heiligen Reiches erweckt werden, noch&in den #fünf Tempeln#.^" + "$8#[[1]]#...^$3#[[2]]#...^$4#[[3]]#...^$5#[[4]]#...^$6#[[5]]#...^$7#[[6]]#...^", + /*french*/ "Quand le mal aura triomphé, une voix du Saint Royaume appellera ceux cachés dans les #cinq temples#, destinés^à être Sages.^" + "$8#[[1]]#...^$3#[[2]]#...^$4#[[3]]#...^$5#[[4]]#...^$6#[[5]]#...^$7#[[6]]#...^", + { QM_RED, QM_YELLOW, QM_GREEN, QM_RED, QM_BLUE, QM_YELLOW, QM_PINK}, {true, true, true, true, true, true}, TEXTBOX_TYPE_BLUE)); + // /*spanish*/Cuando el mal lo impregne todo, desde el Reino Sagrado surgirá una voz que hará despertar a los sabios que moran en los #cinco templos#.^ + // $8#[[1]]#...^$3#[[2]]#...^$4#[[3]]#...^$5#[[4]]#...^$6#[[5]]#...^$7#[[6]]#...^ - hintTable[RHT_ADULT_ALTAR_TEXT_START] = HintText::Altar({ - // obscure text - Text{ "An awakening voice from the Sacred Realm will call those destined to be Sages, who dwell in the #five temples#.", - /*french*/ - "Quand le mal aura triomphé, une voix du Saint Royaume appellera ceux cachés dans les #cinq temples#, " - "destinés^à être Sages.", - /*spanish*/ - "Cuando el mal lo impregne todo, desde el Reino Sagrado surgirá una voz que hará despertar a los sabios " - "que moran en los #cinco templos#.", - /*german*/"Beherrscht das Böse die Welt, weilen&jene Weisen, die von der Stimme des Heiligen Reiches erweckt werden, noch&in den #fünf Tempeln#." }, - }); - - hintTable[RHT_ADULT_ALTAR_TEXT_END] = HintText::Altar({ - // obscure text - Text{ - "$kTogether with the Hero of Time, the awakened ones will return the light of peace to the world...", - /*french*/ - "$kEnsemble avec le Héros du Temps, ces Sages emprisonneront le mal et réinstaureront la lumière de paix " - "dans le monde...", - /*spanish*/ - "Con el Héroe del Tiempo, aquellos&que despierten detendrán el mal y&volverán al mundo de luz la paz...", - /*german*/"$kZusammen mit dem Auserwählten wer-den diese ihre Kräfte einsetzen, um der Welt den Frieden wiederzugeben." }, - }); + hintTextTable[RHT_ADULT_ALTAR_TEXT_END] = HintText(CustomMessage("$kTogether with the Hero of Time, the awakened ones will return the light of peace to the world...", + /*german*/ "$kZusammen mit dem Auserwählten wer-den diese ihre Kräfte einsetzen, um der Welt den Frieden wiederzugeben.", + /*french*/ "$kEnsemble avec le Héros du Temps, ces Sages emprisonneront le mal et réinstaureront la lumière de paix dans le monde...")); + // /*spanish*/Con el Héroe del Tiempo, aquellos&que despierten detendrán el mal y&volverán al mundo de luz la paz... /*-------------------------- - | VALIDATION LINE TEXT | + | Static Item Hints | ---------------------------*/ - hintTable[RHT_VALIDATION_LINE] = HintText::Validation({ - // obscure text - Text{ "Hmph... Since you made it this far, I'll let you know what glorious prize of Ganon's you likely missed " - "out on in my tower.^Behold...^", - /*french*/ - "Pah! Puisque tu t'es rendu ici, je te dirai quel trésor tu as manqué dans ma tour.^Et c'est...^", - /*spanish*/ - "Mmm... Ya que has llegado hasta aquí, te diré qué preciado objeto de mi propiedad puedes haberte dejado " - "en mi torre.^He aquí...^" }, - }); + hintTextTable[RHT_GANONDORF_HINT_LA_ONLY] = HintText(CustomMessage("Ha ha ha... You'll never beat me by reflecting my lightning bolts and unleashing the arrows from #[[1]]#!", + /*german*/ "", + /*french*/ "Ha ha ha... Pauvre fou! Tu ne pourras jamais me vaincre sans les flèches que j'ai cachées dans #[[1]]#!", + {QM_RED})); + // /*spanish*/Ja, ja, ja... Nunca me derrotarás reflejando mis esferas de energía y desplegando la flecha de luz de #[[1]]#! + + hintTextTable[RHT_GANONDORF_HINT_MS_ONLY] = HintText(CustomMessage("Ha ha ha... You'll never defeat me, drop a castle on me and finish me off with the sacred blade from #[[2]]#!", + /*german*/ "", + /*french*/ "", + {QM_RED})); + + hintTextTable[RHT_GANONDORF_HINT_LA_AND_MS] = HintText(CustomMessage("Ha ha ha... You'll never beat me by reflecting my lightning bolts and unleashing the arrows from #[[1]]#!" + "^And even if you do, you'll never find the legendary blade hidden in #[[2]]#!", + /*german*/ "", + /*french*/ "Ha ha ha... Pauvre fou! Tu ne pourras jamais me vaincre sans les flèches que j'ai cachées dans #[[1]]#!" + "^Et même si tu les trouves, tu ne touveras jamais l'épée de légende cachée dans #[[2]]#!", + {QM_RED, QM_RED})); + // /*spanish*/Ja, ja, ja... Nunca me derrotarás reflejando mis esferas de energía y desplegando la flecha de luz de #[[1]]#! + // ^E incluso si lo haces, nunca encontrarás la espada legendaria escondida en #[[2]]#! + + hintTextTable[RHT_SHEIK_HINT_LA_ONLY] = HintText(CustomMessage("I overheard Ganondorf say that he misplaced the #Light Arrows# in #[[1]]#.", + /*german*/ "", + /*french*/ "J'ai entendu dire que Ganondorf aurait caché les #Flèches de Lumière# dans #[[1]]#.", + {QM_YELLOW, QM_RED})); + + hintTextTable[RHT_DAMPE_DIARY] = HintText(CustomMessage("Whoever reads this, please enter #[[1]]#. I will let you have my #stretching, shrinking keepsake#.^I'm waiting for you.&--Dampé", + /*german*/ "Wer immer dies liest, der möge folgenden Ort aufsuchen: #[[1]]#. Ihm gebe ich meinen langen, kurzen Schatz.^Ich warte!&Boris", //RANDOTODO color in whatever refers to the hookshot + /*french*/ "Toi qui lit ce journal, rends-toi dans #[[1]]#. Et peut-être auras-tu droit à mon précieux #trésor#.^Je t'attends...&--Igor", + {QM_RED, QM_RED})); + + hintTextTable[RHT_GREG_HINT] = HintText(CustomMessage("By the way, if you're interested, I saw the shiniest #Green Rupee# somewhere in #[[1]]#.^It's said to have #mysterious powers#...^But then, it could just be another regular rupee.&Oh well.", + /*german*/ "", + /*french*/ "Au fait, si ça t'intéresse, j'ai aperçu le plus éclatant des #Rubis Verts# quelque part à #[[1]]#. On dit qu'il possède des pouvoirs mystérieux... Mais bon, ça pourrait juste être un autre rubis ordinaire.",//RANDOTODO color in mysterious powers + {QM_GREEN, QM_RED, QM_RED})); + + hintTextTable[RHT_SARIA_TALK_HINT] = HintText(CustomMessage("Did you feel the #surge of magic# recently? A mysterious bird told me it came from #[[1]]#.^You should check that place out, @!", + /*german*/ "", + /*french*/ "As-tu récemment ressenti une vague de #puissance magique#? Un mystérieux hibou m'a dit qu'elle provenait du #[[1]]#. Tu devrais aller y jeter un coup d'oeil, @!", + {QM_GREEN, QM_RED})); + + hintTextTable[RHT_SARIA_SONG_HINT] = HintText(CustomMessage("Did you feel the #surge of magic# recently? A mysterious bird told me it came from #[[1]]#.^You should check that place out, @!\x0B", + /*german*/ "", + /*french*/ "As-tu récemment ressenti une vague de #puissance magique#? Un mystérieux hibou m'a dit qu'elle provenait du #[[1]]#. Tu devrais aller y jeter un coup d'oeil, @!\x0B", + {QM_GREEN, QM_RED}, {}, TEXTBOX_TYPE_BLUE)); + + hintTextTable[RHT_FISHING_POLE_HINT] = HintText(CustomMessage("^If I remember correctly, I lost it somewhere in #[[1]]#...&Let me know if you find it!", + {QM_RED})); /*-------------------------- - | LIGHT ARROW LOCATION TEXT| + | Static Entrance Hint | ---------------------------*/ - hintTable[RHT_LIGHT_ARROW_LOCATION_HINT] = HintText::OtherHint({ - // obscure text - Text{ - "Ha ha ha... You'll never beat me by reflecting my lightning bolts and unleashing the arrows from ", - /*french*/ - "Ha ha ha... Pauvre fou! Tu ne pourras jamais me vaincre sans les flèches que j'ai cachées dans ", - /*spanish*/ - "Ja, ja, ja... Nunca me derrotarás reflejando mis esferas de energía y desplegando la flecha de luz de " }, - }); - - hintTable[RHT_SHEIK_LIGHT_ARROW_HINT] = HintText::SheikLine({ - // obscure text - Text{ - "I overheard Ganondorf say that he misplaced the %yLight Arrows%w in %r", - /*french*/ - "J'ai entendu dire que Ganondorf aurait caché les %yFlèches de Lumière%w dans %r", - /*spanish*/ - ""}, - }); - + hintTextTable[RHT_WARP_SONG] = HintText(CustomMessage("Warp to&#[[1]]#?&" + TWO_WAY_CHOICE() + "#OK&No#", + /*german*/ "Zu&#[[1]]#?&" + TWO_WAY_CHOICE() + "#OK&No#", + /*french*/ "Se téléporter vers&#[[1]]#?&" + TWO_WAY_CHOICE() + "#OK!&Non#", + {QM_RED, QM_GREEN})); + /*-------------------------- - |MASTER SWORD LOCATION TEXT| + | STATIC LOCATION HINTS | ---------------------------*/ - hintTable[RHT_MASTER_SWORD_LOCATION_HINT] = HintText::MasterSword({ - // obscure text - Text{"And even if you do, you'll never find the legendary blade hidden in ", - /*french*/ - "Et même si tu les trouves, tu ne touveras jamais l'épée de légende cachée dans ", - /*spanish*/ - "E incluso si lo haces, nunca encontrarás la espada legendaria escondida en " }, - }); + hintTextTable[RHT_MEDIGORON_HINT] = HintText(CustomMessage("How about buying #[[1]]# for #200 Rupees#?&" + TWO_WAY_CHOICE() + "#Buy&Don't buy#", + /*german*/ "Möchtest du #[[1]]# für #200 Rubine# kaufen?&" + TWO_WAY_CHOICE() + "#Klar!&Nie im Leben!#", + /*french*/ "Veux-tu acheter #[[1]]# pour #200 rubis#?&" + TWO_WAY_CHOICE() + "#Acheter&Ne pas acheter#", + {QM_GREEN, QM_YELLOW, QM_GREEN})); + /*spanish*/ // ¿Me compras #[[1]]# por #200 rupias#?&" + TWO_WAY_CHOICE() + "#Comprar&No comprar# - hintTable[RHT_SHEIK_MASTER_SWORD_LOCATION_HINT] = HintText::SheikLine({ - // obscure text - Text{"He also stole %gthe Master Sword%w and hid it in %r", - /*french*/ - "Il aurait aussi volé %gl'épée de légende%w, qu'il aurait caché dans %r", - /*spanish*/ - "Él también robó %gla Espada Maestra%w y la escondió en %r" }, - }); + hintTextTable[RHT_CARPET_SALESMAN_DIALOG_FIRST] = HintText(CustomMessage("Welcome!^I am selling stuff, strange and rare, from all over the world to everybody. Today's special is...^", + /*german*/ "Sei gegrüßt!^Ich verkaufe allerlei Kuriorisäten. Stets sonderliche und seltene Ware aus " + "aller Welt für jedermann. Das heutige Angebot bleibt...^#", + /*french*/ "Bienvenue!^Je vends des objets rares et merveilleux du monde entier. En spécial aujourd'hui...^")); + /*spanish*/ // ¡Acércate!^Vendo productos extraños y difíciles de encontrar... De todo el mundo a todo el mundo. La oferta de hoy es...^#¡ - hintTable[RHT_YOUR_POCKET] = HintText::Exclude({ - // obscure text - Text{ "your pocket", /*french*/ "tes poches", /*spanish*/ "tu bolsillo" }, - }); + hintTextTable[RHT_CARPET_SALESMAN_DIALOG_MYSTERIOUS] = HintText(CustomMessage("Terrifying! I won't tell you what it is until I see the #money#...^How about #200 Rupees#?&&" + + TWO_WAY_CHOICE() + "#Buy&Don't buy#", + /*german*/ "Furchterregend oder? Ich erzähle Euch mehr, wenn ich #Geld# sehe...^Wie wär's mit #200 Rubinen#?&&" + + TWO_WAY_CHOICE() + "#Aber sicher!&Ich bin weg!#", + /*french*/ "Un concentré de puissance! Mais montre tes #rubis# avant que je te dise ce que c'est...^Disons #200 " + "rubis#?&&" + TWO_WAY_CHOICE() + "#Acheter&Ne pas acheter#", + {QM_RED, QM_YELLOW, QM_GREEN})); + /*spanish*/ // ¡Terrorífico! No te revelaré su nombre hasta que vea el #dinero#...^#200 rupias#, ¿qué te parece?&&" + + // TWO_WAY_CHOICE() + "#Comprar&No comprar# - /*-------------------------- - | OTHER HINT TEXT | - ---------------------------*/ + hintTextTable[RHT_CARPET_SALESMAN_DIALOG_HINTED] = HintText(CustomMessage("#[[1]]!# It's real, I promise! A lonely man such as myself wouldn't #lie# to you, hmm?^" + "How about #200 Rupees#?&&" + TWO_WAY_CHOICE() + "#Buy&Don't buy#", + /*german*/ "#[[1]]#! Ich kann versichern es ist ein aufrichtiges Angebot!^Ein einsamer Mann wie ich würde dich doch " + "nicht #anlügen#, oder?^Wie wär's mit #200 Rubinen#?&&" + TWO_WAY_CHOICE() + "#Aber sicher!&Ich bin weg!#", + /*french*/ "#[[1]]!# C'est vrai! J'te jure! Un gars comme moi ne te #mentirai# pas tu ne crois pas?^Disons #200 " + "rubis#?&&" + TWO_WAY_CHOICE() + "#Acheter&Ne pas acheter#", + {QM_GREEN, QM_YELLOW, QM_GREEN})); - hintTable[RHT_DAMPE_DIARY01] = HintText::OtherHint({ - // obscure text - Text{ - "Whoever reads this, please enter %r", - /*french*/ - "Toi qui lit ce journal, rends-toi dans %r", - /*german?*/ - "Wer immer dies liest, der möge folgenden Ort aufsuchen: %r"}, - }); + hintTextTable[RHT_BEAN_SALESMAN_HINT] = HintText(CustomMessage("I tried to be a #magic bean# salesman, but it turns out my marketing skills weren't worth " + "beans!^Anyway, want to buy #[[1]]# for #60 Rupees#?&" + TWO_WAY_CHOICE() + "#Yes&No#", + /*german*/ "Möchten Sie #[[1]]# für #60 Rubine#?&" + TWO_WAY_CHOICE() + "#Ja&Nein#", + /*french*/ "J'ai essayé d'être un vendeur de #haricots magiques#, mais j'étais mauvais au niveau du marketing et ça " + "me courait sur le haricot...^Enfin bref, ça te dirait de m'acheter #[[1]]# pour #60 Rubis#?&" + TWO_WAY_CHOICE() + "#Oui&Non#", + {QM_RED, QM_GREEN, QM_YELLOW, QM_GREEN})); - hintTable[RHT_DAMPE_DIARY02] = HintText::OtherHint({ - // obscure text - Text{ - "%w. I will let you have my stretching, shrinking keepsake.^I'm waiting for you.&--Dampé", - /*french*/ - "%w. Et peut-être auras-tu droit à mon précieux %rtrésor%w.^Je t'attends...&--Igor", - /*german?*/ - "%w. Ihm gebe ich meinen langen, kurzen Schatz.^Ich warte!&Boris"}, - }); + hintTextTable[RHT_GRANNY_HINT] = HintText(CustomMessage("#[[1]]#! How about #100 Rupees#?&" + TWO_WAY_CHOICE() + "#Buy&Don't buy#", + /*german*/ "#[[1]]#! Sagen wir #100 Rubine#!&" + TWO_WAY_CHOICE() + "#Gerne!&Auf keinen Fall!#", + /*french*/ "#[[1]]#! Que dis-tu de #100 rubis#?&" + TWO_WAY_CHOICE() + "#Acheter&Ne pas acheter#", + {QM_GREEN, QM_YELLOW, QM_GREEN}, {true})); + // /*spanish*/#[[1]]#. Vendo por #100 rupias#.&" + TWO_WAY_CHOICE() + "#Comprar&No comprar# - hintTable[RHT_GREG_HINT01] = HintText::OtherHint({ - // obscure text - Text{ - "By the way, if you're interested, I saw the shiniest %gGreen Rupee%w somewhere in%g ", - /*french*/ - "Au fait, si ça t'intéresse, j'ai aperçu le plus éclatant des %gRubis Verts%w quelque part à %g", - /*spanish*/ - ""}, - }); + hintTextTable[RHT_HBA_HINT_SIGN] = HintText(CustomMessage("#Horseback Archery# Range Prizes:&1000: #[[1]]#&1500: #[[2]]#^@'s Record: #" + CustomMessage::POINTS(HS_HORSE_ARCHERY) + "#", + {QM_RED, QM_GREEN, QM_GREEN, QM_GREEN}, {}, TEXTBOX_TYPE_WOODEN)); - hintTable[RHT_GREG_HINT02] = HintText::OtherHint({ - // obscure text - Text{ - "%w.^It's said to have %rmysterious powers%w...^But then, it could just be another regular rupee.&Oh well.", - /*french*/ - "%w. On dit qu'il possède des pouvoirs mystérieux... Mais bon, ça pourrait juste être un autre rubis ordinaire.", - /*spanish*/ - ""}, - }); + hintTextTable[RHT_HBA_HINT_NOT_ON_HORSE] = HintText(CustomMessage("Hey, rookie!&Come back on your #horse# and take on then #Horseback Archery# challenge!^" + "Impress me with a high score of 1000 to win a #[[1]]# or score 1500 for my #[[2]]#!", + {QM_RED, QM_RED, QM_GREEN, QM_GREEN})); - hintTable[RHT_SARIA_TEXT01] = HintText::OtherHint({ - // obscure text - Text{ - "Did you feel the %gsurge of magic%w recently? A mysterious bird told me it came from %g", - /*french*/ - "As-tu récemment ressenti une vague de %gpuissance magique%w? Un mystérieux hibou m'a dit qu'elle provenait du %g", - /*spanish*/ - ""}, - }); + hintTextTable[RHT_HBA_HINT_INITIAL] = HintText(CustomMessage("Hey, rookie!&Want to take on the #Horseback Archery# challenge?^" + "Impress me with a high score of 1000 to win a #[[1]]# or score 1500 for my #[[2]]#!\x0B", + {QM_RED, QM_GREEN, QM_GREEN})); - hintTable[RHT_SARIA_TEXT02] = HintText::OtherHint({ - // obscure text - Text{ - "%w.^You should check that place out, @!$C", - /*french*/ - "%w. Tu devrais aller y jeter un coup d'oeil, @!$C", - /*spanish*/ - "%w.$C"}, - }); + hintTextTable[RHT_HBA_HINT_HAVE_1000] = HintText(CustomMessage("Hey, newcomer!&Want to take on the #Horseback Archery# challenge?^" + "Prove yourself to be a horsemaster by scoring 1500 points to win my #[[1]]#!\x0B", + {QM_RED, QM_GREEN})); - hintTable[RHT_WARP_TO] = HintText::OtherHint({ - Text{ - "Warp to&#", - "Se téléporter vers&#", - "", - "Zu&#"}, - }); - hintTable[RHT_WARP_CHOICE] = HintText::OtherHint({ - Text{ - "#?&" + TWO_WAY_CHOICE() + "#OK&No#", - "#?&" + TWO_WAY_CHOICE() + "#OK!&Non#", - "###", - "#?&" + TWO_WAY_CHOICE() + "#OK&No#" - } - }); + hintTextTable[RHT_MALON_HINT_HOW_IS_EPONA] = HintText(CustomMessage("@! You should come back with Epona and try to beat my time on the #Obsticle Course#!^" + "If you beat my time, I'll give you my favourite #cow# Elsie and her toy #[[1]]#!", + {QM_RED, QM_BLUE, QM_GREEN})); - hintTable[RHT_FROGS_HINT01] = HintText::OtherHint({Text{ - "Some frogs holding #", - "Des grenouilles se trouvant sous l'eau vous fixent attentivement, tenant fermement #", - "", - "Unter Wasser gibt es Frösche, die #" - }}); - hintTable[RHT_FROGS_HINT02] = HintText::OtherHint({Text{ - "# are looking at you from underwater...", - "#.", - "", - "# bei sich haben und Dich neugierig beobachten..." - }}); + hintTextTable[RHT_MALON_HINT_OBSTICLE_COURSE] = HintText(CustomMessage("How about trying the #Obsticle Course?# If you beat my time I'll let you keep my favourite #cow# Elsie and her toy #[[1]]#!^" + "Challenge the #Obsticle Course?#&\x1B&#Let's go&No thanks#", + {QM_RED, QM_BLUE, QM_GREEN, QM_RED, QM_GREEN})); - hintTable[RHT_FISHING_POLE_HINT01] = HintText::OtherHint({ - // obscure text - Text{"^If I remember correctly, I lost it somewhere in %r", - /*french*/ - "", - /*spanish*/ - "" } - }); + hintTextTable[RHT_MALON_HINT_TURNING_EVIL] = HintText(CustomMessage("@? Is that you? ^If I ran the ranch, I'd build an #Obsticle Course#, and whoever gets the best time would win a #cow#!^" + "Elsie loves sharing her #[[1]]# with new people, It'll be fun!^...But Ingo won't let me...", + {QM_RED, QM_BLUE, QM_GREEN})); - hintTable[RHT_FISHING_POLE_HINT02] = HintText::OtherHint({ - // obscure text - Text{"%w...&Let me know if you find it!", - /*french*/ - "", - /*spanish*/ - "" } - }); + hintTextTable[RHT_MALON_HINT_INGO_TEMPTED] = HintText(CustomMessage("@! You should come back in the morning and try to beat my time on the #Obsticle Course#!^" + "If you beat my time, I'll give you my favourite #cow# Elsie and her toy #[[1]]#!", + {QM_RED, QM_BLUE, QM_GREEN})); + + hintTextTable[RHT_CHICKENS_HINT] = HintText(CustomMessage("You! Please!&Bring my Cucco's back to my pen!&I'll give you my #[[1]]#!", + {QM_GREEN})); + + hintTextTable[RHT_BIG_POES_HINT] = HintText(CustomMessage("You have #\x1E\x01 Poe Points#! Reach 1000 and you'll get a #[[1]]#!", + {QM_YELLOW, QM_GREEN})); + + hintTextTable[RHT_BIGGORON_HINT] = HintText(CustomMessage("Arrrrrre you here to claim my finest #[[1]]#? Shoooooow me your #Claim Check#.", + {QM_GREEN, QM_RED})); + + hintTextTable[RHT_FROGS_HINT] = HintText(CustomMessage("Some frogs holding #[[1]]# are looking at you from underwater...", + /*german*/ "Unter Wasser gibt es Frösche, die #[[1]]# bei sich haben und Dich neugierig beobachten...", + /*french*/ "Des grenouilles se trouvant sous l'eau vous fixent attentivement, tenant fermement #[[1]]#.", + {QM_GREEN})); + + hintTextTable[RHT_SKULLS_HINT] = HintText(CustomMessage("Yeaaarrgh! I'm cursed!!^Please save me by destroying #[[d]] Spiders of the Curse# and I will give you my #[[1]]#!", + /*german*/ "Yeaaarrgh! Ich bin verflucht!^Bitte rette mich, indem du #[[d]] Skulltulas# zerstörst und ich werde dir dafür #[[1]]# geben!", + /*french*/ "Yeaaarrgh! Je suis maudit!^Détruit encore #[[d]] Araignées de la Malédiction# et j'aurai quelque chose à te donner! #([[1]])#", + {QM_YELLOW, QM_GREEN})); /*-------------------------- | GANON LINE TEXT | ---------------------------*/ - hintTable[RHT_GANON_LINE01] = HintText::GanonLine({ - // obscure text - Text{ "Oh! It's @.&I was expecting someone called Sheik.&Do you know what happened to them?", - /*french*/ "Ah, c'est @.&J'attendais un certain Sheik.&Tu sais ce qui lui est arrivé?", - /*spanish*/ - "¡Oh! Pero si es @.&Estaba esperando a alguien llamado Sheik. ¿Sabes qué puede haberle pasado?" }, - }); + hintTextTable[RHT_GANON_JOKE01] = HintText(CustomMessage("Oh! It's @.&I was expecting someone called Sheik.&Do you know what happened to them?", + /*german*/ "", + /*french*/ "Ah, c'est @.&J'attendais un certain Sheik.&Tu sais ce qui lui est arrivé?")); + // /*spanish*/¡Oh! Pero si es @.&Estaba esperando a alguien llamado Sheik. ¿Sabes qué puede haberle pasado? - hintTable[RHT_GANON_LINE02] = HintText::GanonLine({ - // obscure text - Text{ "I knew I shouldn't have put the key on the other side of my door.", - /*french*/ "J'aurais dû garder la clé ici. Hélas...", - /*spanish*/ "Sabía que no tendría que haber dejado la llave al otro lado de la puerta." }, - }); + hintTextTable[RHT_GANON_JOKE02] = HintText(CustomMessage("I knew I shouldn't have put the key on the other side of my door.", + /*german*/ "", + /*french*/ "J'aurais dû garder la clé ici. Hélas...")); + // /*spanish*/Sabía que no tendría que haber dejado la llave al otro lado de la puerta. - hintTable[RHT_GANON_LINE03] = HintText::GanonLine({ - // obscure text - Text{ "Looks like it's time for a round of tennis.", - /*french*/ "C'est l'heure de jouer au tennis.", - /*spanish*/ "Parece que es hora de una pachanga de tenis." }, - }); + hintTextTable[RHT_GANON_JOKE03] = HintText(CustomMessage("Looks like it's time for a round of tennis.", + /*german*/ "", + /*french*/ "C'est l'heure de jouer au tennis.")); + // /*spanish*/Parece que es hora de una pachanga de tenis. - hintTable[RHT_GANON_LINE04] = HintText::GanonLine({ - // obscure text - Text{ "You'll never deflect my bolts of energy with your sword, then shoot me with those Light Arrows you " - "happen to have.", - /*french*/ - "Ne perds pas ton temps à frapper mes éclairs d'énergie avec ton épée et me tirer avec tes flèches de " - "Lumière!", - /*spanish*/ - "Nunca reflejarás mis esferas de energía con tu espada, para después dispararme con las flechas de luz " - "que tendrás." }, - }); + hintTextTable[RHT_GANON_JOKE04] = HintText(CustomMessage("You'll never deflect my bolts of energy with your sword, then shoot me with those Light Arrows you happen to have.", + /*german*/ "", + /*french*/ "Ne perds pas ton temps à frapper mes éclairs d'énergie avec ton épée et me tirer avec tes flèches de Lumière!")); + // /*spanish*/Nunca reflejarás mis esferas de energía con tu espada, para después dispararme con las flechas de luz que tendrás. - hintTable[RHT_GANON_LINE05] = HintText::GanonLine({ - // obscure text - Text{ "Why did I leave my trident back in the desert?", - /*french*/ "Sale bêtise... Et j'ai oublié mon trident dans le désert!", - /*spanish*/ "Santa Hylia... ¿Por qué me habré dejado el tridente en el desierto?" }, - }); + hintTextTable[RHT_GANON_JOKE05] = HintText(CustomMessage("Why did I leave my trident back in the desert?", + /*german*/ "", + /*french*/ "Sale bêtise... Et j'ai oublié mon trident dans le désert!")); + // /*spanish*/Santa Hylia... ¿Por qué me habré dejado el tridente en el desierto? - hintTable[RHT_GANON_LINE06] = HintText::GanonLine({ - // obscure text - Text{ "Zelda is probably going to do something stupid, like send you back to your own timeline.^So this is " - "quite meaningless. Do you really want to save this moron?", - /*french*/ - "Même si je suis vaincu... Zelda te renverra dans ton ère, et je reviendrai conquérir!^Telle est la " - "prophécie d'Hyrule Historia!", - /*spanish*/ - "Seguro que Zelda trata de hacer alguna tontería, como enviarte de vuelta a tu línea temporal.^No tiene " - "ningún sentido alguno. ¿De verdad quieres salvar a esa tonta?" }, - }); + hintTextTable[RHT_GANON_JOKE06] = HintText(CustomMessage("Zelda is probably going to do something stupid, like send you back to your own timeline.^So this is " + "quite meaningless. Do you really want to save this moron?", + /*german*/ "", + /*french*/ "Même si je suis vaincu... Zelda te renverra dans ton ère, et je reviendrai conquérir!^Telle est la " + "prophécie d'Hyrule Historia!")); + // /*spanish*/Seguro que Zelda trata de hacer alguna tontería, como enviarte de vuelta a tu línea temporal.^No tiene + // ningún sentido alguno. ¿De verdad quieres salvar a esa tonta? - hintTable[RHT_GANON_LINE07] = HintText::GanonLine({ - // obscure text - Text{ "What about Zelda makes you think&she'd be a better ruler than I?^I saved Lon Lon Ranch,&fed the " - "hungry,&and my castle floats.", - /*french*/ - "Zelda ne sera jamais un meilleur monarque que moi!^J'ai un château volant, mes sujets sont des belles " - "amazones... et mes Moblins sont clairement plus puissants que jamais!", - /*spanish*/ - "¿Qué te hace pensar que Zelda gobierna mejor que yo?^Yo he salvado el Rancho Lon Lon,&he alimentado a " - "los hambrientos&y hasta hago que mi castillo flote." }, - }); + hintTextTable[RHT_GANON_JOKE07] = HintText(CustomMessage("What about Zelda makes you think&she'd be a better ruler than I?^I saved Lon Lon Ranch,&fed the " + "hungry,&and my castle floats.", + /*german*/ "", + /*french*/ "Zelda ne sera jamais un meilleur monarque que moi!^J'ai un château volant, mes sujets sont des belles " + "amazones... et mes Moblins sont clairement plus puissants que jamais!")); + // /*spanish*/¿Qué te hace pensar que Zelda gobierna mejor que yo?^Yo he salvado el Rancho Lon Lon,&he alimentado a + // los hambrientos&y hasta hago que mi castillo flote. - hintTable[RHT_GANON_LINE08] = HintText::GanonLine({ - // obscure text - Text{ "I've learned this spell,&it's really neat,&I'll keep it later&for your treat!", - /*french*/ - "Gamin, ton destin achève,&sous mon sort tu périras!&Cette partie ne fut pas brève,&et cette mort, tu " - "subiras!", - /*spanish*/ - "Veamos ahora que harás,&la batalla ha de comenzar,&te enviaré de una vez al más allá,&¿listo para " - "afrontar la verdad?" }, - }); + hintTextTable[RHT_GANON_JOKE08] = HintText(CustomMessage("I've learned this spell,&it's really neat,&I'll keep it later&for your treat!", + /*german*/ "", + /*french*/ "Gamin, ton destin achève,&sous mon sort tu périras!&Cette partie ne fut pas brève,&et cette mort, tu subiras!")); + // /*spanish*/Veamos ahora que harás,&la batalla ha de comenzar,&te enviaré de una vez al más allá,&¿listo para + // afrontar la verdad? - hintTable[RHT_GANON_LINE09] = HintText::GanonLine({ - // obscure text - Text{ "Many tricks are up my sleeve,&to save yourself&you'd better leave!", - /*french*/ "Sale petit garnement,&tu fais erreur!&C'est maintenant que marque&ta dernière heure!", - /*spanish*/ "¿No osarás a mí enfrentarte?&Rimas aparte,&¡voy a matarte!" }, - }); + hintTextTable[RHT_GANON_JOKE09] = HintText(CustomMessage("Many tricks are up my sleeve,&to save yourself&you'd better leave!", + /*german*/ "", + /*french*/ "Sale petit garnement,&tu fais erreur!&C'est maintenant que marque&ta dernière heure!")); + // /*spanish*/¿No osarás a mí enfrentarte?&Rimas aparte,&¡voy a matarte! - hintTable[RHT_GANON_LINE10] = HintText::GanonLine({ - // obscure text - Text{ "After what you did to Koholint Island, how can you call me the bad guy?", - /*french*/ "J'admire ce que tu as fait à l'Île Koholint... Toi et moi, nous devrions faire équipe!", - /*spanish*/ "Después de lo que le hiciste a la Isla Koholint, ¿cómo te atreves a llamarme malvado?" }, - }); + hintTextTable[RHT_GANON_JOKE10] = HintText(CustomMessage("After what you did to Koholint Island, how can you call me the bad guy?", + /*german*/ "", + /*french*/ "J'admire ce que tu as fait à l'Île Koholint... Toi et moi, nous devrions faire équipe!")); + // /*spanish*/Después de lo que le hiciste a la Isla Koholint, ¿cómo te atreves a llamarme malvado? - hintTable[RHT_GANON_LINE11] = HintText::GanonLine({ - // obscure text - Text{ "Today, let's begin down&'The Hero is Defeated' timeline.", - /*french*/ - "Si tu me vaincs, Hyrule sera englouti... mais si tu meurs, on aura A Link to the Past, le meilleur opus " - "de la série!", - /*spanish*/ - "Hoy daremos lugar a la línea temporal del Héroe Derrotado.&¡Prepárate para el culmen de esta saga!" }, - }); + hintTextTable[RHT_GANON_JOKE10] = HintText(CustomMessage("Today, let's begin down&'The Hero is Defeated' timeline.", + /*german*/ "", + /*french*/ "Si tu me vaincs, Hyrule sera englouti... mais si tu meurs, on aura A Link to the Past, le meilleur opus " + "de la série!")); + // /*spanish*/Hoy daremos lugar a la línea temporal del Héroe Derrotado.&¡Prepárate para el culmen de esta saga! - /*-------------------------- - | MERCHANTS' ITEMS | - ---------------------------*/ + /*-------------------------- + | Misc utilities | + ---------------------------*/ + + hintTextTable[RHT_YOUR_POCKET] = HintText(CustomMessage("your pocket", + /*german*/ "", + /*french*/ "tes poches")); + // /*spanish*/tu bolsillo - hintTable[RHT_BEAN_SALESMAN_FIRST] = HintText::MerchantsDialogs({ - Text{ - "I tried to be a #magic bean#&salesman, but it turns out my&marketing skills weren't worth&" - "beans!^Anyway, want to buy #", - /*french*/ "J'ai essayé d'être un vendeur&de #haricots magiques#, mais&j'étais mauvais au niveau du&marketing et ça " - "me courait sur&le haricot...^Enfin bref, ça te dirait de m'acheter #", - /*spanish*/ "", - /*german*/ "Möchten Sie #" - } - }); - hintTable[RHT_BEAN_SALESMAN_SECOND] = HintText::MerchantsDialogs({ - Text{ - "# for #60 Rupees#?&" + TWO_WAY_CHOICE() + "#Yes&No#", - /*french*/ "# pour #60 Rubis#?&" + TWO_WAY_CHOICE() + "#Oui&Non#", - /*spanish*/ "", - /*german*/ "# für #60 Rubine#?&" + TWO_WAY_CHOICE() + "#Ja&Nein#" - } - }); + hintTextTable[RHT_DUNGEON_ORDINARY] = HintText(CustomMessage(" It's ordinary.", + /*german*/ "&Sieht aus wie immer.", + /*french*/ "&Elle vous semble %rordinaire%w.")); - hintTable[RHT_MEDIGORON_DIALOG_FIRST] = HintText::MerchantsDialogs({ - // obscure text - Text{ "How about buying #", - /*french*/ "Veux-tu acheter #", - /*spanish*/ "¿Me compras #", - /*german*/ "Möchtest du #" }, - }); + hintTextTable[RHT_DUNGEON_MASTERFUL] = HintText(CustomMessage(" It's masterful!", + /*german*/ "&Man kann darauf die Worte&%r\"Master Quest\"%w entziffern...", + /*french*/ "&Étrange... les mots %r\"Master&Quest\"%w sont gravés dessus.")); - hintTable[RHT_MEDIGORON_DIALOG_SECOND] = HintText::MerchantsDialogs({ - // obscure text - Text{ "# for #200 Rupees#?&" + TWO_WAY_CHOICE() + "#Buy&Don't buy#", - /*french*/ "# pour #200 rubis#?&" + TWO_WAY_CHOICE() + "#Acheter&Ne pas acheter#", - /*spanish*/ "# por #200 rupias#?&" + TWO_WAY_CHOICE() + "#Comprar&No comprar#", - /*german*/ "# für #200 Rubine# kaufen?&" + TWO_WAY_CHOICE() + "#Klar!&Nie im Leben!#" }, - }); - - hintTable[RHT_CARPET_SALESMAN_DIALOG_FIRST] = HintText::MerchantsDialogs({ - // obscure text - Text{ "Welcome!^I am selling stuff, strange and rare, from all over the world to everybody. Today's special " - "is...^#", - /*french*/ - "Bienvenue!^Je vends des objets rares et merveilleux du&monde entier. En spécial aujourd'hui...^#", - /*spanish*/ - "¡Acércate!^Vendo productos extraños y difíciles de&encontrar... De todo el mundo a todo el&mundo. La " - "oferta de hoy es...^#¡", - /* german */ - "Sei gegrüßt!^Ich verkaufe allerlei Kuriorisäten.&Stets sonderliche und seltene Ware&aus " - "aller Welt für jedermann.&Das heutige Angebot bleibt...^#" }, - }); - - hintTable[RHT_CARPET_SALESMAN_DIALOG_MYSTERIOUS] = HintText::MerchantsDialogs({ - // obscure text - Text{ "!# Terrifying! I won't tell you what it is until I see the #money#...^How about #200 Rupees#?&&" + - TWO_WAY_CHOICE() + "#Buy&Don't buy#", - /*french*/ - "!# Un concentré de puissance! Mais montre tes #rubis# avant que je te dise ce que c'est...^Disons #200 " - "rubis#?&&" + - TWO_WAY_CHOICE() + "#Acheter&Ne pas acheter#", - /*spanish*/ - "!# ¡Terrorífico! No te revelaré su nombre hasta que vea el #dinero#...^#200 rupias#, ¿qué te parece?&&" + - TWO_WAY_CHOICE() + "#Comprar&No comprar#", - /*german*/ - "!# Furchterregend oder? Ich erzähle Euch mehr, wenn ich #Geld# sehe...^Wie wär's mit #200 Rubinen#?&&" + - TWO_WAY_CHOICE() + "#Aber sicher!&Ich bin weg!#" }, - }); - - hintTable[RHT_CARPET_SALESMAN_DIALOG_HINTED] = HintText::MerchantsDialogs({ - // obscure text - Text{ "!# It's real, I promise! A lonely man such as myself wouldn't #lie# to you, hmm?^" - "How about #200 Rupees#?&&" + TWO_WAY_CHOICE() + "#Buy&Don't buy#", - /*french*/ - "!# C'est vrai! J'te jure! Un gars comme moi ne te #mentirai# pas tu ne crois pas?^Disons #200 " - "rubis#?&&" + TWO_WAY_CHOICE() + "#Acheter&Ne pas acheter#", - /*spanish*/ // TODO: Flesh this out with the flavor text if we ever support spanish translations - "#!^###200 rupias#, ¿qué te parece?&&" + TWO_WAY_CHOICE() + "#Comprar&No comprar#", - /*german*/ - "#! Ich kann versichern es ist ein aufrichtiges Angebot!^Ein einsamer Mann wie ich würde dich doch " - "nicht #anlügen#, oder?^Wie wär's mit #200 Rubinen#?&&" + TWO_WAY_CHOICE() + - "#Aber sicher!&Ich bin weg!#" }, - }); - - hintTable[RHT_CARPET_SALESMAN_DIALOG_FINAL] = HintText::MerchantsDialogs({ - // obscure text - Text{ "Finally! Now I can go back to being &an %rarms dealer%w!", - /*french*/ "Squalala! Je vais enfin pouvoir &%rprendre des vacances%w!", - /*spanish*/ "", // TODO: Flesh this out with the flavor text if we ever support spanish translations - /*german*/ "Endlich! Schon bald kann ich wieder &%rKrabbelminen-Händler%w sein!" }, - }); - - hintTable[RHT_GRANNY_DIALOG] = HintText::MerchantsDialogs({ - // obscure text - Text{ "! How about #100 Rupees#?&" + TWO_WAY_CHOICE() + "#Buy&Don't buy#", - /*french*/ "! Que dis-tu de #100 rubis#?&" + TWO_WAY_CHOICE() + "#Acheter&Ne pas acheter#", - /*spanish*/ ". Vendo por #100 rupias#.&" + TWO_WAY_CHOICE() + "#Comprar&No comprar#", - /*german*/ "! Sagen wir #100 Rubine#!&" + TWO_WAY_CHOICE() + "#Gerne!&Auf keinen Fall!#" }, - }); } - -int32_t StonesRequiredBySettings() { - auto ctx = Rando::Context::GetInstance(); - int32_t stones = 0; - if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_STONES)) { - stones = std::max({ stones, (int32_t)ctx->GetOption(RSK_RAINBOW_BRIDGE_STONE_COUNT).Value() }); - } - if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_DUNGEON_REWARDS)) { - stones = std::max({ stones, (int32_t)ctx->GetOption(RSK_RAINBOW_BRIDGE_REWARD_COUNT).Value() - 6 }); - } - if ((ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_DUNGEONS)) && (ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_END_OF_DUNGEON))) { - stones = std::max({ stones, (int32_t)ctx->GetOption(RSK_RAINBOW_BRIDGE_DUNGEON_COUNT).Value() - 6 }); - } - if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_STONES)) { - stones = std::max({ stones, (int32_t)ctx->GetOption(RSK_LACS_STONE_COUNT).Value() }); - } - if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_STONES)) { - stones = std::max({ stones, (int32_t)ctx->GetOption(RSK_LACS_REWARD_COUNT).Value() - 6 }); - } - if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_DUNGEONS)) { - stones = std::max({ stones, (int32_t)ctx->GetOption(RSK_LACS_DUNGEON_COUNT).Value() - 6 }); - } - return stones; -} - -int32_t MedallionsRequiredBySettings() { - auto ctx = Rando::Context::GetInstance(); - int32_t medallions = 0; - if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_MEDALLIONS)) { - medallions = std::max({ medallions, (int32_t)ctx->GetOption(RSK_RAINBOW_BRIDGE_MEDALLION_COUNT).Value() }); - } - if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_DUNGEON_REWARDS)) { - medallions = std::max({ medallions, (int32_t)ctx->GetOption(RSK_RAINBOW_BRIDGE_REWARD_COUNT).Value() - 3 }); - } - if ((ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_DUNGEONS)) && (ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_END_OF_DUNGEON))) { - medallions = std::max({ medallions, (int32_t)ctx->GetOption(RSK_RAINBOW_BRIDGE_DUNGEON_COUNT).Value() - 3 }); - } - if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_MEDALLIONS)) { - medallions = std::max({ medallions, (int32_t)ctx->GetOption(RSK_LACS_MEDALLION_COUNT).Value() }); - } - if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_REWARDS)) { - medallions = std::max({ medallions, (int32_t)ctx->GetOption(RSK_LACS_REWARD_COUNT).Value() - 3 }); - } - if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_DUNGEONS)) { - medallions = std::max({ medallions, (int32_t)ctx->GetOption(RSK_LACS_DUNGEON_COUNT).Value() - 3 }); - } - return medallions; -} - -int32_t TokensRequiredBySettings() { - auto ctx = Rando::Context::GetInstance(); - int32_t tokens = 0; - if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_TOKENS)) { - tokens = std::max({ tokens, (int32_t)ctx->GetOption(RSK_RAINBOW_BRIDGE_TOKEN_COUNT).Value() }); - } - if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_TOKENS)) { - tokens = std::max({ tokens, (int32_t)ctx->GetOption(RSK_LACS_TOKEN_COUNT).Value() }); - } - return tokens; -} - -std::array AreaHintTextKeys = { - RHT_NONE, - RHT_LINKS_POCKET, - RHT_KOKIRI_FOREST, - RHT_THE_LOST_WOODS, - RHT_SACRED_FOREST_MEADOW, - RHT_HYRULE_FIELD, - RHT_LAKE_HYLIA, - RHT_GERUDO_VALLEY, - RHT_GERUDO_FORTRESS, - RHT_HAUNTED_WASTELAND, - RHT_DESERT_COLOSSUS, - RHT_THE_MARKET, - RHT_TEMPLE_OF_TIME, - RHT_HYRULE_CASTLE, - RHT_OUTSIDE_GANONS_CASTLE, - RHT_CASTLE_GROUNDS, - RHT_KAKARIKO_VILLAGE, - RHT_THE_GRAVEYARD, - RHT_DEATH_MOUNTAIN_TRAIL, - RHT_GORON_CITY, - RHT_DEATH_MOUNTAIN_CRATER, - RHT_ZORAS_RIVER, - RHT_ZORAS_DOMAIN, - RHT_ZORAS_FOUNTAIN, - RHT_LON_LON_RANCH, - RHT_DEKU_TREE, - RHT_DODONGOS_CAVERN, - RHT_JABU_JABUS_BELLY, - RHT_FOREST_TEMPLE, - RHT_FIRE_TEMPLE, - RHT_WATER_TEMPLE, - RHT_SPIRIT_TEMPLE, - RHT_SHADOW_TEMPLE, - RHT_BOTTOM_OF_THE_WELL, - RHT_ICE_CAVERN, - RHT_GERUDO_TRAINING_GROUND, - RHT_GANONS_CASTLE -}; - -std::array conditionalAlwaysHints = { - std::make_pair(RC_MARKET_10_BIG_POES, - []() { - auto ctx = Rando::Context::GetInstance(); - return ctx->GetOption(RSK_BIG_POE_COUNT).Value() >= 3 && !ctx->GetOption(RSK_BIG_POES_HINT); - }), // Remember, the option's value being 3 means 4 are required - std::make_pair(RC_DEKU_THEATER_MASK_OF_TRUTH, - []() { - auto ctx = Rando::Context::GetInstance(); - return !ctx->GetOption(RSK_COMPLETE_MASK_QUEST); - }), - std::make_pair(RC_SONG_FROM_OCARINA_OF_TIME, []() { return StonesRequiredBySettings() < 2; }), - std::make_pair(RC_HF_OCARINA_OF_TIME_ITEM, []() { return StonesRequiredBySettings() < 2; }), - std::make_pair(RC_SHEIK_IN_KAKARIKO, []() { return MedallionsRequiredBySettings() < 5; }), - std::make_pair(RC_DMT_TRADE_CLAIM_CHECK, - []() { - auto ctx = Rando::Context::GetInstance(); - return !ctx->GetOption(RSK_BIGGORON_HINT); - }), - std::make_pair(RC_KAK_30_GOLD_SKULLTULA_REWARD, - []() { - auto ctx = Rando::Context::GetInstance(); - return TokensRequiredBySettings() < 30 && !ctx->GetOption(RSK_KAK_30_SKULLS_HINT); - }), - std::make_pair(RC_KAK_40_GOLD_SKULLTULA_REWARD, - []() { - auto ctx = Rando::Context::GetInstance(); - return TokensRequiredBySettings() < 40 && !ctx->GetOption(RSK_KAK_40_SKULLS_HINT); - }), - std::make_pair(RC_KAK_50_GOLD_SKULLTULA_REWARD, - []() { - auto ctx = Rando::Context::GetInstance(); - return TokensRequiredBySettings() < 50 && !ctx->GetOption(RSK_KAK_50_SKULLS_HINT); - }), - std::make_pair(RC_ZR_FROGS_OCARINA_GAME, - []() { - auto ctx = Rando::Context::GetInstance(); - return !ctx->GetOption(RSK_FROGS_HINT); - }), - std::make_pair(RC_KF_LINKS_HOUSE_COW, - []() { - auto ctx = Rando::Context::GetInstance(); - return !ctx->GetOption(RSK_MALON_HINT); - }), - std::make_pair(RC_KAK_100_GOLD_SKULLTULA_REWARD, - []() { - auto ctx = Rando::Context::GetInstance(); - return !ctx->GetOption(RSK_KAK_100_SKULLS_HINT); - }), -}; - -const HintText& Hint(const RandomizerHintTextKey hintKey) { - return hintTable[hintKey]; -} - -const HintText& Hint(const RandomizerArea area) { - return hintTable[AreaHintTextKeys[area]]; -} - -std::vector GetHintCategory(HintCategory category) { - - std::vector hintsInCategory = {}; - - for (const auto& hint : hintTable) { - if (hint.GetType() == category) { - hintsInCategory.push_back(hint); - } - } - return hintsInCategory; } diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list.hpp b/soh/soh/Enhancements/randomizer/3drando/hint_list.hpp deleted file mode 100644 index 69e66e6db..000000000 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list.hpp +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once - -#include "hints.hpp" - -#include - -extern std::array hintTable; - -void HintTable_Init(); -const HintText& Hint(const RandomizerHintTextKey hintKey); -const HintText& Hint(const RandomizerArea area); -std::vector GetHintCategory(HintCategory category); - -void HintTable_Init_Item(); -void HintTable_Init_Exclude_Overworld(); -void HintTable_Init_Exclude_Dungeon(); \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp index 934a8f56c..b86b8f33e 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp @@ -1,1964 +1,1999 @@ -#include "../hint_list.hpp" +#include "../../static_data.h" +#include "../hints.hpp" +#include "../../../custom-message/CustomMessageManager.h" -void HintTable_Init_Exclude_Dungeon() { +namespace Rando { +void StaticData::HintTable_Init_Exclude_Dungeon() { /*-------------------------- | DEKU TREE | ---------------------------*/ - hintTable[RHT_DEKU_TREE_MAP_CHEST] = HintText::Exclude({ - //obscure text - Text{"in the #center of the Deku Tree# lies", /*french*/"#le coeur de l'Arbre Mojo# recèle", /*spanish*/"al #centro del Gran Árbol Deku# yace"}, - }); + hintTextTable[RHT_DEKU_TREE_MAP_CHEST] = HintText(CustomMessage("They say that in the #center of the Deku Tree# lies #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #le coeur de l'Arbre Mojo# recèle #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, al #centro del Gran Árbol Deku# yace #[[1]]#. - hintTable[RHT_DEKU_TREE_SLINGSHOT_CHEST] = HintText::Exclude({ - //obscure text - Text{"the #treasure guarded by a scrub# in the Deku Tree is", /*french*/"le #trésor protégé par une peste# dans l'Arbre Mojo est", /*spanish*/"un #deku del Gran Árbol Deku# esconde"}, - }); + hintTextTable[RHT_DEKU_TREE_SLINGSHOT_CHEST] = HintText(CustomMessage("They say that the #treasure guarded by a scrub# in the Deku Tree is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #trésor protégé par une peste# dans l'Arbre Mojo est #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #deku del Gran Árbol Deku# esconde #[[1]]#. - hintTable[RHT_DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST] = HintText::Exclude({ - //obscure text - Text{"the #treasure guarded by a scrub# in the Deku Tree is", /*french*/"le #trésor protégé par une peste# dans l'Arbre Mojo est", /*spanish*/"un #deku del Gran Árbol Deku# esconde"}, - }); + hintTextTable[RHT_DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST] = HintText(CustomMessage("They say that the #treasure guarded by a scrub# in the Deku Tree is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #trésor protégé par une peste# dans l'Arbre Mojo est #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #deku del Gran Árbol Deku# esconde #[[1]]#. - hintTable[RHT_DEKU_TREE_COMPASS_CHEST] = HintText::Exclude({ - //obscure text - Text{"#pillars of wood# in the Deku Tree lead to", /*french*/"les #piliers de bois# dans l'Arbre Mojo indiquent", /*spanish*/"los #salientes del Gran Árbol Deku# conducen a"}, - }); + hintTextTable[RHT_DEKU_TREE_COMPASS_CHEST] = HintText(CustomMessage("They say that #pillars of wood# in the Deku Tree lead to #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #piliers de bois# dans l'Arbre Mojo indiquent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, los #salientes del Gran Árbol Deku# conducen a #[[1]]#. - hintTable[RHT_DEKU_TREE_COMPASS_ROOM_SIDE_CHEST] = HintText::Exclude({ - //obscure text - Text{"#pillars of wood# in the Deku Tree lead to", /*french*/"les #piliers de bois# dans l'Arbre Mojo indiquent", /*spanish*/"los #salientes del Gran Árbol Deku# conducen a"}, - }); + hintTextTable[RHT_DEKU_TREE_COMPASS_ROOM_SIDE_CHEST] = HintText(CustomMessage("They say that #pillars of wood# in the Deku Tree lead to #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #piliers de bois# dans l'Arbre Mojo indiquent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, los #salientes del Gran Árbol Deku# conducen a #[[1]]#. - hintTable[RHT_DEKU_TREE_BASEMENT_CHEST] = HintText::Exclude({ - //obscure text - Text{"#webs in the Deku Tree# hide", /*french*/"les #toiles dans l'Arbre Mojo# cachent", /*spanish*/"entre #telarañas del Gran Árbol Deku# yace"}, - }); + hintTextTable[RHT_DEKU_TREE_BASEMENT_CHEST] = HintText(CustomMessage("They say that #webs in the Deku Tree# hide #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #toiles dans l'Arbre Mojo# cachent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, entre #telarañas del Gran Árbol Deku# yace #[[1]]#. + hintTextTable[RHT_DEKU_TREE_MQ_MAP_CHEST] = HintText(CustomMessage("They say that in the #center of the Deku Tree# lies #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #le coeur de l'Arbre Mojo# recèle #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, al #centro del Gran Árbol Deku# yace #[[1]]#. - hintTable[RHT_DEKU_TREE_MQ_MAP_CHEST] = HintText::Exclude({ - //obscure text - Text{"in the #center of the Deku Tree# lies", /*french*/"#le coeur de l'Arbre Mojo# recèle", /*spanish*/"al #centro del Gran Árbol Deku# yace"}, - }); + hintTextTable[RHT_DEKU_TREE_MQ_COMPASS_CHEST] = HintText(CustomMessage("They say that a #treasure guarded by a large spider# in the Deku Tree is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #trésor protégé par une grosse araignée# dans l'Arbre Mojo est #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #gran araña del Gran Árbol Deku# esconde #[[1]]#. - hintTable[RHT_DEKU_TREE_MQ_COMPASS_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #treasure guarded by a large spider# in the Deku Tree is", /*french*/"le #trésor protégé par une grosse araignée# dans l'Arbre Mojo est", /*spanish*/"una #gran araña del Gran Árbol Deku# esconde"}, - }); + hintTextTable[RHT_DEKU_TREE_MQ_SLINGSHOT_CHEST] = HintText(CustomMessage("They say that #pillars of wood# in the Deku Tree lead to #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #piliers de bois# dans l'Arbre Mojo indiquent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, los #salientes del Gran Árbol Deku# conducen a #[[1]]#. - hintTable[RHT_DEKU_TREE_MQ_SLINGSHOT_CHEST] = HintText::Exclude({ - //obscure text - Text{"#pillars of wood# in the Deku Tree lead to", /*french*/"les #piliers de bois# dans l'Arbre Mojo indiquent", /*spanish*/"los #salientes del Gran Árbol Deku# conducen a"}, - }); + hintTextTable[RHT_DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST] = HintText(CustomMessage("They say that #pillars of wood# in the Deku Tree lead to #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #piliers de bois# dans l'Arbre Mojo indiquent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, los #salientes del Gran Árbol Deku# conducen a #[[1]]#. - hintTable[RHT_DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST] = HintText::Exclude({ - //obscure text - Text{"#pillars of wood# in the Deku Tree lead to", /*french*/"les #piliers de bois# dans l'Arbre Mojo indiquent", /*spanish*/"los #salientes del Gran Árbol Deku# conducen a"}, - }); + hintTextTable[RHT_DEKU_TREE_MQ_BASEMENT_CHEST] = HintText(CustomMessage("They say that #webs in the Deku Tree# hide #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #toiles dans l'Arbre Mojo# cachent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, entre #telarañas del Gran Árbol Deku# yace #[[1]]#. - hintTable[RHT_DEKU_TREE_MQ_BASEMENT_CHEST] = HintText::Exclude({ - //obscure text - Text{"#webs in the Deku Tree# hide", /*french*/"les #toiles dans l'Arbre Mojo# cachent", /*spanish*/"entre #telarañas del Gran Árbol Deku# yace"}, - }); + hintTextTable[RHT_DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST] = HintText(CustomMessage("They say that #magical fire in the Deku Tree# leads to #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #feu magique dans l'Arbre Mojo# éclaire #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #fuego mágico en el Gran Árbol Deku# conduce a #[[1]]#. - hintTable[RHT_DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST] = HintText::Exclude({ - //obscure text - Text{"#magical fire in the Deku Tree# leads to", /*french*/"le #feu magique dans l'Arbre Mojo# éclaire", /*spanish*/"el #fuego mágico en el Gran Árbol Deku# conduce a"}, - }); + hintTextTable[RHT_DEKU_TREE_QUEEN_GOHMA_HEART] = HintText(CustomMessage("They say that #Queen Gohma# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #Reine Gohma# possède #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, la #Reina Goma# porta #[[1]]#. + {}, { + CustomMessage("They say that the #Parasitic Armored Arachnid# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #monstre insectoïde géant# possède #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, el #arácnido parasitario acorazado# porta #[[1]]#. - hintTable[RHT_DEKU_TREE_QUEEN_GOHMA_HEART] = HintText::Exclude({ - //obscure text - Text{"the #Parasitic Armored Arachnid# holds", /*french*/"le #monstre insectoïde géant# possède", /*spanish*/"el #arácnido parasitario acorazado# porta"}, - }, {}, - //clear text - Text{"#Queen Gohma# holds", /*french*/"la #Reine Gohma# possède", /*spanish*/"la #Reina Goma# porta"} - ); + hintTextTable[RHT_DEKU_TREE_GS_BASEMENT_BACK_ROOM] = HintText(CustomMessage("They say that a #spider deep within the Deku Tree# hides #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula au coeur de l'Arbre Mojo# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula en las profundidades del Árbol Deku# otorga #[[1]]#. - hintTable[RHT_DEKU_TREE_GS_BASEMENT_BACK_ROOM] = HintText::Exclude({ - //obscure text - Text{"a #spider deep within the Deku Tree# hides", /*french*/"une #Skulltula au coeur de l'Arbre Mojo# a", /*spanish*/"una #Skulltula en las profundidades del Árbol Deku# otorga"}, - }); + hintTextTable[RHT_DEKU_TREE_GS_BASEMENT_GATE] = HintText(CustomMessage("They say that a #web protects a spider# within the Deku Tree holding #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula derrière une toile dans l'Arbre Mojo# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula protegida por su tela# del Árbol Deku otorga #[[1]]#. - hintTable[RHT_DEKU_TREE_GS_BASEMENT_GATE] = HintText::Exclude({ - //obscure text - Text{"a #web protects a spider# within the Deku Tree holding", /*french*/"une #Skulltula derrière une toile dans l'Arbre Mojo# a", /*spanish*/"una #Skulltula protegida por su tela# del Árbol Deku otorga"}, - }); + hintTextTable[RHT_DEKU_TREE_GS_BASEMENT_VINES] = HintText(CustomMessage("They say that a #web protects a spider# within the Deku Tree holding #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula derrière une toile dans l'Arbre Mojo# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula protegida por su tela# del Árbol Deku otorga #[[1]]#. - hintTable[RHT_DEKU_TREE_GS_BASEMENT_VINES] = HintText::Exclude({ - //obscure text - Text{"a #web protects a spider# within the Deku Tree holding", /*french*/"une #Skulltula derrière une toile dans l'Arbre Mojo# a", /*spanish*/"una #Skulltula protegida por su tela# del Árbol Deku otorga"}, - }); + hintTextTable[RHT_DEKU_TREE_GS_COMPASS_ROOM] = HintText(CustomMessage("They say that a #spider atop the Deku Tree# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula au sommet de l'Arbre Mojo# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula en lo alto del Árbol Deku# otorga #[[1]]#. - hintTable[RHT_DEKU_TREE_GS_COMPASS_ROOM] = HintText::Exclude({ - //obscure text - Text{"a #spider atop the Deku Tree# holds", /*french*/"une #Skulltula au sommet de l'Arbre Mojo# a", /*spanish*/"una #Skulltula en lo alto del Árbol Deku# otorga"}, - }); + hintTextTable[RHT_DEKU_TREE_MQ_GS_LOBBY] = HintText(CustomMessage("They say that a #spider in a crate# within the Deku Tree hides #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula dans une boîte dans l'Arbre Mojo# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula bajo una caja# del Árbol Deku otorga #[[1]]#. + hintTextTable[RHT_DEKU_TREE_MQ_GS_COMPASS_ROOM] = HintText(CustomMessage("They say that a #wall of rock protects a spider# within the Deku Tree holding #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula derrière des rochers dans l'Arbre Mojo# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula protegida por una pared rocosa# del Árbol Deku otorga #[[1]]#. - hintTable[RHT_DEKU_TREE_MQ_GS_LOBBY] = HintText::Exclude({ - //obscure text - Text{"a #spider in a crate# within the Deku Tree hides", /*french*/"une #Skulltula dans une boîte dans l'Arbre Mojo# a", /*spanish*/"una #Skulltula bajo una caja# del Árbol Deku otorga"}, - }); + hintTextTable[RHT_DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM] = HintText(CustomMessage("They say that a #spider deep within the Deku Tree# hides #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula au coeur de l'Arbre Mojo# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula en las profundidades del Árbol Deku# otorga #[[1]]#. - hintTable[RHT_DEKU_TREE_MQ_GS_COMPASS_ROOM] = HintText::Exclude({ - //obscure text - Text{"a #wall of rock protects a spider# within the Deku Tree holding", /*french*/"une #Skulltula derrière des rochers dans l'Arbre Mojo# a", /*spanish*/"una #Skulltula protegida por una pared rocosa# del Árbol Deku otorga"}, - }); - - hintTable[RHT_DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM] = HintText::Exclude({ - //obscure text - Text{"a #spider deep within the Deku Tree# hides", /*french*/"une #Skulltula au coeur de l'Arbre Mojo# a", /*spanish*/"una #Skulltula en las profundidades del Árbol Deku# otorga"}, - }); - - hintTable[RHT_DEKU_TREE_MQ_DEKU_SCRUB] = HintText::Exclude({ - //obscure text - Text{"a #scrub in the Deku Tree# sells", /*french*/"la #peste Mojo dans l'Arbre Mojo# vend", /*spanish*/"un #deku del Gran Árbol Deku# vende"}, - }); + hintTextTable[RHT_DEKU_TREE_MQ_DEKU_SCRUB] = HintText(CustomMessage("They say that a #scrub in the Deku Tree# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #peste Mojo dans l'Arbre Mojo# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #deku del Gran Árbol Deku# vende #[[1]]#. /*-------------------------- | DODONGOS CAVERN | ---------------------------*/ - hintTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText::Exclude({ - //obscure text - Text{"#above King Dodongo# lies", /*french*/"#par dessus le Roi Dodongo# gît", /*spanish*/"#sobre el Rey Dodongo# yace"}, - }); +hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("They say that #above King Dodongo# lies #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #par dessus le Roi Dodongo# gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #sobre el Rey Dodongo# yace #[[1]]#. - hintTable[RHT_DODONGOS_CAVERN_MAP_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #muddy wall in Dodongo's Cavern# hides", /*french*/"le #mur fragile dans la Caverne Dodongo# recèle", /*spanish*/"tras una #agrietada pared en la Cueva de los Dodongos# yace"}, - }); + hintTextTable[RHT_DODONGOS_CAVERN_MAP_CHEST] = HintText(CustomMessage("They say that a #muddy wall in Dodongo's Cavern# hides #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #mur fragile dans la Caverne Dodongo# recèle #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, tras una #agrietada pared en la Cueva de los Dodongos# yace #[[1]]#. - hintTable[RHT_DODONGOS_CAVERN_COMPASS_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #statue in Dodongo's Cavern# guards", /*french*/"la #statue dans la Caverne Dodongo# protège", /*spanish*/"una #estatua de la Cueva de los Dodongos# esconde"}, - }); + hintTextTable[RHT_DODONGOS_CAVERN_COMPASS_CHEST] = HintText(CustomMessage("They say that a #statue in Dodongo's Cavern# guards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #statue dans la Caverne Dodongo# protège #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #estatua de la Cueva de los Dodongos# esconde #[[1]]#. - hintTable[RHT_DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST] = HintText::Exclude({ - //obscure text - Text{"above a #maze of stone# in Dodongo's Cavern lies", /*french*/"sur #un labyrinthe de pierre# dans la Caverne Dodongo gît", /*spanish*/"entre un #laberinto de piedra# en la Cueva de los Dodongos yace"}, - }); + hintTextTable[RHT_DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST] = HintText(CustomMessage("They say that above a #maze of stone# in Dodongo's Cavern lies #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, sur #un labyrinthe de pierre# dans la Caverne Dodongo gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, entre un #laberinto de piedra# en la Cueva de los Dodongos yace #[[1]]#. - hintTable[RHT_DODONGOS_CAVERN_BOMB_BAG_CHEST] = HintText::Exclude({ - //obscure text - Text{"the #second lizard cavern battle# yields", /*french*/"le #deuxième duel de lézards de caverne# octroie", /*spanish*/"#luchar dos veces contra reptiles en una cueva# conduce a"}, - }); + hintTextTable[RHT_DODONGOS_CAVERN_BOMB_BAG_CHEST] = HintText(CustomMessage("They say that the #second lizard cavern battle# yields #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #deuxième duel de lézards de caverne# octroie #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #luchar dos veces contra reptiles en una cueva# conduce a #[[1]]#. - hintTable[RHT_DODONGOS_CAVERN_END_OF_BRIDGE_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #chest at the end of a bridge# yields", /*french*/"le #trésor à l'extrémité d'un pont# contient", /*spanish*/"un #cofre al final de un quebrado puente# contiene"}, - }); + hintTextTable[RHT_DODONGOS_CAVERN_END_OF_BRIDGE_CHEST] = HintText(CustomMessage("They say that a #chest at the end of a bridge# yields #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #trésor à l'extrémité d'un pont# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #cofre al final de un quebrado puente# contiene #[[1]]#. + hintTextTable[RHT_DODONGOS_CAVERN_MQ_MAP_CHEST] = HintText(CustomMessage("They say that a #muddy wall in Dodongo's Cavern# hides #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #mur fragile dans la Caverne Dodongo# recèle #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #agrietada pared en la Cueva de los Dodongos# esconde #[[1]]#. - hintTable[RHT_DODONGOS_CAVERN_MQ_MAP_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #muddy wall in Dodongo's Cavern# hides", /*french*/"le #mur fragile dans la Caverne Dodongo# recèle", /*spanish*/"una #agrietada pared en la Cueva de los Dodongos# esconde"}, - }); + hintTextTable[RHT_DODONGOS_CAVERN_MQ_BOMB_BAG_CHEST] = HintText(CustomMessage("They say that an #elevated alcove# in Dodongo's Cavern holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#alcove haut perchée# dans la Caverne Dodongo cache #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #elevada alcoba# en la Cueva de los Dodongos brinda #[[1]]#. - hintTable[RHT_DODONGOS_CAVERN_MQ_BOMB_BAG_CHEST] = HintText::Exclude({ - //obscure text - Text{"an #elevated alcove# in Dodongo's Cavern holds", /*french*/"l'#alcove haut perchée# dans la Caverne Dodongo cache", /*spanish*/"una #elevada alcoba# en la Cueva de los Dodongos brinda"}, - }); + hintTextTable[RHT_DODONGOS_CAVERN_MQ_COMPASS_CHEST] = HintText(CustomMessage("They say that #fire-breathing lizards# in Dodongo's Cavern guard #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #lézards cracheurs de feu# dans la Caverne Dodongo protègent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, unos #flamígeros reptiles# en la Cueva de los Dodongos esconden #[[1]]#. - hintTable[RHT_DODONGOS_CAVERN_MQ_COMPASS_CHEST] = HintText::Exclude({ - //obscure text - Text{"#fire-breathing lizards# in Dodongo's Cavern guard", /*french*/"les #lézards cracheurs de feu# dans la Caverne Dodongo protègent", /*spanish*/"unos #flamígeros reptiles# en la Cueva de los Dodongos esconden"}, - }); + hintTextTable[RHT_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST] = HintText(CustomMessage("They say that #baby spiders# in Dodongo's Cavern guard #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #petites araignées dans la Caverne Dodongo# protègent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, unas #pequeñas larvas# en la Cueva de los Dodongos esconden #[[1]]#. - hintTable[RHT_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST] = HintText::Exclude({ - //obscure text - Text{"#baby spiders# in Dodongo's Cavern guard", /*french*/"les #petites araignées dans la Caverne Dodongo# protègent", /*spanish*/"unas #pequeñas larvas# en la Cueva de los Dodongos esconden"}, - }); + hintTextTable[RHT_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST] = HintText(CustomMessage("They say that above a #maze of stone# in Dodongo's Cavern lies #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, sur #un labyrinthe de pierre# dans la Caverne Dodongo gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, sobre un #laberinto de piedra# en la Cueva de los Dodongos yace #[[1]]#. - hintTable[RHT_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST] = HintText::Exclude({ - //obscure text - Text{"above a #maze of stone# in Dodongo's Cavern lies", /*french*/"sur #un labyrinthe de pierre# dans la Caverne Dodongo gît", /*spanish*/"sobre un #laberinto de piedra# en la Cueva de los Dodongos yace"}, - }); + hintTextTable[RHT_DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST] = HintText(CustomMessage("They say that #beneath a headstone# in Dodongo's Cavern lies #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #sous une pierre tombale# dans la Caverne Dodongo gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #bajo una lápida# en la Cueva de los Dodongos yace #[[1]]#. - hintTable[RHT_DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST] = HintText::Exclude({ - //obscure text - Text{"#beneath a headstone# in Dodongo's Cavern lies", /*french*/"#sous une pierre tombale# dans la Caverne Dodongo gît", /*spanish*/"#bajo una lápida# en la Cueva de los Dodongos yace"}, - }); + hintTextTable[RHT_DODONGOS_CAVERN_KING_DODONGO_HEART] = HintText(CustomMessage("They say that #King Dodongo# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #Roi Dodongo# possède #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, el #Rey Dodongo# porta #[[1]]#. + {}, { + CustomMessage("They say that the #Infernal Dinosaur# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #dinosaure infernal# possède #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, el #dinosaurio infernal# porta #[[1]]#. - hintTable[RHT_DODONGOS_CAVERN_KING_DODONGO_HEART] = HintText::Exclude({ - //obscure text - Text{"the #Infernal Dinosaur# holds", /*french*/"le #dinosaure infernal# possède", /*spanish*/"el #dinosaurio infernal# porta"}, - }, {}, - //clear text - Text{"#King Dodongo# holds", /*french*/"le #Roi Dodongo# possède", /*spanish*/"el #Rey Dodongo# porta"} - ); + hintTextTable[RHT_DODONGOS_CAVERN_GS_VINES_ABOVE_STAIRS] = HintText(CustomMessage("They say that a #spider entangled in vines# in Dodongo's Cavern guards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula sur les vignes dans la Caverne Dodongo# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula sobre unas cepas# de la Cueva de los Dodongos otorga #[[1]]#. - hintTable[RHT_DODONGOS_CAVERN_GS_VINES_ABOVE_STAIRS] = HintText::Exclude({ - //obscure text - Text{"a #spider entangled in vines# in Dodongo's Cavern guards", /*french*/"une #Skulltula sur les vignes dans la Caverne Dodongo# a", /*spanish*/"una #Skulltula sobre unas cepas# de la Cueva de los Dodongos otorga"}, - }); + hintTextTable[RHT_DODONGOS_CAVERN_GS_SCARECROW] = HintText(CustomMessage("They say that a #spider among explosive slugs# hides #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula dans l'alcove du couloir dans la Caverne Dodongo# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula rodeada de explosivos gusanos# otorga #[[1]]#. - hintTable[RHT_DODONGOS_CAVERN_GS_SCARECROW] = HintText::Exclude({ - //obscure text - Text{"a #spider among explosive slugs# hides", /*french*/"une #Skulltula dans l'alcove du couloir dans la Caverne Dodongo# a", /*spanish*/"una #Skulltula rodeada de explosivos gusanos# otorga"}, - }); + hintTextTable[RHT_DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS] = HintText(CustomMessage("They say that a #spider just out of reach# in Dodongo's Cavern holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula au haut des escaliers de la Caverne Dodongo# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula fuera del alcance# de la Cueva de los Dodongos otorga #[[1]]#. - hintTable[RHT_DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS] = HintText::Exclude({ - //obscure text - Text{"a #spider just out of reach# in Dodongo's Cavern holds", /*french*/"une #Skulltula au haut des escaliers de la Caverne Dodongo# a", /*spanish*/"una #Skulltula fuera del alcance# de la Cueva de los Dodongos otorga"}, - }); + hintTextTable[RHT_DODONGOS_CAVERN_GS_BACK_ROOM] = HintText(CustomMessage("They say that a #spider behind a statue# in Dodongo's Cavern holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula au coeur de la Caverne Dodongo# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula tras una estatua# de la Cueva de los Dodongos otorga #[[1]]#. - hintTable[RHT_DODONGOS_CAVERN_GS_BACK_ROOM] = HintText::Exclude({ - //obscure text - Text{"a #spider behind a statue# in Dodongo's Cavern holds", /*french*/"une #Skulltula au coeur de la Caverne Dodongo# a", /*spanish*/"una #Skulltula tras una estatua# de la Cueva de los Dodongos otorga"}, - }); + hintTextTable[RHT_DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS] = HintText(CustomMessage("They say that a #spider among bats# in Dodongo's Cavern holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula entourée de Saigneurs dans la Caverne Dodongo# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula rodeada de murciélagos# de la Cueva de los Dodongos otorga #[[1]]#. - hintTable[RHT_DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS] = HintText::Exclude({ - //obscure text - Text{"a #spider among bats# in Dodongo's Cavern holds", /*french*/"une #Skulltula entourée de Saigneurs dans la Caverne Dodongo# a", /*spanish*/"una #Skulltula rodeada de murciélagos# de la Cueva de los Dodongos otorga"}, - }); + hintTextTable[RHT_DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM] = HintText(CustomMessage("They say that a #spider high on a wall# in Dodongo's Cavern holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula haut perchée dans la Caverne Dodongo# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula en lo alto de una pared# de la Cueva de los Dodongos otorga #[[1]]#. + hintTextTable[RHT_DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM] = HintText(CustomMessage("They say that a #spider on top of a pillar of rock# in Dodongo's Cavern holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula sur l'énorme pilier de roc de la Caverne Dodongo# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula en lo alto de un pilar# de la Cueva de los Dodongos otorga #[[1]]#. - hintTable[RHT_DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM] = HintText::Exclude({ - //obscure text - Text{"a #spider high on a wall# in Dodongo's Cavern holds", /*french*/"une #Skulltula haut perchée dans la Caverne Dodongo# a", /*spanish*/"una #Skulltula en lo alto de una pared# de la Cueva de los Dodongos otorga"}, - }); + hintTextTable[RHT_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM] = HintText(CustomMessage("They say that a #spider in a crate# in Dodongo's Cavern holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula dans une boîte de la Caverne Dodongo# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula bajo una caja# de la Cueva de los Dodongos otorga #[[1]]#. - hintTable[RHT_DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM] = HintText::Exclude({ - //obscure text - Text{"a #spider on top of a pillar of rock# in Dodongo's Cavern holds", /*french*/"une #Skulltula sur l'énorme pilier de roc de la Caverne Dodongo# a", /*spanish*/"una #Skulltula en lo alto de un pilar# de la Cueva de los Dodongos otorga"}, - }); + hintTextTable[RHT_DODONGOS_CAVERN_MQ_GS_BACK_AREA] = HintText(CustomMessage("They say that a #spider among graves# in Dodongo's Cavern holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula parmi les tombes de la Caverne Dodongo# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula entre lápidas# en la Cueva de los Dodongos otorga #[[1]]#. - hintTable[RHT_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM] = HintText::Exclude({ - //obscure text - Text{"a #spider in a crate# in Dodongo's Cavern holds", /*french*/"une #Skulltula dans une boîte de la Caverne Dodongo# a", /*spanish*/"una #Skulltula bajo una caja# de la Cueva de los Dodongos otorga"}, - }); + hintTextTable[RHT_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT] = HintText(CustomMessage("They say that a pair of #scrubs in Dodongo's Cavern# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #duo de peste Mojo dans la Caverne Dodongo# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #par de dekus en la Cueva de los Dodongos# venden #[[1]]#. - hintTable[RHT_DODONGOS_CAVERN_MQ_GS_BACK_AREA] = HintText::Exclude({ - //obscure text - Text{"a #spider among graves# in Dodongo's Cavern holds", /*french*/"une #Skulltula parmi les tombes de la Caverne Dodongo# a", /*spanish*/"una #Skulltula entre lápidas# en la Cueva de los Dodongos otorga"}, - }); + hintTextTable[RHT_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS] = HintText(CustomMessage("They say that a #scrub guarded by Lizalfos# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #peste Mojo au coeur de la Caverne Dodongo# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #deku custodiado por Lizalfos# vende #[[1]]#. - hintTable[RHT_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT] = HintText::Exclude({ - //obscure text - Text{"a pair of #scrubs in Dodongo's Cavern# sells", /*french*/"le #duo de peste Mojo dans la Caverne Dodongo# vend", /*spanish*/"un #par de dekus en la Cueva de los Dodongos# venden"}, - }); + hintTextTable[RHT_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT] = HintText(CustomMessage("They say that a pair of #scrubs in Dodongo's Cavern# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #duo de peste Mojo dans la Caverne Dodongo# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #par de dekus en la Cueva de los Dodongos# venden #[[1]]#. - hintTable[RHT_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS] = HintText::Exclude({ - //obscure text - Text{"a #scrub guarded by Lizalfos# sells", /*french*/"la #peste Mojo au coeur de la Caverne Dodongo# vend", /*spanish*/"un #deku custodiado por Lizalfos# vende"}, - }); + hintTextTable[RHT_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY] = HintText(CustomMessage("They say that a #scrub in Dodongo's Cavern# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #peste Mojo dans l'entrée de la Caverne Dodongo# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #deku en la Cueva de los Dodongos# vende #[[1]]#. - hintTable[RHT_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT] = HintText::Exclude({ - //obscure text - Text{"a pair of #scrubs in Dodongo's Cavern# sells", /*french*/"le #duo de peste Mojo dans la Caverne Dodongo# vend", /*spanish*/"un #par de dekus en la Cueva de los Dodongos# venden"}, - }); + hintTextTable[RHT_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR] = HintText(CustomMessage("They say that a pair of #scrubs in Dodongo's Cavern# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #duo de peste Mojo dans l'entrée de la Caverne Dodongo# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #par de dekus en la Cueva de los Dodongos# venden #[[1]]#. - hintTable[RHT_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY] = HintText::Exclude({ - //obscure text - Text{"a #scrub in Dodongo's Cavern# sells", /*french*/"la #peste Mojo dans l'entrée de la Caverne Dodongo# vend", /*spanish*/"un #deku en la Cueva de los Dodongos# vende"}, - }); + hintTextTable[RHT_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT] = HintText(CustomMessage("They say that a pair of #scrubs in Dodongo's Cavern# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #duo de peste Mojo dans l'entrée de la Caverne Dodongo# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #par de dekus en la Cueva de los Dodongos# venden #[[1]]#. + hintTextTable[RHT_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE] = HintText(CustomMessage("They say that a #scrub in Dodongo's Cavern# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #peste Mojo au sommet des escaliers dans la Caverne Dodongo# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #deku en la Cueva de los Dodongos# vende #[[1]]#. - hintTable[RHT_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR] = HintText::Exclude({ - //obscure text - Text{"a pair of #scrubs in Dodongo's Cavern# sells", /*french*/"le #duo de peste Mojo dans l'entrée de la Caverne Dodongo# vend", /*spanish*/"un #par de dekus en la Cueva de los Dodongos# venden"}, - }); - - hintTable[RHT_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT] = HintText::Exclude({ - //obscure text - Text{"a pair of #scrubs in Dodongo's Cavern# sells", /*french*/"le #duo de peste Mojo dans l'entrée de la Caverne Dodongo# vend", /*spanish*/"un #par de dekus en la Cueva de los Dodongos# venden"}, - }); - - hintTable[RHT_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE] = HintText::Exclude({ - //obscure text - Text{"a #scrub in Dodongo's Cavern# sells", /*french*/"la #peste Mojo au sommet des escaliers dans la Caverne Dodongo# vend", /*spanish*/"un #deku en la Cueva de los Dodongos# vende"}, - }); - - hintTable[RHT_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS] = HintText::Exclude({ - //obscure text - Text{"a #scrub guarded by Lizalfos# sells", /*french*/"la #peste Mojo au coeur de la Caverne Dodongo# vend", /*spanish*/"un #deku custodiado por Lizalfos# vende"}, - }); + hintTextTable[RHT_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS] = HintText(CustomMessage("They say that a #scrub guarded by Lizalfos# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #peste Mojo au coeur de la Caverne Dodongo# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #deku custodiado por Lizalfos# vende #[[1]]#. /*-------------------------- | JABU JABUS BELLY | ---------------------------*/ - hintTable[RHT_JABU_JABUS_BELLY_MAP_CHEST] = HintText::Exclude({ - //obscure text - Text{"#tentacle trouble# in a deity's belly guards", /*french*/"la #membrane# dans le ventre du gardien protège", /*spanish*/"un #problema tentaculoso# en la tripa de cierta deidad esconde"}, - }, {}, - //clear text - Text{"a #slimy thing# guards", /*french*/"la #chose gluante# gardien protège", /*spanish*/"un #tentáculo parasitario# protege"} - ); + hintTextTable[RHT_JABU_JABUS_BELLY_MAP_CHEST] = HintText(CustomMessage("They say that a #slimy thing# guards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #chose gluante# gardien protège #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, un #tentáculo parasitario# protege #[[1]]#. + {}, { + CustomMessage("They say that #tentacle trouble# in a deity's belly guards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #membrane# dans le ventre du gardien protège #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, un #problema tentaculoso# en la tripa de cierta deidad esconde #[[1]]#. - hintTable[RHT_JABU_JABUS_BELLY_COMPASS_CHEST] = HintText::Exclude({ - //obscure text - Text{"#bubble trouble# in a deity's belly guards", /*french*/"un #horde de bulles# dans le ventre du gardien protègent", /*spanish*/"un #problema burbujesco# en la tripa de cierta deidad esconde"}, - }, {}, - //clear text - Text{"#bubbles# guard", /*french*/"des #bulles# entourent", /*spanish*/"unas #burbujas# protegen"} - ); + hintTextTable[RHT_JABU_JABUS_BELLY_COMPASS_CHEST] = HintText(CustomMessage("They say that #bubbles# guard #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, des #bulles# entourent #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, unas #burbujas# protegen #[[1]]#. + {}, { + CustomMessage("They say that #bubble trouble# in a deity's belly guards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, un #horde de bulles# dans le ventre du gardien protègent #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, un #problema burbujesco# en la tripa de cierta deidad esconde #[[1]]#. + hintTextTable[RHT_JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST] = HintText(CustomMessage("They say that shooting a #mouth cow# reveals #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, tirer sur une #vache# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #dispararle a una vaca# revela #[[1]]#. - hintTable[RHT_JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST] = HintText::Exclude({ - //obscure text - Text{"shooting a #mouth cow# reveals", /*french*/"tirer sur une #vache# révèle", /*spanish*/"#dispararle a una vaca# revela"}, - }); + hintTextTable[RHT_JABU_JABUS_BELLY_MQ_MAP_CHEST] = HintText(CustomMessage("They say that a #boulder before cows# hides #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, des #rochers près des vaches# cachent #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, cierta #roca rodeada de vacas# esconde #[[1]]#. + {}, { + CustomMessage("They say that #pop rocks# hide #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, des #pierres aux reins# cachent #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, #cepillarse los dientes con explosivos# revela #[[1]]#. + CustomMessage("They say that an #explosive palate# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, des #gargouillis explosifs# cachent #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, un #paladar explosivo# esconde #[[1]]#. - hintTable[RHT_JABU_JABUS_BELLY_MQ_MAP_CHEST] = HintText::Exclude({ - //obscure text - Text{"#pop rocks# hide", /*french*/"des #pierres aux reins# cachent", /*spanish*/"#cepillarse los dientes con explosivos# revela"}, - Text{"an #explosive palate# holds", /*french*/"des #gargouillis explosifs# cachent", /*spanish*/"un #paladar explosivo# esconde"}, - }, {}, - //clear text - Text{"a #boulder before cows# hides", /*french*/"des #rochers près des vaches# cachent", /*spanish*/"cierta #roca rodeada de vacas# esconde"} - ); + hintTextTable[RHT_JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST] = HintText(CustomMessage("They say that near a #spiked elevator# lies #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, près d'un #ascenseur visqueux# gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, cerca de un #ascensor puntiagudo# yace #[[1]]#. - hintTable[RHT_JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST] = HintText::Exclude({ - //obscure text - Text{"near a #spiked elevator# lies", /*french*/"près d'un #ascenseur visqueux# gît", /*spanish*/"cerca de un #ascensor puntiagudo# yace"}, - }); + hintTextTable[RHT_JABU_JABUS_BELLY_MQ_COMPASS_CHEST] = HintText(CustomMessage("They say that a #drowning cow# unveils #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #vache à l'eau# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #vaca sumergida# revela #[[1]]#. - hintTable[RHT_JABU_JABUS_BELLY_MQ_COMPASS_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #drowning cow# unveils", /*french*/"une #vache à l'eau# a", /*spanish*/"una #vaca sumergida# revela"}, - }); + hintTextTable[RHT_JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST] = HintText(CustomMessage("They say that #moving anatomy# creates a path to #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, un #organe descendant# mène à #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #ser movedizo entre paredes# conduce a #[[1]]#. - hintTable[RHT_JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST] = HintText::Exclude({ - //obscure text - Text{"#moving anatomy# creates a path to", /*french*/"un #organe descendant# mène à", /*spanish*/"un #ser movedizo entre paredes# conduce a"}, - }); + hintTextTable[RHT_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST] = HintText(CustomMessage("They say that a #pair of digested cows# hold #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #deux boeufs digérés# détiennent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #par de digeridas vacas# otorgan #[[1]]#. - hintTable[RHT_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #pair of digested cows# hold", /*french*/"#deux boeufs digérés# détiennent", /*spanish*/"un #par de digeridas vacas# otorgan"}, - }); + hintTextTable[RHT_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST] = HintText(CustomMessage("They say that a #pair of digested cows# hold #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #deux boeufs digérés# détiennent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #par de digeridas vacas# otorgan #[[1]]#. - hintTable[RHT_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #pair of digested cows# hold", /*french*/"#deux boeufs digérés# détiennent", /*spanish*/"un #par de digeridas vacas# otorgan"}, - }); + hintTextTable[RHT_JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST] = HintText(CustomMessage("They say that the #final cows' reward# in a deity's belly is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #cadeau des dernières vaches# estomacales est #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, las #vacas al final# de la tripa de cierta deidad otorgan #[[1]]#. - hintTable[RHT_JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST] = HintText::Exclude({ - //obscure text - Text{"the #final cows' reward# in a deity's belly is", /*french*/"le #cadeau des dernières vaches# estomacales est", /*spanish*/"las #vacas al final# de la tripa de cierta deidad otorgan"}, - }); + hintTextTable[RHT_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST] = HintText(CustomMessage("They say that #cows protected by falling monsters# in a deity's belly guard #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, des #vaches protégées par des monstres tombants# cachent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, unas #vacas custodiadas por monstruos del techo# de la tripa de cierta deidad otorgan #[[1]]#. - hintTable[RHT_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST] = HintText::Exclude({ - //obscure text - Text{"#cows protected by falling monsters# in a deity's belly guard", /*french*/"des #vaches protégées par des monstres tombants# cachent", /*spanish*/"unas #vacas custodiadas por monstruos del techo# de la tripa de cierta deidad otorgan"}, - }); + hintTextTable[RHT_JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST] = HintText(CustomMessage("They say that a school of #stingers swallowed by Jabu-Jabu# guard #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #raies avallées par Jabu-Jabu# protègent #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, unos #stingers engullidos por Jabu-Jabu# guardan #[[1]]#. + {}, { + CustomMessage("They say that a school of #stingers swallowed by a deity# guard #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #raies avallées par le gardien# protègent #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, unos #stingers engullidos por cierta deidad# guardan #[[1]]#. - hintTable[RHT_JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST] = HintText::Exclude({ - //obscure text - Text{"a school of #stingers swallowed by a deity# guard", /*french*/"les #raies avallées par le gardien# protègent", /*spanish*/"unos #stingers engullidos por cierta deidad# guardan"}, - }, {}, - //clear text - Text{"a school of #stingers swallowed by Jabu-Jabu# guard", /*french*/"les #raies avallées par Jabu-Jabu# protègent", /*spanish*/"unos #stingers engullidos por Jabu-Jabu# guardan"} - ); + hintTextTable[RHT_JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST] = HintText(CustomMessage("They say that a school of #stingers swallowed by Jabu-Jabu# guard #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #raies avallées par Jabu-Jabu# protègent #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, unos #stingers engullidos por Jabu-Jabu# guardan #[[1]]#. + {}, { + CustomMessage("They say that a school of #stingers swallowed by a deity# guard #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #raies avallées par le gardien# protègent #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, unos #stingers engullidos por cierta deidad# guardan #[[1]]#. - hintTable[RHT_JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST] = HintText::Exclude({ - //obscure text - Text{"a school of #stingers swallowed by a deity# guard", /*french*/"les #raies avallées par le gardien# protègent", /*spanish*/"unos #stingers engullidos por cierta deidad# guardan"}, - }, {}, - //clear text - Text{"a school of #stingers swallowed by Jabu-Jabu# guard", /*french*/"les #raies avallées par Jabu-Jabu# protègent", /*spanish*/"unos #stingers engullidos por Jabu-Jabu# guardan"} - ); + hintTextTable[RHT_JABU_JABUS_BELLY_BARINADE_HEART] = HintText(CustomMessage("They say that #Barinade# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #Barinade# possède #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, #Barinade# porta #[[1]]#. + {}, { + CustomMessage("They say that the #Bio-Electric Anemone# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#anémone bioélectrique# possède #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, la #anémona bioeléctrica# porta #[[1]]#. - hintTable[RHT_JABU_JABUS_BELLY_BARINADE_HEART] = HintText::Exclude({ - //obscure text - Text{"the #Bio-Electric Anemone# holds", /*french*/"l'#anémone bioélectrique# possède", /*spanish*/"la #anémona bioeléctrica# porta"}, - }, {}, - //clear text - Text{"#Barinade# holds", /*french*/"#Barinade# possède", /*spanish*/"#Barinade# porta"} - ); + hintTextTable[RHT_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_LOWER] = HintText(CustomMessage("They say that a #spider resting near a princess# in Jabu-Jabu's Belly holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula près de la princesse dans le Ventre de Jabu-Jabu# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula junto a una princesa# en la Tripa de Jabu-Jabu otorga #[[1]]#. - hintTable[RHT_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_LOWER] = HintText::Exclude({ - //obscure text - Text{"a #spider resting near a princess# in Jabu-Jabu's Belly holds", /*french*/"une #Skulltula près de la princesse dans le Ventre de Jabu-Jabu# a", /*spanish*/"una #Skulltula junto a una princesa# en la Tripa de Jabu-Jabu otorga"}, - }); + hintTextTable[RHT_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER] = HintText(CustomMessage("They say that a #spider resting near a princess# in Jabu-Jabu's Belly holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula près de la princesse dans le Ventre de Jabu-Jabu# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula junto a una princesa# en la Tripa de Jabu-Jabu otorga #[[1]]#. - hintTable[RHT_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER] = HintText::Exclude({ - //obscure text - Text{"a #spider resting near a princess# in Jabu-Jabu's Belly holds", /*french*/"une #Skulltula près de la princesse dans le Ventre de Jabu-Jabu# a", /*spanish*/"una #Skulltula junto a una princesa# en la Tripa de Jabu-Jabu otorga"}, - }); + hintTextTable[RHT_JABU_JABUS_BELLY_GS_NEAR_BOSS] = HintText(CustomMessage("They say that #jellyfish surround a spider# holding #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula entourée de méduses dans le Ventre de Jabu-Jabu# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula rodeada de medusas# otorga #[[1]]#. - hintTable[RHT_JABU_JABUS_BELLY_GS_NEAR_BOSS] = HintText::Exclude({ - //obscure text - Text{"#jellyfish surround a spider# holding", /*french*/"une #Skulltula entourée de méduses dans le Ventre de Jabu-Jabu# a", /*spanish*/"una #Skulltula rodeada de medusas# otorga"}, - }); + hintTextTable[RHT_JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM] = HintText(CustomMessage("They say that a #spider guarded by a school of stingers# in Jabu-Jabu's Belly holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula protégée par des raies dans le Ventre de Jabu-Jabu# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula rodeada por unos stingers# en la Tripa de Jabu-Jabu otorga #[[1]]#. - hintTable[RHT_JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM] = HintText::Exclude({ - //obscure text - Text{"a #spider guarded by a school of stingers# in Jabu-Jabu's Belly holds", /*french*/"une #Skulltula protégée par des raies dans le Ventre de Jabu-Jabu# a", /*spanish*/"una #Skulltula rodeada por unos stingers# en la Tripa de Jabu-Jabu otorga"}, - }); + hintTextTable[RHT_JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM] = HintText(CustomMessage("They say that a #spider surrounded by electricity# in Jabu-Jabu's Belly holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula entourée d'électricité dans le Ventre de Jabu-Jabu# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula rodeada de electricidad# en la Tripa de Jabu-Jabu otorga #[[1]]#. + hintTextTable[RHT_JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM] = HintText(CustomMessage("They say that a #spider guarded by a school of stingers# in Jabu-Jabu's Belly holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula protégée par des raies dans le Ventre de Jabu-Jabu# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula protegida por unos stingers# en la Tripa de Jabu-Jabu otorga #[[1]]#. - hintTable[RHT_JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM] = HintText::Exclude({ - //obscure text - Text{"a #spider surrounded by electricity# in Jabu-Jabu's Belly holds", /*french*/"une #Skulltula entourée d'électricité dans le Ventre de Jabu-Jabu# a", /*spanish*/"una #Skulltula rodeada de electricidad# en la Tripa de Jabu-Jabu otorga"}, - }); - - hintTable[RHT_JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM] = HintText::Exclude({ - //obscure text - Text{"a #spider guarded by a school of stingers# in Jabu-Jabu's Belly holds", /*french*/"une #Skulltula protégée par des raies dans le Ventre de Jabu-Jabu# a", /*spanish*/"una #Skulltula protegida por unos stingers# en la Tripa de Jabu-Jabu otorga"}, - }); - - hintTable[RHT_JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS] = HintText::Exclude({ - //obscure text - Text{"a #spider in a web within Jabu-Jabu's Belly# holds", /*french*/"une #Skulltula sur une toile dans le Ventre de Jabu-Jabu# a", /*spanish*/"una #Skulltula sobre una red# en la Tripa de Jabu-Jabu otorga"}, - }); - - hintTable[RHT_JABU_JABUS_BELLY_DEKU_SCRUB] = HintText::Exclude({ - //obscure text - Text{"a #scrub in a deity# sells", /*french*/"la #peste Mojo dans le ventre du gardien# vend", /*spanish*/"un #deku dentro de cierta deidad# vende"}, - }); + hintTextTable[RHT_JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS] = HintText(CustomMessage("They say that a #spider in a web within Jabu-Jabu's Belly# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula sur une toile dans le Ventre de Jabu-Jabu# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula sobre una red# en la Tripa de Jabu-Jabu otorga #[[1]]#. + hintTextTable[RHT_JABU_JABUS_BELLY_DEKU_SCRUB] = HintText(CustomMessage("They say that a #scrub in a deity# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #peste Mojo dans le ventre du gardien# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #deku dentro de cierta deidad# vende #[[1]]#. /*-------------------------- | FOREST TEMPLE | ---------------------------*/ - hintTable[RHT_FOREST_TEMPLE_FIRST_ROOM_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #tree in the Forest Temple# supports", /*french*/"sur l'#arbre dans le Temple de la Forêt# gît", /*spanish*/"sobre un #árbol del Templo del Bosque# yace"}, - }); + hintTextTable[RHT_FOREST_TEMPLE_FIRST_ROOM_CHEST] = HintText(CustomMessage("They say that a #tree in the Forest Temple# supports #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, sur l'#arbre dans le Temple de la Forêt# gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, sobre un #árbol del Templo del Bosque# yace #[[1]]#. - hintTable[RHT_FOREST_TEMPLE_FIRST_STALFOS_CHEST] = HintText::Exclude({ - //obscure text - Text{"#defeating enemies beneath a falling ceiling# in Forest Temple yields", /*french*/"#deux squelettes# dans le Temple de la Forêt protègent", /*spanish*/"#derrotar enemigos caídos de lo alto# del Templo del Bosque revela"}, - }); + hintTextTable[RHT_FOREST_TEMPLE_FIRST_STALFOS_CHEST] = HintText(CustomMessage("They say that #defeating enemies beneath a falling ceiling# in Forest Temple yields #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #deux squelettes# dans le Temple de la Forêt protègent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #derrotar enemigos caídos de lo alto# del Templo del Bosque revela #[[1]]#. - hintTable[RHT_FOREST_TEMPLE_WELL_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #sunken chest deep in the woods# contains", /*french*/"le #coffre submergé dans la forêt# contient", /*spanish*/"un #sumergido cofre en lo profundo del bosque# contiene"}, - }); + hintTextTable[RHT_FOREST_TEMPLE_WELL_CHEST] = HintText(CustomMessage("They say that a #sunken chest deep in the woods# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #coffre submergé dans la forêt# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #sumergido cofre en lo profundo del bosque# contiene #[[1]]#. - hintTable[RHT_FOREST_TEMPLE_MAP_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #fiery skull# in Forest Temple guards", /*french*/"le #crâne enflammé# dans le Temple de la Forêt protège", /*spanish*/"una #ardiente calavera# del Templo del Bosque esconde"}, - }); + hintTextTable[RHT_FOREST_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say that a #fiery skull# in Forest Temple guards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #crâne enflammé# dans le Temple de la Forêt protège #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #ardiente calavera# del Templo del Bosque esconde #[[1]]#. - hintTable[RHT_FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #chest on a small island# in the Forest Temple holds", /*french*/"le #coffre sur l'îlot# du Temple de la Forêt contient", /*spanish*/"un #cofre sobre una isla# del Templo del Bosque contiene"}, - }); + hintTextTable[RHT_FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST] = HintText(CustomMessage("They say that a #chest on a small island# in the Forest Temple holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #coffre sur l'îlot# du Temple de la Forêt contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #cofre sobre una isla# del Templo del Bosque contiene #[[1]]#. - hintTable[RHT_FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST] = HintText::Exclude({ - //obscure text - Text{"beneath a #checkerboard falling ceiling# lies", /*french*/"sous #l'échiquier tombant# gît", /*spanish*/"tras un #techo de ajedrez# yace"}, - }); + hintTextTable[RHT_FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST] = HintText(CustomMessage("They say that beneath a #checkerboard falling ceiling# lies #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, sous #l'échiquier tombant# gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, tras un #techo de ajedrez# yace #[[1]]#. - hintTable[RHT_FOREST_TEMPLE_EYE_SWITCH_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #sharp eye# will spot", /*french*/"l'#oeil perçant# dans la forêt verra", /*spanish*/"un #afilado ojo# revela"}, - }, {}, - //clear text - Text{"#blocks of stone# in the Forest Temple surround", /*french*/"les #blocs dans le Temple de la Forêt# entourent", /*spanish*/"cerca de unos #bloques de piedra# del Templo del Bosque yace"} - ); + hintTextTable[RHT_FOREST_TEMPLE_EYE_SWITCH_CHEST] = HintText(CustomMessage("They say that #blocks of stone# in the Forest Temple surround #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #blocs dans le Temple de la Forêt# entourent #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, cerca de unos #bloques de piedra# del Templo del Bosque yace #[[1]]#. + {}, { + CustomMessage("They say that a #sharp eye# will spot #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#oeil perçant# dans la forêt verra #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, un #afilado ojo# revela #[[1]]#. - hintTable[RHT_FOREST_TEMPLE_BOSS_KEY_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #turned trunk# contains", /*french*/"le #coffre pivoté# contient", /*spanish*/"en una #sala con otro punto de vista# se esconde"}, - }); + hintTextTable[RHT_FOREST_TEMPLE_BOSS_KEY_CHEST] = HintText(CustomMessage("They say that a #turned trunk# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #coffre pivoté# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, en una #sala con otro punto de vista# se esconde #[[1]]#. - hintTable[RHT_FOREST_TEMPLE_FLOORMASTER_CHEST] = HintText::Exclude({ - //obscure text - Text{"deep in the forest #shadows guard a chest# containing", /*french*/"l'#ombre de la forêt# protège un coffre contenant", /*spanish*/"en lo profundo del bosque #unas sombras# esconden"}, - }); + hintTextTable[RHT_FOREST_TEMPLE_FLOORMASTER_CHEST] = HintText(CustomMessage("They say that deep in the forest #shadows guard a chest# containing #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#ombre de la forêt# protège un coffre contenant #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, en lo profundo del bosque #unas sombras# esconden #[[1]]#. - hintTable[RHT_FOREST_TEMPLE_BOW_CHEST] = HintText::Exclude({ - //obscure text - Text{"an #army of the dead# guards", /*french*/"des #squelettes sylvestres# protègent", /*spanish*/"un #ejército de soldados caídos# guarda"}, - }, {}, - //clear text - Text{"#Stalfos deep in the Forest Temple# guard", /*french*/"#trois squelettes dans le Temple de la Forêt# protègent", /*spanish*/"los #Stalfos en lo profundo del Templo del Bosque# guardan"} - ); + hintTextTable[RHT_FOREST_TEMPLE_BOW_CHEST] = HintText(CustomMessage("They say that #Stalfos deep in the Forest Temple# guard #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #trois squelettes dans le Temple de la Forêt# protègent #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, los #Stalfos en lo profundo del Templo del Bosque# guardan #[[1]]#. + {}, { + CustomMessage("They say that an #army of the dead# guards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, des #squelettes sylvestres# protègent #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, un #ejército de soldados caídos# guarda #[[1]]#. - hintTable[RHT_FOREST_TEMPLE_RED_POE_CHEST] = HintText::Exclude({ - //obscure text - Text{"#Joelle# guards", /*french*/"#Joelle# protège", /*spanish*/"#Joelle# guarda"}, - }, {}, - //clear text - Text{"a #red ghost# guards", /*french*/"le #fantôme rouge# protège", /*spanish*/"un #espectro rojo# guarda"} - ); + hintTextTable[RHT_FOREST_TEMPLE_RED_POE_CHEST] = HintText(CustomMessage("They say that a #red ghost# guards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #fantôme rouge# protège #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, un #espectro rojo# guarda #[[1]]#. + {}, { + CustomMessage("They say that #Joelle# guards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #Joelle# protège #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, #Joelle# guarda #[[1]]#. - hintTable[RHT_FOREST_TEMPLE_BLUE_POE_CHEST] = HintText::Exclude({ - //obscure text - Text{"#Beth# guards", /*french*/"#Beth# protège", /*spanish*/"#Beth# guarda"}, - }, {}, - //clear text - Text{"a #blue ghost# guards", /*french*/"le #fantôme bleu# protège", /*spanish*/"un #espectro azul# guarda"} - ); + hintTextTable[RHT_FOREST_TEMPLE_BLUE_POE_CHEST] = HintText(CustomMessage("They say that a #blue ghost# guards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #fantôme bleu# protège #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, un #espectro azul# guarda #[[1]]#. + {}, { + CustomMessage("They say that #Beth# guards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #Beth# protège #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, #Beth# guarda #[[1]]#. - hintTable[RHT_FOREST_TEMPLE_BASEMENT_CHEST] = HintText::Exclude({ - //obscure text - Text{"#revolving walls# in the Forest Temple conceal", /*french*/"des #murs rotatifs dans la forêt# recèlent", /*spanish*/"las #paredes giratorias# del Templo del Bosque conceden"}, - }); + hintTextTable[RHT_FOREST_TEMPLE_BASEMENT_CHEST] = HintText(CustomMessage("They say that #revolving walls# in the Forest Temple conceal #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, des #murs rotatifs dans la forêt# recèlent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, las #paredes giratorias# del Templo del Bosque conceden #[[1]]#. + hintTextTable[RHT_FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST] = HintText(CustomMessage("They say that a #tree in the Forest Temple# supports #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, sur l'#arbre dans le Temple de la Forêt# gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, sobre un #árbol del Templo del Bosque# yace #[[1]]#. - hintTable[RHT_FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #tree in the Forest Temple# supports", /*french*/"sur l'#arbre dans le Temple de la Forêt# gît", /*spanish*/"sobre un #árbol del Templo del Bosque# yace"}, - }); + hintTextTable[RHT_FOREST_TEMPLE_MQ_WOLFOS_CHEST] = HintText(CustomMessage("They say that #defeating enemies beneath a falling ceiling# in Forest Temple yields #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #deux squelettes# dans le Temple de la Forêt protègent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #derrotar enemigos caídos de lo alto# del Templo del Bosque revela #[[1]]#. - hintTable[RHT_FOREST_TEMPLE_MQ_WOLFOS_CHEST] = HintText::Exclude({ - //obscure text - Text{"#defeating enemies beneath a falling ceiling# in Forest Temple yields", /*french*/"#deux squelettes# dans le Temple de la Forêt protègent", /*spanish*/"#derrotar enemigos caídos de lo alto# del Templo del Bosque revela"}, - }); + hintTextTable[RHT_FOREST_TEMPLE_MQ_BOW_CHEST] = HintText(CustomMessage("They say that #Stalfos deep in the Forest Temple# guard #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #trois squelettes dans le Temple de la Forêt# protègent #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, los #Stalfos en lo profundo del Templo del Bosque# guardan #[[1]]#. + {}, { + CustomMessage("They say that an #army of the dead# guards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, des #squelettes sylvestres# protègent #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, un #ejército de soldados caídos# guarda #[[1]]#. - hintTable[RHT_FOREST_TEMPLE_MQ_BOW_CHEST] = HintText::Exclude({ - //obscure text - Text{"an #army of the dead# guards", /*french*/"des #squelettes sylvestres# protègent", /*spanish*/"un #ejército de soldados caídos# guarda"}, - }, {}, - //clear text - Text{"#Stalfos deep in the Forest Temple# guard", /*french*/"#trois squelettes dans le Temple de la Forêt# protègent", /*spanish*/"los #Stalfos en lo profundo del Templo del Bosque# guardan"} - ); + hintTextTable[RHT_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST] = HintText(CustomMessage("They say that a #chest on a small island# in the Forest Temple holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #coffre sur l'îlot# du Temple de la Forêt contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #cofre sobre una isla# del Templo del Bosque contiene #[[1]]#. - hintTable[RHT_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #chest on a small island# in the Forest Temple holds", /*french*/"le #coffre sur l'îlot# du Temple de la Forêt contient", /*spanish*/"un #cofre sobre una isla# del Templo del Bosque contiene"}, - }); + hintTextTable[RHT_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST] = HintText(CustomMessage("They say that #high in a courtyard# within the Forest Temple is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #haut perché dans le jardin# du Temple de la Forêt gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #cofre en lo alto de un patio# del Templo del Bosque contiene #[[1]]#. - hintTable[RHT_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST] = HintText::Exclude({ - //obscure text - Text{"#high in a courtyard# within the Forest Temple is", /*french*/"#haut perché dans le jardin# du Temple de la Forêt gît", /*spanish*/"un #cofre en lo alto de un patio# del Templo del Bosque contiene"}, - }); + hintTextTable[RHT_FOREST_TEMPLE_MQ_WELL_CHEST] = HintText(CustomMessage("They say that a #sunken chest deep in the woods# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #coffre submergé dans la forêt# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #sumergido cofre en lo profundo del bosque# contiene #[[1]]#. - hintTable[RHT_FOREST_TEMPLE_MQ_WELL_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #sunken chest deep in the woods# contains", /*french*/"le #coffre submergé dans la forêt# contient", /*spanish*/"un #sumergido cofre en lo profundo del bosque# contiene"}, - }); + hintTextTable[RHT_FOREST_TEMPLE_MQ_MAP_CHEST] = HintText(CustomMessage("They say that a #red ghost# guards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #fantôme rouge# protège #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, un #fantasma rojo# guarda #[[1]]#. + {}, { + CustomMessage("They say that #Joelle# guards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #Joelle# protège #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, #Joelle# guarda #[[1]]#. - hintTable[RHT_FOREST_TEMPLE_MQ_MAP_CHEST] = HintText::Exclude({ - //obscure text - Text{"#Joelle# guards", /*french*/"#Joelle# protège", /*spanish*/"#Joelle# guarda"}, - }, {}, - //clear text - Text{"a #red ghost# guards", /*french*/"le #fantôme rouge# protège", /*spanish*/"un #fantasma rojo# guarda"} - ); + hintTextTable[RHT_FOREST_TEMPLE_MQ_COMPASS_CHEST] = HintText(CustomMessage("They say that a #blue ghost# guards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #fantôme bleu# protège #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, un #fantasma azul# guarda #[[1]]#. + {}, { + CustomMessage("They say that #Beth# guards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #Beth# protège #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, #Beth# guarda #[[1]]#. - hintTable[RHT_FOREST_TEMPLE_MQ_COMPASS_CHEST] = HintText::Exclude({ - //obscure text - Text{"#Beth# guards", /*french*/"#Beth# protège", /*spanish*/"#Beth# guarda"}, - }, {}, - //clear text - Text{"a #blue ghost# guards", /*french*/"le #fantôme bleu# protège", /*spanish*/"un #fantasma azul# guarda"} - ); + hintTextTable[RHT_FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST] = HintText(CustomMessage("They say that beneath a #checkerboard falling ceiling# lies #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, sous #l'échiquier tombant# gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, tras un #techo de ajedrez# yace #[[1]]#. - hintTable[RHT_FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST] = HintText::Exclude({ - //obscure text - Text{"beneath a #checkerboard falling ceiling# lies", /*french*/"sous #l'échiquier tombant# gît", /*spanish*/"tras un #techo de ajedrez# yace"}, - }); + hintTextTable[RHT_FOREST_TEMPLE_MQ_BASEMENT_CHEST] = HintText(CustomMessage("They say that #revolving walls# in the Forest Temple conceal #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, des #murs rotatifs dans la forêt# recèlent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, las #paredes giratorias# del Templo del Bosque conceden #[[1]]#. - hintTable[RHT_FOREST_TEMPLE_MQ_BASEMENT_CHEST] = HintText::Exclude({ - //obscure text - Text{"#revolving walls# in the Forest Temple conceal", /*french*/"des #murs rotatifs dans la forêt# recèlent", /*spanish*/"las #paredes giratorias# del Templo del Bosque conceden"}, - }); + hintTextTable[RHT_FOREST_TEMPLE_MQ_REDEAD_CHEST] = HintText(CustomMessage("They say that deep in the forest #undead guard a chest# containing #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, des #revenants dans le Temple de la Forêt# protègent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, en lo profundo del bosque #guardias del más allá# guardan #[[1]]#. - hintTable[RHT_FOREST_TEMPLE_MQ_REDEAD_CHEST] = HintText::Exclude({ - //obscure text - Text{"deep in the forest #undead guard a chest# containing", /*french*/"des #revenants dans le Temple de la Forêt# protègent", /*spanish*/"en lo profundo del bosque #guardias del más allá# guardan"}, - }); + hintTextTable[RHT_FOREST_TEMPLE_MQ_BOSS_KEY_CHEST] = HintText(CustomMessage("They say that a #turned trunk# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #coffre pivoté# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, en una #sala con otro punto de vista# se esconde #[[1]]#. - hintTable[RHT_FOREST_TEMPLE_MQ_BOSS_KEY_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #turned trunk# contains", /*french*/"le #coffre pivoté# contient", /*spanish*/"en una #sala con otro punto de vista# se esconde"}, - }); + hintTextTable[RHT_FOREST_TEMPLE_PHANTOM_GANON_HEART] = HintText(CustomMessage("They say that #Phantom Ganon# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #Ganon Spectral# possède #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, #Ganon Fantasma# porta #[[1]]#. + {}, { + CustomMessage("They say that the #Evil Spirit from Beyond# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#esprit maléfique de l'au-delà# possède #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, el #espíritu maligno de ultratumba# porta #[[1]]#. - hintTable[RHT_FOREST_TEMPLE_PHANTOM_GANON_HEART] = HintText::Exclude({ - //obscure text - Text{"the #Evil Spirit from Beyond# holds", /*french*/"l'#esprit maléfique de l'au-delà# possède", /*spanish*/"el #espíritu maligno de ultratumba# porta"}, - }, {}, - //clear text - Text{"#Phantom Ganon# holds", /*french*/"#Ganon Spectral# possède", /*spanish*/"#Ganon Fantasma# porta"} - ); + hintTextTable[RHT_FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD] = HintText(CustomMessage("They say that a #spider on a small island# in the Forest Temple holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula sur l'îlot du Temple de la Forêt# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula sobre una pequeña isla# del Templo del Bosque otorga #[[1]]#. - hintTable[RHT_FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD] = HintText::Exclude({ - //obscure text - Text{"a #spider on a small island# in the Forest Temple holds", /*french*/"une #Skulltula sur l'îlot du Temple de la Forêt# a", /*spanish*/"una #Skulltula sobre una pequeña isla# del Templo del Bosque otorga"}, - }); + hintTextTable[RHT_FOREST_TEMPLE_GS_FIRST_ROOM] = HintText(CustomMessage("They say that a #spider high on a wall of vines# in the Forest Temple holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula sur un mur de vignes du Temple de la Forêt# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula en lo alto de una pared de cepas# del Templo del Bosque otorga #[[1]]#. - hintTable[RHT_FOREST_TEMPLE_GS_FIRST_ROOM] = HintText::Exclude({ - //obscure text - Text{"a #spider high on a wall of vines# in the Forest Temple holds", /*french*/"une #Skulltula sur un mur de vignes du Temple de la Forêt# a", /*spanish*/"una #Skulltula en lo alto de una pared de cepas# del Templo del Bosque otorga"}, - }); + hintTextTable[RHT_FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD] = HintText(CustomMessage("They say that #stone columns# lead to a spider in the Forest Temple hiding #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula haut perchée dans le jardin du Temple de la Forêt# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, unas #columnas del Templo del Bosque# conducen a una Skulltula que otorga #[[1]]#. - hintTable[RHT_FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD] = HintText::Exclude({ - //obscure text - Text{"#stone columns# lead to a spider in the Forest Temple hiding", /*french*/"une #Skulltula haut perchée dans le jardin du Temple de la Forêt# a", /*spanish*/"unas #columnas del Templo del Bosque# conducen a una Skulltula que otorga"}, - }); + hintTextTable[RHT_FOREST_TEMPLE_GS_LOBBY] = HintText(CustomMessage("They say that a #spider among ghosts# in the Forest Temple guards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula dans la grande salle du Temple de la Forêt# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula rodeada de fantasmas# del Templo del Bosque otorga #[[1]]#. - hintTable[RHT_FOREST_TEMPLE_GS_LOBBY] = HintText::Exclude({ - //obscure text - Text{"a #spider among ghosts# in the Forest Temple guards", /*french*/"une #Skulltula dans la grande salle du Temple de la Forêt# a", /*spanish*/"una #Skulltula rodeada de fantasmas# del Templo del Bosque otorga"}, - }); + hintTextTable[RHT_FOREST_TEMPLE_GS_BASEMENT] = HintText(CustomMessage("They say that a #spider within revolving walls# in the Forest Temple holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula derrière les murs pivotants du Temple de la Forêt# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula entre paredes giratorias# del Templo del Bosque otorga #[[1]]#. - hintTable[RHT_FOREST_TEMPLE_GS_BASEMENT] = HintText::Exclude({ - //obscure text - Text{"a #spider within revolving walls# in the Forest Temple holds", /*french*/"une #Skulltula derrière les murs pivotants du Temple de la Forêt# a", /*spanish*/"una #Skulltula entre paredes giratorias# del Templo del Bosque otorga"}, - }); + hintTextTable[RHT_FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY] = HintText(CustomMessage("They say that an #ivy-hidden spider# in the Forest Temple hoards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula près de l'entrée du Temple de la Forêt# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula escondida entre cepas# del Templo del Bosque otorga #[[1]]#. + hintTextTable[RHT_FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM] = HintText(CustomMessage("They say that a #spider in a hidden nook# within the Forest Temple holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula dans un recoin caché du Temple de la Forêt# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula en una esquina oculta# del Templo del Bosque otorga #[[1]]#. - hintTable[RHT_FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY] = HintText::Exclude({ - //obscure text - Text{"an #ivy-hidden spider# in the Forest Temple hoards", /*french*/"une #Skulltula près de l'entrée du Temple de la Forêt# a", /*spanish*/"una #Skulltula escondida entre cepas# del Templo del Bosque otorga"}, - }); - - hintTable[RHT_FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM] = HintText::Exclude({ - //obscure text - Text{"a #spider in a hidden nook# within the Forest Temple holds", /*french*/"une #Skulltula dans un recoin caché du Temple de la Forêt# a", /*spanish*/"una #Skulltula en una esquina oculta# del Templo del Bosque otorga"}, - }); - - hintTable[RHT_FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD] = HintText::Exclude({ - //obscure text - Text{"a #spider on an arch# in the Forest Temple holds", /*french*/"une #Skulltula sur une arche du Temple de la Forêt# a", /*spanish*/"una #Skulltula sobre un arco# del Templo del Bosque otorga"}, - }); - - hintTable[RHT_FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD] = HintText::Exclude({ - //obscure text - Text{"a #spider on a ledge# in the Forest Temple holds", /*french*/"une #Skulltula dans le jardin du Temple de la Forêt# a", /*spanish*/"una #Skulltula en un borde# del Templo del Bosque otorga"}, - }); - - hintTable[RHT_FOREST_TEMPLE_MQ_GS_WELL] = HintText::Exclude({ - //obscure text - Text{"#draining a well# in Forest Temple uncovers a spider with", /*french*/"une #Skulltula au fond du Puits du Temple de la Forêt# a", /*spanish*/"#vaciar el pozo# del Templo del Bosque desvela una Skulltula que otorga"}, - }); + hintTextTable[RHT_FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD] = HintText(CustomMessage("They say that a #spider on an arch# in the Forest Temple holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula sur une arche du Temple de la Forêt# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula sobre un arco# del Templo del Bosque otorga #[[1]]#. + hintTextTable[RHT_FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD] = HintText(CustomMessage("They say that a #spider on a ledge# in the Forest Temple holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula dans le jardin du Temple de la Forêt# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula en un borde# del Templo del Bosque otorga #[[1]]#. + hintTextTable[RHT_FOREST_TEMPLE_MQ_GS_WELL] = HintText(CustomMessage("They say that #draining a well# in Forest Temple uncovers a spider with #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula au fond du Puits du Temple de la Forêt# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #vaciar el pozo# del Templo del Bosque desvela una Skulltula que otorga #[[1]]#. + /*-------------------------- | FIRE TEMPLE | ---------------------------*/ - hintTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText::Exclude({ - //obscure text - Text{"#near a dragon# is", /*french*/"#près d'un dragon# gît", /*spanish*/"#cerca de un dragón# yace"}, - }); +hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They say that #near a dragon# is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #près d'un dragon# gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #cerca de un dragón# yace #[[1]]#. - hintTable[RHT_FIRE_TEMPLE_FLARE_DANCER_CHEST] = HintText::Exclude({ - //obscure text - Text{"the #Flare Dancer behind a totem# guards", /*french*/"le #Danse-Flamme derrière un totem# protège", /*spanish*/"el #Bailafuego tras unos tótems# esconde"}, - }); + hintTextTable[RHT_FIRE_TEMPLE_FLARE_DANCER_CHEST] = HintText(CustomMessage("They say that the #Flare Dancer behind a totem# guards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #Danse-Flamme derrière un totem# protège #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #Bailafuego tras unos tótems# esconde #[[1]]#. - hintTable[RHT_FIRE_TEMPLE_BOSS_KEY_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #prison beyond a totem# holds", /*french*/"la #prison derrière un totem# contient", /*spanish*/"en una #prisión tras unos tótems# yace"}, - }); + hintTextTable[RHT_FIRE_TEMPLE_BOSS_KEY_CHEST] = HintText(CustomMessage("They say that a #prison beyond a totem# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #prison derrière un totem# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, en una #prisión tras unos tótems# yace #[[1]]#. - hintTable[RHT_FIRE_TEMPLE_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST] = HintText::Exclude({ - //obscure text - Text{"#explosives over a lava pit# unveil", /*french*/"des #explosifs dans un lac de lave# révèlent", /*spanish*/"los #explosivos en un mar de llamas# revelan"}, - }); + hintTextTable[RHT_FIRE_TEMPLE_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST] = HintText(CustomMessage("They say that #explosives over a lava pit# unveil #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, des #explosifs dans un lac de lave# révèlent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, los #explosivos en un mar de llamas# revelan #[[1]]#. - hintTable[RHT_FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #Goron trapped near lava# holds", /*french*/"le #Goron emprisonné près de la lave# a", /*spanish*/"un #goron atrapado cerca de un mar de llamas# guarda"}, - }); + hintTextTable[RHT_FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST] = HintText(CustomMessage("They say that a #Goron trapped near lava# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #Goron emprisonné près de la lave# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #goron atrapado cerca de un mar de llamas# guarda #[[1]]#. - hintTable[RHT_FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #Goron at the end of a maze# holds", /*french*/"le #Goron dans le labyrinthe# a", /*spanish*/"un #goron al final de un laberinto# guarda"}, - }); + hintTextTable[RHT_FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST] = HintText(CustomMessage("They say that a #Goron at the end of a maze# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #Goron dans le labyrinthe# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #goron al final de un laberinto# guarda #[[1]]#. - hintTable[RHT_FIRE_TEMPLE_BOULDER_MAZE_UPPER_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #Goron above a maze# holds", /*french*/"le #Goron au dessus du labyrinthe# a", /*spanish*/"un #goron sobre un laberinto# guarda"}, - }); + hintTextTable[RHT_FIRE_TEMPLE_BOULDER_MAZE_UPPER_CHEST] = HintText(CustomMessage("They say that a #Goron above a maze# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #Goron au dessus du labyrinthe# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #goron sobre un laberinto# guarda #[[1]]#. - hintTable[RHT_FIRE_TEMPLE_BOULDER_MAZE_SIDE_ROOM_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #Goron hidden near a maze# holds", /*french*/"le #Goron caché près du labyrinthe# a", /*spanish*/"un #goron escondido tras un laberinto# guarda"}, - }); + hintTextTable[RHT_FIRE_TEMPLE_BOULDER_MAZE_SIDE_ROOM_CHEST] = HintText(CustomMessage("They say that a #Goron hidden near a maze# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #Goron caché près du labyrinthe# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #goron escondido tras un laberinto# guarda #[[1]]#. - hintTable[RHT_FIRE_TEMPLE_BOULDER_MAZE_SHORTCUT_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #blocked path# in Fire Temple holds", /*french*/"un #sol fragile dans le Temple du Feu# contient", /*spanish*/"en un #camino bloqueado# del Templo del Fuego yace"}, - }); + hintTextTable[RHT_FIRE_TEMPLE_BOULDER_MAZE_SHORTCUT_CHEST] = HintText(CustomMessage("They say that a #blocked path# in Fire Temple holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, un #sol fragile dans le Temple du Feu# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, en un #camino bloqueado# del Templo del Fuego yace #[[1]]#. - hintTable[RHT_FIRE_TEMPLE_MAP_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #caged chest# in the Fire Temple hoards", /*french*/"un #coffre emprisonné# dans le Temple du Feu contient", /*spanish*/"un #cofre entre rejas# del Templo del Fuego contiene"}, - }); + hintTextTable[RHT_FIRE_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say that a #caged chest# in the Fire Temple hoards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, un #coffre emprisonné# dans le Temple du Feu contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #cofre entre rejas# del Templo del Fuego contiene #[[1]]#. - hintTable[RHT_FIRE_TEMPLE_COMPASS_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #chest in a fiery maze# contains", /*french*/"un #coffre dans un labyrinthe enflammé# contient", /*spanish*/"un #cofre de un ardiente laberinto# contiene"}, - }); + hintTextTable[RHT_FIRE_TEMPLE_COMPASS_CHEST] = HintText(CustomMessage("They say that a #chest in a fiery maze# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, un #coffre dans un labyrinthe enflammé# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #cofre de un ardiente laberinto# contiene #[[1]]#. - hintTable[RHT_FIRE_TEMPLE_HIGHEST_GORON_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #Goron atop the Fire Temple# holds", /*french*/"le #Goron au sommet du Temple du Feu# a", /*spanish*/"un #goron en lo alto del Templo del Fuego# guarda"}, - }); + hintTextTable[RHT_FIRE_TEMPLE_HIGHEST_GORON_CHEST] = HintText(CustomMessage("They say that a #Goron atop the Fire Temple# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #Goron au sommet du Temple du Feu# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #goron en lo alto del Templo del Fuego# guarda #[[1]]#. + hintTextTable[RHT_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST] = HintText(CustomMessage("They say that #near a dragon# is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #près d'un dragon# gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #cerca de un dragón# yace #[[1]]#. - hintTable[RHT_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST] = HintText::Exclude({ - //obscure text - Text{"#near a dragon# is", /*french*/"#près d'un dragon# gît", /*spanish*/"#cerca de un dragón# yace"}, - }); + hintTextTable[RHT_FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST] = HintText(CustomMessage("They say that the #Flare Dancer in the depths of the Fire Temple# guards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #Danse-Flamme au coeur du volcan# a #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, el #Bailafuego en lo profundo del Templo del Fuego# esconde #[[1]]#. + {}, { + CustomMessage("They say that the #Flare Dancer in the depths of a volcano# guards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #Danse-Flamme au coeur du volcan# a #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, el #Bailafuego en lo profundo del volcán# esconde #[[1]]#. - hintTable[RHT_FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST] = HintText::Exclude({ - //obscure text - Text{"the #Flare Dancer in the depths of a volcano# guards", /*french*/"le #Danse-Flamme au coeur du volcan# a", /*spanish*/"el #Bailafuego en lo profundo del volcán# esconde"}, - }, {}, - //clear text - Text{"the #Flare Dancer in the depths of the Fire Temple# guards", /*french*/"le #Danse-Flamme au coeur du volcan# a", /*spanish*/"el #Bailafuego en lo profundo del Templo del Fuego# esconde"} - ); + hintTextTable[RHT_FIRE_TEMPLE_MQ_COMPASS_CHEST] = HintText(CustomMessage("They say that a #blocked path# in Fire Temple holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #chemin scellé# dans le Temple du Feu contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, en un #camino bloqueado# del Templo del Fuego yace #[[1]]#. - hintTable[RHT_FIRE_TEMPLE_MQ_COMPASS_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #blocked path# in Fire Temple holds", /*french*/"le #chemin scellé# dans le Temple du Feu contient", /*spanish*/"en un #camino bloqueado# del Templo del Fuego yace"}, - }); + hintTextTable[RHT_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST] = HintText(CustomMessage("They say that #crates in a maze# contain #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, des #boîtes dans le labyrinthe# contiennent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, las #cajas de un laberinto# contienen #[[1]]#. - hintTable[RHT_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST] = HintText::Exclude({ - //obscure text - Text{"#crates in a maze# contain", /*french*/"des #boîtes dans le labyrinthe# contiennent", /*spanish*/"las #cajas de un laberinto# contienen"}, - }); + hintTextTable[RHT_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST] = HintText(CustomMessage("They say that #crates in a maze# contain #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, des #boîtes dans le labyrinthe# contiennent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, las #cajas de un laberinto# contienen #[[1]]#. - hintTable[RHT_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST] = HintText::Exclude({ - //obscure text - Text{"#crates in a maze# contain", /*french*/"des #boîtes dans le labyrinthe# contiennent", /*spanish*/"las #cajas de un laberinto# contienen"}, - }); + hintTextTable[RHT_FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST] = HintText(CustomMessage("They say that a #falling slug# in the Fire Temple guards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #limace tombante# dans le Temple du Feu protège #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #babosa del techo# del Templo del Fuego guarda #[[1]]#. - hintTable[RHT_FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #falling slug# in the Fire Temple guards", /*french*/"la #limace tombante# dans le Temple du Feu protège", /*spanish*/"una #babosa del techo# del Templo del Fuego guarda"}, - }); + hintTextTable[RHT_FIRE_TEMPLE_MQ_MAP_CHEST] = HintText(CustomMessage("They say that using a #hammer in the depths of the Fire Temple# reveals #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, frapper du #marteau au coeur du volcan# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, usar el #martillo en lo profundo del Templo del Fuego# revela #[[1]]#. - hintTable[RHT_FIRE_TEMPLE_MQ_MAP_CHEST] = HintText::Exclude({ - //obscure text - Text{"using a #hammer in the depths of the Fire Temple# reveals", "frapper du #marteau au coeur du volcan# révèle", /*spanish*/"usar el #martillo en lo profundo del Templo del Fuego# revela"}, - }); + hintTextTable[RHT_FIRE_TEMPLE_MQ_BOSS_KEY_CHEST] = HintText(CustomMessage("They say that #illuminating a lava pit# reveals the path to #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #éclairer le lac de lave# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #iluminar un mar de llamas# revela #[[1]]#. - hintTable[RHT_FIRE_TEMPLE_MQ_BOSS_KEY_CHEST] = HintText::Exclude({ - //obscure text - Text{"#illuminating a lava pit# reveals the path to", /*french*/"#éclairer le lac de lave# révèle", /*spanish*/"#iluminar un mar de llamas# revela"}, - }); + hintTextTable[RHT_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST] = HintText(CustomMessage("They say that #explosives over a lava pit# unveil #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, des #explosifs dans un lac de lave# révèlent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, los #explosivos en un mar de llamas# revelan #[[1]]#. - hintTable[RHT_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST] = HintText::Exclude({ - //obscure text - Text{"#explosives over a lava pit# unveil", /*french*/"des #explosifs dans un lac de lave# révèlent", /*spanish*/"los #explosivos en un mar de llamas# revelan"}, - }); + hintTextTable[RHT_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST] = HintText(CustomMessage("They say that a #Goron hidden near a maze# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #Goron caché près du labyrinthe# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #goron cerca de un laberinto# guarda #[[1]]#. - hintTable[RHT_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #Goron hidden near a maze# holds", /*french*/"le #Goron caché près du labyrinthe# a", /*spanish*/"un #goron cerca de un laberinto# guarda"}, - }); + hintTextTable[RHT_FIRE_TEMPLE_MQ_FREESTANDING_KEY] = HintText(CustomMessage("They say that hidden #beneath a block of stone# lies #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, caché #derrière un bloc de pierre# gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #bajo unos bloques de piedra# yace #[[1]]#. - hintTable[RHT_FIRE_TEMPLE_MQ_FREESTANDING_KEY] = HintText::Exclude({ - //obscure text - Text{"hidden #beneath a block of stone# lies", /*french*/"caché #derrière un bloc de pierre# gît", /*spanish*/"#bajo unos bloques de piedra# yace"}, - }); + hintTextTable[RHT_FIRE_TEMPLE_VOLVAGIA_HEART] = HintText(CustomMessage("They say that #Volvagia# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #Volvagia# possède #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, #Volvagia# porta #[[1]]#. + {}, { + CustomMessage("They say that the #Subterranean Lava Dragon# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #dragon des profondeurs# possède #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, el #dragón de lava subterráneo# porta #[[1]]#. - hintTable[RHT_FIRE_TEMPLE_VOLVAGIA_HEART] = HintText::Exclude({ - //obscure text - Text{"the #Subterranean Lava Dragon# holds", /*french*/"le #dragon des profondeurs# possède", /*spanish*/"el #dragón de lava subterráneo# porta"}, - }, {}, - //clear text - Text{"#Volvagia# holds", /*french*/"#Volvagia# possède", /*spanish*/"#Volvagia# porta"} - ); + hintTextTable[RHT_FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM] = HintText(CustomMessage("They say that #eight tiles of malice# guard a spider holding #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula protégée par huit tuiles dans le Temple du Feu# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #ocho baldosas de maldad# custodian una Skulltula que otorga #[[1]]#. - hintTable[RHT_FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM] = HintText::Exclude({ - //obscure text - Text{"#eight tiles of malice# guard a spider holding", /*french*/"une #Skulltula protégée par huit tuiles dans le Temple du Feu# a", /*spanish*/"#ocho baldosas de maldad# custodian una Skulltula que otorga"}, - }); + hintTextTable[RHT_FIRE_TEMPLE_GS_BOSS_KEY_LOOP] = HintText(CustomMessage("They say that #five tiles of malice# guard a spider holding #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula protégée par cinq tuiles dans le Temple du Feu# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #cinco baldosas de maldad# custodian una Skulltula que otorga #[[1]]#. - hintTable[RHT_FIRE_TEMPLE_GS_BOSS_KEY_LOOP] = HintText::Exclude({ - //obscure text - Text{"#five tiles of malice# guard a spider holding", /*french*/"une #Skulltula protégée par cinq tuiles dans le Temple du Feu# a", /*spanish*/"#cinco baldosas de maldad# custodian una Skulltula que otorga"}, - }); + hintTextTable[RHT_FIRE_TEMPLE_GS_BOULDER_MAZE] = HintText(CustomMessage("They say that #explosives in a maze# unveil a spider hiding #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula derrière un mur fragile du Temple du Feu# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, los #explosivos en un laberinto# desvelan una Skulltula que otorga #[[1]]#. - hintTable[RHT_FIRE_TEMPLE_GS_BOULDER_MAZE] = HintText::Exclude({ - //obscure text - Text{"#explosives in a maze# unveil a spider hiding", /*french*/"une #Skulltula derrière un mur fragile du Temple du Feu# a", /*spanish*/"los #explosivos en un laberinto# desvelan una Skulltula que otorga"}, - }); + hintTextTable[RHT_FIRE_TEMPLE_GS_SCARECROW_TOP] = HintText(CustomMessage("They say that a #spider-friendly scarecrow# atop the Fire Temple hides #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula repérée par l'épouvantail du Temple du Feu# a #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, un #espantapájaros del Templo del Fuego# custodia una Skulltula que otorga #[[1]]#. + {}, { + CustomMessage("They say that a #spider-friendly scarecrow# atop a volcano hides #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula repérée par l'épouvantail du volcan# a #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, un #espantapájaros en lo alto de un volcán# custodia una Skulltula que otorga #[[1]]#. - hintTable[RHT_FIRE_TEMPLE_GS_SCARECROW_TOP] = HintText::Exclude({ - //obscure text - Text{"a #spider-friendly scarecrow# atop a volcano hides", /*french*/"une #Skulltula repérée par l'épouvantail du volcan# a", /*spanish*/"un #espantapájaros en lo alto de un volcán# custodia una Skulltula que otorga"}, - }, {}, - //clear text - Text{"a #spider-friendly scarecrow# atop the Fire Temple hides", /*french*/"une #Skulltula repérée par l'épouvantail du Temple du Feu# a", /*spanish*/"un #espantapájaros del Templo del Fuego# custodia una Skulltula que otorga"} - ); + hintTextTable[RHT_FIRE_TEMPLE_GS_SCARECROW_CLIMB] = HintText(CustomMessage("They say that a #spider-friendly scarecrow# atop the Fire Temple hides #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula repérée par l'épouvantail du Temple du Feu# a #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, un #espantapájaros del Templo del Fuego# custodia una Skulltula que otorga #[[1]]#. + {}, { + CustomMessage("They say that a #spider-friendly scarecrow# atop a volcano hides #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula repérée par l'épouvantail du volcan# a #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, un #espantapájaros en lo alto de un volcán# custodia una Skulltula que otorga #[[1]]#. - hintTable[RHT_FIRE_TEMPLE_GS_SCARECROW_CLIMB] = HintText::Exclude({ - //obscure text - Text{"a #spider-friendly scarecrow# atop a volcano hides", /*french*/"une #Skulltula repérée par l'épouvantail du volcan# a", /*spanish*/"un #espantapájaros en lo alto de un volcán# custodia una Skulltula que otorga"}, - }, {}, - //clear text - Text{"a #spider-friendly scarecrow# atop the Fire Temple hides", /*french*/"une #Skulltula repérée par l'épouvantail du Temple du Feu# a", /*spanish*/"un #espantapájaros del Templo del Fuego# custodia una Skulltula que otorga"} - ); + hintTextTable[RHT_FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE] = HintText(CustomMessage("They say that a #spider above a fiery maze# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula au dessus du labyrinthe enflammé du Temple du Feu# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula sobre un ardiente laberinto# otorga #[[1]]#. + hintTextTable[RHT_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER] = HintText(CustomMessage("They say that a #spider within a fiery maze# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula dans le labyrinthe enflammé du Temple du Feu# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula en el interior de un ardiente laberinto# otorga #[[1]]#. - hintTable[RHT_FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE] = HintText::Exclude({ - //obscure text - Text{"a #spider above a fiery maze# holds", /*french*/"une #Skulltula au dessus du labyrinthe enflammé du Temple du Feu# a", /*spanish*/"una #Skulltula sobre un ardiente laberinto# otorga"}, - }); + hintTextTable[RHT_FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR] = HintText(CustomMessage("They say that a #Goron trapped near lava# befriended a spider with #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula emprisonnée près du lac de lave du Temple du Feu# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula amiga de un Goron atrapado junto a la lava# otorga #[[1]]#. - hintTable[RHT_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER] = HintText::Exclude({ - //obscure text - Text{"a #spider within a fiery maze# holds", /*french*/"une #Skulltula dans le labyrinthe enflammé du Temple du Feu# a", /*spanish*/"una #Skulltula en el interior de un ardiente laberinto# otorga"}, - }); - - hintTable[RHT_FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR] = HintText::Exclude({ - //obscure text - Text{"a #Goron trapped near lava# befriended a spider with", /*french*/"une #Skulltula emprisonnée près du lac de lave du Temple du Feu# a", /*spanish*/"una #Skulltula amiga de un Goron atrapado junto a la lava# otorga"}, - }); - - hintTable[RHT_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM] = HintText::Exclude({ - //obscure text - Text{"a #spider beside a fiery maze# holds", /*french*/"une #Skulltula près du labyrinthe enflammé du Temple du Feu# a", /*spanish*/"una #Skulltula junto a un ardiente laberinto# otorga"}, - }); + hintTextTable[RHT_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM] = HintText(CustomMessage("They say that a #spider beside a fiery maze# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula près du labyrinthe enflammé du Temple du Feu# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula junto a un ardiente laberinto# otorga #[[1]]#. /*-------------------------- | WATER TEMPLE | ---------------------------*/ - hintTable[RHT_WATER_TEMPLE_MAP_CHEST] = HintText::Exclude({ - //obscure text - Text{"#rolling spikes# in the Water Temple surround", /*french*/"des #Spikes# dans le Temple de l'Eau entourent", /*spanish*/"unas #rodantes púas# del Templo del Agua guardan"}, - }); + hintTextTable[RHT_WATER_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say that #rolling spikes# in the Water Temple surround #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, des #Spikes# dans le Temple de l'Eau entourent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, unas #rodantes púas# del Templo del Agua guardan #[[1]]#. - hintTable[RHT_WATER_TEMPLE_COMPASS_CHEST] = HintText::Exclude({ - //obscure text - Text{"#roaming stingers in the Water Temple# guard", /*french*/"des #raies dans le Temple de l'Eau# protègent", /*spanish*/"unos #errantes stingers# del Templo del Agua guardan"}, - }); + hintTextTable[RHT_WATER_TEMPLE_COMPASS_CHEST] = HintText(CustomMessage("They say that #roaming stingers in the Water Temple# guard #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, des #raies dans le Temple de l'Eau# protègent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, unos #errantes stingers# del Templo del Agua guardan #[[1]]#. - hintTable[RHT_WATER_TEMPLE_TORCHES_CHEST] = HintText::Exclude({ - //obscure text - Text{"#fire in the Water Temple# reveals", /*french*/"des #flammes dans le Temple de l'Eau# révèlent", /*spanish*/"el #fuego en el Templo del Agua# revela"}, - }); + hintTextTable[RHT_WATER_TEMPLE_TORCHES_CHEST] = HintText(CustomMessage("They say that #fire in the Water Temple# reveals #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, des #flammes dans le Temple de l'Eau# révèlent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #fuego en el Templo del Agua# revela #[[1]]#. - hintTable[RHT_WATER_TEMPLE_DRAGON_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #serpent's prize# in the Water Temple is", /*french*/"la #récompense du dragon submergé# est", /*spanish*/"el #escamado premio# del Templo del Agua se trata de"}, - }); + hintTextTable[RHT_WATER_TEMPLE_DRAGON_CHEST] = HintText(CustomMessage("They say that a #serpent's prize# in the Water Temple is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #récompense du dragon submergé# est #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #escamado premio# del Templo del Agua se trata de #[[1]]#. - hintTable[RHT_WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST] = HintText::Exclude({ - //obscure text - Text{"#blinding an eye# in the Water Temple leads to", /*french*/"#l'oeil# du Temple de l'Eau voit", /*spanish*/"#cegar un ojo# del Templo del Agua conduce a"}, - }); + hintTextTable[RHT_WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST] = HintText(CustomMessage("They say that #blinding an eye# in the Water Temple leads to #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #l'oeil# du Temple de l'Eau voit #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #cegar un ojo# del Templo del Agua conduce a #[[1]]#. - hintTable[RHT_WATER_TEMPLE_CENTRAL_PILLAR_CHEST] = HintText::Exclude({ - //obscure text - Text{"in the #depths of the Water Temple# lies", /*french*/"le #coeur du Temple de l'Eau# cache", /*spanish*/"en las #profundidades del Templo del Agua# yace"}, - }); + hintTextTable[RHT_WATER_TEMPLE_CENTRAL_PILLAR_CHEST] = HintText(CustomMessage("They say that in the #depths of the Water Temple# lies #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #coeur du Temple de l'Eau# cache #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, en las #profundidades del Templo del Agua# yace #[[1]]#. - hintTable[RHT_WATER_TEMPLE_CRACKED_WALL_CHEST] = HintText::Exclude({ - //obscure text - Text{"#through a crack# in the Water Temple is", /*french*/"le #mur fragile# du Temple de l'Eau cache", /*spanish*/"tras una #agrietada pared# del Templo del Agua yace"}, - }); + hintTextTable[RHT_WATER_TEMPLE_CRACKED_WALL_CHEST] = HintText(CustomMessage("They say that #through a crack# in the Water Temple is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #mur fragile# du Temple de l'Eau cache #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, tras una #agrietada pared# del Templo del Agua yace #[[1]]#. - hintTable[RHT_WATER_TEMPLE_LONGSHOT_CHEST] = HintText::Exclude({ - //obscure text - Text{"#facing yourself# reveals", /*french*/"se #vaincre soi-même# révèle", /*spanish*/"#luchar contra ti mismo# revela"}, - Text{"a #dark reflection# of yourself guards", /*french*/"son #propre reflet# cache", /*spanish*/"el #oscuro reflejo de ti mismo# guarda"}, - }, {}, - //clear text - Text{"#Dark Link# guards", /*french*/"l'#Ombre de @# protège", /*spanish*/"#@ Oscuro# guarda"} - ); + hintTextTable[RHT_WATER_TEMPLE_LONGSHOT_CHEST] = HintText(CustomMessage("They say that #Dark Link# guards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#Ombre de @# protège #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, #@ Oscuro# guarda #[[1]]#. + {}, { + CustomMessage("They say that #facing yourself# reveals #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, se #vaincre soi-même# révèle #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, #luchar contra ti mismo# revela #[[1]]#. + CustomMessage("They say that a #dark reflection# of yourself guards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, son #propre reflet# cache #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, el #oscuro reflejo de ti mismo# guarda #[[1]]#. + hintTextTable[RHT_WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST] = HintText(CustomMessage("They say that in the #depths of the Water Temple# lies #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #coeur du Temple de l'Eau# cache #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, en las #profundidades del Templo del Agua# yace #[[1]]#. - hintTable[RHT_WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST] = HintText::Exclude({ - //obscure text - Text{"in the #depths of the Water Temple# lies", /*french*/"le #coeur du Temple de l'Eau# cache", /*spanish*/"en las #profundidades del Templo del Agua# yace"}, - }); + hintTextTable[RHT_WATER_TEMPLE_MQ_BOSS_KEY_CHEST] = HintText(CustomMessage("They say that fire in the Water Temple unlocks a #vast gate# revealing a chest with #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, des #flammes au coeur du Temple de l'Eau# révèlent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el fuego en el Templo del Agua alza una #gran valla# con #[[1]]#. - hintTable[RHT_WATER_TEMPLE_MQ_BOSS_KEY_CHEST] = HintText::Exclude({ - //obscure text - Text{"fire in the Water Temple unlocks a #vast gate# revealing a chest with", /*french*/"des #flammes au coeur du Temple de l'Eau# révèlent", /*spanish*/"el fuego en el Templo del Agua alza una #gran valla# con"}, - }); + hintTextTable[RHT_WATER_TEMPLE_MQ_LONGSHOT_CHEST] = HintText(CustomMessage("They say that #through a crack# in the Water Temple is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #mur fragile# du Temple de l'Eau cache #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, tras una #agrietada pared# del Templo del Agua yace #[[1]]#. - hintTable[RHT_WATER_TEMPLE_MQ_LONGSHOT_CHEST] = HintText::Exclude({ - //obscure text - Text{"#through a crack# in the Water Temple is", /*french*/"le #mur fragile# du Temple de l'Eau cache", /*spanish*/"tras una #agrietada pared# del Templo del Agua yace"}, - }); + hintTextTable[RHT_WATER_TEMPLE_MQ_COMPASS_CHEST] = HintText(CustomMessage("They say that #fire in the Water Temple# reveals #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, des #flammes dans le Temple de l'Eau# révèlent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #fuego en el Templo del Agua# revela #[[1]]#. - hintTable[RHT_WATER_TEMPLE_MQ_COMPASS_CHEST] = HintText::Exclude({ - //obscure text - Text{"#fire in the Water Temple# reveals", /*french*/"des #flammes dans le Temple de l'Eau# révèlent", /*spanish*/"el #fuego en el Templo del Agua# revela"}, - }); + hintTextTable[RHT_WATER_TEMPLE_MQ_MAP_CHEST] = HintText(CustomMessage("They say that #sparring soldiers# in the Water Temple guard #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #soldats du Temple de l'Eau# protègent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #acabar con unos soldados# del Templo del Agua revela #[[1]]#. - hintTable[RHT_WATER_TEMPLE_MQ_MAP_CHEST] = HintText::Exclude({ - //obscure text - Text{"#sparring soldiers# in the Water Temple guard", /*french*/"les #soldats du Temple de l'Eau# protègent", /*spanish*/"#acabar con unos soldados# del Templo del Agua revela"}, - }); + hintTextTable[RHT_WATER_TEMPLE_MORPHA_HEART] = HintText(CustomMessage("They say that #Morpha# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #Morpha# possède #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, #Morpha# porta #[[1]]#. + {}, { + CustomMessage("They say that the #Giant Aquatic Amoeba# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#amibe aquatique géante# possède #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, la #ameba acuática gigante# porta #[[1]]#. - hintTable[RHT_WATER_TEMPLE_MORPHA_HEART] = HintText::Exclude({ - //obscure text - Text{"the #Giant Aquatic Amoeba# holds", /*french*/"l'#amibe aquatique géante# possède", /*spanish*/"la #ameba acuática gigante# porta"}, - }, {}, - //clear text - Text{"#Morpha# holds", /*french*/"#Morpha# possède", /*spanish*/"#Morpha# porta"} - ); + hintTextTable[RHT_WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM] = HintText(CustomMessage("They say that a #spider over a waterfall# in the Water Temple holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula au dessus d'une cascade du Temple de l'Eau# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula tras una cascada# del Templo del Agua otorga #[[1]]#. - hintTable[RHT_WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM] = HintText::Exclude({ - //obscure text - Text{"a #spider over a waterfall# in the Water Temple holds", /*french*/"une #Skulltula au dessus d'une cascade du Temple de l'Eau# a", /*spanish*/"una #Skulltula tras una cascada# del Templo del Agua otorga"}, - }); + hintTextTable[RHT_WATER_TEMPLE_GS_CENTRAL_PILLAR] = HintText(CustomMessage("They say that a #spider in the center of the Water Temple# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula au centre du Temple de l'Eau# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula en el centro del Templo del Agua# otorga #[[1]]#. - hintTable[RHT_WATER_TEMPLE_GS_CENTRAL_PILLAR] = HintText::Exclude({ - //obscure text - Text{"a #spider in the center of the Water Temple# holds", /*french*/"une #Skulltula au centre du Temple de l'Eau# a", /*spanish*/"una #Skulltula en el centro del Templo del Agua# otorga"}, - }); + hintTextTable[RHT_WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST] = HintText(CustomMessage("They say that a spider protected by #rolling boulders in the Water Temple# hides #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula derrière les rochers roulants du Temple de l'Eau# a #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, una #Skulltula protegida por rocas rodantes# del Templo del Agua otorga #[[1]]#. + {}, { + CustomMessage("They say that a spider protected by #rolling boulders under the lake# hides #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula derrière les rochers roulants sous le lac# a #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, una #Skulltula protegida por rocas rodantes# bajo el lago otorga #[[1]]#. - hintTable[RHT_WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST] = HintText::Exclude({ - //obscure text - Text{"a spider protected by #rolling boulders under the lake# hides", /*french*/"une #Skulltula derrière les rochers roulants sous le lac# a", /*spanish*/"una #Skulltula protegida por rocas rodantes# bajo el lago otorga"}, - }, {}, - //clear text - Text{"a spider protected by #rolling boulders in the Water Temple# hides", /*french*/"une #Skulltula derrière les rochers roulants du Temple de l'Eau# a", /*spanish*/"una #Skulltula protegida por rocas rodantes# del Templo del Agua otorga"} - ); + hintTextTable[RHT_WATER_TEMPLE_GS_RIVER] = HintText(CustomMessage("They say that a #spider over a river# in the Water Temple holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula au dessus de la rivière du Temple de l'Eau# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula sobre un río# del Templo del Agua otorga #[[1]]#. - hintTable[RHT_WATER_TEMPLE_GS_RIVER] = HintText::Exclude({ - //obscure text - Text{"a #spider over a river# in the Water Temple holds", /*french*/"une #Skulltula au dessus de la rivière du Temple de l'Eau# a", /*spanish*/"una #Skulltula sobre un río# del Templo del Agua otorga"}, - }); + hintTextTable[RHT_WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH] = HintText(CustomMessage("They say that #beyond a pit of lizards# is a spider holding #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula près des lézards du Temple de l'Eau# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #más allá de un pozo de reptiles# una Skulltula otorga #[[1]]#. + hintTextTable[RHT_WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY] = HintText(CustomMessage("They say that #lizards guard a spider# in the Water Temple with #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula dans les couloirs croisés du Temple de l'Eau# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, unos #reptiles custodian una Skulltula# del Templo del Agua que otorga #[[1]]#. - hintTable[RHT_WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH] = HintText::Exclude({ - //obscure text - Text{"#beyond a pit of lizards# is a spider holding", /*french*/"une #Skulltula près des lézards du Temple de l'Eau# a", /*spanish*/"#más allá de un pozo de reptiles# una Skulltula otorga"}, - }); - - hintTable[RHT_WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY] = HintText::Exclude({ - //obscure text - Text{"#lizards guard a spider# in the Water Temple with", /*french*/"une #Skulltula dans les couloirs croisés du Temple de l'Eau# a", /*spanish*/"unos #reptiles custodian una Skulltula# del Templo del Agua que otorga"}, - }); - - hintTable[RHT_WATER_TEMPLE_MQ_GS_RIVER] = HintText::Exclude({ - //obscure text - Text{"a #spider over a river# in the Water Temple holds", /*french*/"une #Skulltula au dessus de la rivière du Temple de l'Eau# a", /*spanish*/"una #Skulltula sobre un río# del Templo del Agua otorga"}, - }); + hintTextTable[RHT_WATER_TEMPLE_MQ_GS_RIVER] = HintText(CustomMessage("They say that a #spider over a river# in the Water Temple holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula au dessus de la rivière du Temple de l'Eau# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula sobre un río# del Templo del Agua otorga #[[1]]#. /*-------------------------- | SPIRIT TEMPLE | ---------------------------*/ - hintTable[RHT_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST] = HintText::Exclude({ - //obscure text - Text{"a child conquers a #skull in green fire# in the Spirit Temple to reach", /*french*/"le #crâne au halo vert dans le colosse# cache", /*spanish*/"el joven que #baje el puente# del Templo del Espíritu encontrará"}, - }); + hintTextTable[RHT_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST] = HintText(CustomMessage("They say that a child conquers a #skull in green fire# in the Spirit Temple to reach #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #crâne au halo vert dans le colosse# cache #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el joven que #baje el puente# del Templo del Espíritu encontrará #[[1]]#. - hintTable[RHT_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST] = HintText::Exclude({ - //obscure text - Text{"a child can find a #caged chest# in the Spirit Temple with", /*french*/"le #coffre embarré dans le colosse# contient", /*spanish*/"un joven puede encontrar un #cofre entre rejas# del Templo del Espíritu con"}, - }); + hintTextTable[RHT_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST] = HintText(CustomMessage("They say that a child can find a #caged chest# in the Spirit Temple with #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #coffre embarré dans le colosse# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un joven puede encontrar un #cofre entre rejas# del Templo del Espíritu con #[[1]]#. - hintTable[RHT_SPIRIT_TEMPLE_COMPASS_CHEST] = HintText::Exclude({ - //obscure text - Text{"#across a pit of sand# in the Spirit Temple lies", /*french*/"le #trou sableux dans le colosse# a", /*spanish*/"tras un #pozo de arena# del Templo del Espíritu yace"}, - }); + hintTextTable[RHT_SPIRIT_TEMPLE_COMPASS_CHEST] = HintText(CustomMessage("They say that #across a pit of sand# in the Spirit Temple lies #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #trou sableux dans le colosse# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, tras un #pozo de arena# del Templo del Espíritu yace #[[1]]#. - hintTable[RHT_SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST] = HintText::Exclude({ - //obscure text - Text{"#dodging boulders to collect silver rupees# in the Spirit Temple yields", /*french*/"les #pièces argentées entourées de rochers dans le colosse# révèlent", /*spanish*/"#esquivar rocas y conseguir plateadas rupias# en el Templo del Espíritu conduce a"}, - }); + hintTextTable[RHT_SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST] = HintText(CustomMessage("They say that #dodging boulders to collect silver rupees# in the Spirit Temple yields #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #pièces argentées entourées de rochers dans le colosse# révèlent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #esquivar rocas y conseguir plateadas rupias# en el Templo del Espíritu conduce a #[[1]]#. - hintTable[RHT_SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #shadow circling reflected light# in the Spirit Temple guards", /*french*/"l'#ombre près d'un miroir# protège", /*spanish*/"un #círculo de reflectante luz# del Templo del Espíritu guarda"}, - }); + hintTextTable[RHT_SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST] = HintText(CustomMessage("They say that a #shadow circling reflected light# in the Spirit Temple guards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#ombre près d'un miroir# protège #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #círculo de reflectante luz# del Templo del Espíritu guarda #[[1]]#. - hintTable[RHT_SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #shadow circling reflected light# in the Spirit Temple guards", /*french*/"l'#ombre près d'un miroir# protège", /*spanish*/"un #círculo de reflectante luz# del Templo del Espíritu guarda"}, - }); + hintTextTable[RHT_SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST] = HintText(CustomMessage("They say that a #shadow circling reflected light# in the Spirit Temple guards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#ombre près d'un miroir# protège #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #círculo de reflectante luz# del Templo del Espíritu guarda #[[1]]#. - hintTable[RHT_SPIRIT_TEMPLE_MAP_CHEST] = HintText::Exclude({ - //obscure text - Text{"#before a giant statue# in the Spirit Temple lies", /*french*/"#devant la statue# dans le colosse gît", /*spanish*/"#ante una gran estatua# del Templo del Espíritu aguarda"}, - }); + hintTextTable[RHT_SPIRIT_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say that #before a giant statue# in the Spirit Temple lies #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #devant la statue# dans le colosse gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #ante una gran estatua# del Templo del Espíritu aguarda #[[1]]#. - hintTable[RHT_SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST] = HintText::Exclude({ - //obscure text - Text{"#lizards in the Spirit Temple# guard", /*french*/"les #lézards dans le colosse# protègent", /*spanish*/"los #reptiles del Templo del Espíritu# guardan"}, - }); + hintTextTable[RHT_SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST] = HintText(CustomMessage("They say that #lizards in the Spirit Temple# guard #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #lézards dans le colosse# protègent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, los #reptiles del Templo del Espíritu# guardan #[[1]]#. - hintTable[RHT_SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST] = HintText::Exclude({ - //obscure text - Text{"#lizards in the Spirit Temple# guard", /*french*/"les #lézards dans le colosse# protègent", /*spanish*/"los #reptiles del Templo del Espíritu# guardan"}, - }); + hintTextTable[RHT_SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST] = HintText(CustomMessage("They say that #lizards in the Spirit Temple# guard #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #lézards dans le colosse# protègent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, los #reptiles del Templo del Espíritu# guardan #[[1]]#. - hintTable[RHT_SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST] = HintText::Exclude({ - //obscure text - Text{"#torchlight among Beamos# in the Spirit Temple reveals", /*french*/"les #torches autour des Sentinelles# éclairent", /*spanish*/"las #antorchas junto a Beamos# del Templo del Espíritu revelan"}, - }); + hintTextTable[RHT_SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST] = HintText(CustomMessage("They say that #torchlight among Beamos# in the Spirit Temple reveals #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #torches autour des Sentinelles# éclairent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, las #antorchas junto a Beamos# del Templo del Espíritu revelan #[[1]]#. - hintTable[RHT_SPIRIT_TEMPLE_STATUE_ROOM_HAND_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #statue in the Spirit Temple# holds", /*french*/"la #statue dans le colosse# tient", /*spanish*/"una #estatua del Templo del Espíritu# esconde"}, - }); + hintTextTable[RHT_SPIRIT_TEMPLE_STATUE_ROOM_HAND_CHEST] = HintText(CustomMessage("They say that a #statue in the Spirit Temple# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #statue dans le colosse# tient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #estatua del Templo del Espíritu# esconde #[[1]]#. - hintTable[RHT_SPIRIT_TEMPLE_STATUE_ROOM_NORTHEAST_CHEST] = HintText::Exclude({ - //obscure text - Text{"on a #ledge by a statue# in the Spirit Temple rests", /*french*/"#haut perché près de la statue# dans le colosse gît", /*spanish*/"al #borde de una estatua# del Templo del Espíritu yace"}, - }); + hintTextTable[RHT_SPIRIT_TEMPLE_STATUE_ROOM_NORTHEAST_CHEST] = HintText(CustomMessage("They say that on a #ledge by a statue# in the Spirit Temple rests #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #haut perché près de la statue# dans le colosse gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, al #borde de una estatua# del Templo del Espíritu yace #[[1]]#. - hintTable[RHT_SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST] = HintText::Exclude({ - //obscure text - Text{"those who #show the light among statues# in the Spirit Temple find", /*french*/"le #soleil près des statues# cache", /*spanish*/"aquellos que #iluminen ante las estatuas# del Templo del Espíritu encontrarán"}, - }); + hintTextTable[RHT_SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST] = HintText(CustomMessage("They say that those who #show the light among statues# in the Spirit Temple find #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #soleil près des statues# cache #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, aquellos que #iluminen ante las estatuas# del Templo del Espíritu encontrarán #[[1]]#. - hintTable[RHT_SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST] = HintText::Exclude({ - //obscure text - Text{"the #Eye of Truth in the Spirit Temple# reveals", /*french*/"le #trésor invisible près du Hache-Viande# contient", /*spanish*/"el #Ojo de la Verdad# en el Templo del Espíritu revela"}, - }); + hintTextTable[RHT_SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST] = HintText(CustomMessage("They say that the #Eye of Truth in the Spirit Temple# reveals #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #trésor invisible près du Hache-Viande# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #Ojo de la Verdad# en el Templo del Espíritu revela #[[1]]#. - hintTable[RHT_SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST] = HintText::Exclude({ - //obscure text - Text{"the #Eye of Truth in the Spirit Temple# reveals", /*french*/"le #trésor invisible près du Hache-Viande# contient", /*spanish*/"el #Ojo de la Verdad# en el Templo del Espíritu revela"}, - }); + hintTextTable[RHT_SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST] = HintText(CustomMessage("They say that the #Eye of Truth in the Spirit Temple# reveals #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #trésor invisible près du Hache-Viande# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #Ojo de la Verdad# en el Templo del Espíritu revela #[[1]]#. - hintTable[RHT_SPIRIT_TEMPLE_BOSS_KEY_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #chest engulfed in flame# in the Spirit Temple holds", /*french*/"le #coffre enflammé dans le colosse# contient", /*spanish*/"un #cofre rodeado de llamas# del Templo del Espíritu contiene"}, - }); + hintTextTable[RHT_SPIRIT_TEMPLE_BOSS_KEY_CHEST] = HintText(CustomMessage("They say that a #chest engulfed in flame# in the Spirit Temple holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #coffre enflammé dans le colosse# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #cofre rodeado de llamas# del Templo del Espíritu contiene #[[1]]#. - hintTable[RHT_SPIRIT_TEMPLE_TOPMOST_CHEST] = HintText::Exclude({ - //obscure text - Text{"those who #show the light above the Colossus# find", /*french*/"le #soleil au sommet du colosse# révèle", /*spanish*/"aquellos que #iluminen en lo alto del Coloso# encontrarán"}, - }); + hintTextTable[RHT_SPIRIT_TEMPLE_TOPMOST_CHEST] = HintText(CustomMessage("They say that those who #show the light above the Colossus# find #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #soleil au sommet du colosse# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, aquellos que #iluminen en lo alto del Coloso# encontrarán #[[1]]#. + hintTextTable[RHT_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST] = HintText(CustomMessage("They say that #lying unguarded# in the Spirit Temple is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, dans #l'entrée du colosse# se trouve #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, en la #entrada del Templo del Espíritu# yace #[[1]]#. - hintTable[RHT_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST] = HintText::Exclude({ - //obscure text - Text{"#lying unguarded# in the Spirit Temple is", /*french*/"dans #l'entrée du colosse# se trouve", /*spanish*/"en la #entrada del Templo del Espíritu# yace"}, - }); + hintTextTable[RHT_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST] = HintText(CustomMessage("They say that a #switch in a pillar# within the Spirit Temple drops #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#interrupteur dans un pilier# du colosse cache #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #interruptor de un pilar# del Templo del Espíritu revela #[[1]]#. - hintTable[RHT_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #switch in a pillar# within the Spirit Temple drops", /*french*/"l'#interrupteur dans un pilier# du colosse cache", /*spanish*/"el #interruptor de un pilar# del Templo del Espíritu revela"}, - }); + hintTextTable[RHT_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_RIGHT_CHEST] = HintText(CustomMessage("They say that #collecting rupees through a water jet# reveals #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #pièces argentées dans le jet d'eau# du colosse révèlent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #hacerte con rupias tras un géiser# revela #[[1]]#. - hintTable[RHT_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_RIGHT_CHEST] = HintText::Exclude({ - //obscure text - Text{"#collecting rupees through a water jet# reveals", /*french*/"les #pièces argentées dans le jet d'eau# du colosse révèlent", /*spanish*/"#hacerte con rupias tras un géiser# revela"}, - }); + hintTextTable[RHT_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST] = HintText(CustomMessage("They say that an #eye blinded by stone# within the Spirit Temple conceals #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #l'oeil derrière le rocher# dans le colosse voit #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #cegar a un ojo# del Templo del Espíritu revela #[[1]]#. - hintTable[RHT_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST] = HintText::Exclude({ - //obscure text - Text{"an #eye blinded by stone# within the Spirit Temple conceals", /*french*/"#l'oeil derrière le rocher# dans le colosse voit", /*spanish*/"#cegar a un ojo# del Templo del Espíritu revela"}, - }); + hintTextTable[RHT_SPIRIT_TEMPLE_MQ_MAP_CHEST] = HintText(CustomMessage("They say that surrounded by #fire and wrappings# lies #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, près des #pierres tombales dans le colosse# gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, rodeado de #fuego y vendas# yace #[[1]]#. - hintTable[RHT_SPIRIT_TEMPLE_MQ_MAP_CHEST] = HintText::Exclude({ - //obscure text - Text{"surrounded by #fire and wrappings# lies", /*french*/"près des #pierres tombales dans le colosse# gît", /*spanish*/"rodeado de #fuego y vendas# yace"}, - }); + hintTextTable[RHT_SPIRIT_TEMPLE_MQ_MAP_ROOM_ENEMY_CHEST] = HintText(CustomMessage("They say that a child defeats a #gauntlet of monsters# within the Spirit Temple to find #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'enfant qui vainc #plusieurs monstres# dans le colosse trouvera #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el joven que derrote #unos monstruos# del Templo del Espíritu encontrará #[[1]]#. - hintTable[RHT_SPIRIT_TEMPLE_MQ_MAP_ROOM_ENEMY_CHEST] = HintText::Exclude({ - //obscure text - Text{"a child defeats a #gauntlet of monsters# within the Spirit Temple to find", /*french*/"l'enfant qui vainc #plusieurs monstres# dans le colosse trouvera", /*spanish*/"el joven que derrote #unos monstruos# del Templo del Espíritu encontrará"}, - }); + hintTextTable[RHT_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST] = HintText(CustomMessage("They say that #explosive sunlight# within the Spirit Temple uncovers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #rayon de lumière explosif dans le colosse# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #explosiva luz solar# del Templo del Espíritu revela #[[1]]#. - hintTable[RHT_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST] = HintText::Exclude({ - //obscure text - Text{"#explosive sunlight# within the Spirit Temple uncovers", /*french*/"le #rayon de lumière explosif dans le colosse# révèle", /*spanish*/"una #explosiva luz solar# del Templo del Espíritu revela"}, - }); + hintTextTable[RHT_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST] = HintText(CustomMessage("They say that #trapped by falling enemies# within the Spirit Temple is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, des #ennemis tombants# dans le colosse protègent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #rodeado de enemigos del cielo# del Templo del Espíritu yace #[[1]]#. - hintTable[RHT_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST] = HintText::Exclude({ - //obscure text - Text{"#trapped by falling enemies# within the Spirit Temple is", /*french*/"des #ennemis tombants# dans le colosse protègent", /*spanish*/"#rodeado de enemigos del cielo# del Templo del Espíritu yace"}, - }); + hintTextTable[RHT_SPIRIT_TEMPLE_MQ_COMPASS_CHEST] = HintText(CustomMessage("They say that #blinding the colossus# unveils #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #l'oeil dans le colosse# voit #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #cegar al coloso# revela #[[1]]#. - hintTable[RHT_SPIRIT_TEMPLE_MQ_COMPASS_CHEST] = HintText::Exclude({ - //obscure text - Text{"#blinding the colossus# unveils", /*french*/"#l'oeil dans le colosse# voit", /*spanish*/"#cegar al coloso# revela"}, - }); + hintTextTable[RHT_SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST] = HintText(CustomMessage("They say that a #royal melody awakens the colossus# to reveal #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #mélodie royale éveille le colosse# et révèle #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la #melodía real que despierte al coloso# revelará #[[1]]#. - hintTable[RHT_SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #royal melody awakens the colossus# to reveal", /*french*/"la #mélodie royale éveille le colosse# et révèle", /*spanish*/"la #melodía real que despierte al coloso# revelará"}, - }); + hintTextTable[RHT_SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST] = HintText(CustomMessage("They say that the #Eye of Truth# finds the colossus's hidden #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #l'oeil de vérité# verra dans le colosse #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #Ojo de la Verdad# en el Templo del Espíritu encontrará #[[1]]#. - hintTable[RHT_SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST] = HintText::Exclude({ - //obscure text - Text{"the #Eye of Truth# finds the colossus's hidden", /*french*/"#l'oeil de vérité# verra dans le colosse", /*spanish*/"el #Ojo de la Verdad# en el Templo del Espíritu encontrará"}, - }); + hintTextTable[RHT_SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST] = HintText(CustomMessage("They say that #the old hide what the young find# to reveal #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#oeil dans le trou du bloc argent# dans le colosse voit #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #adulto esconde lo que el joven anhela#, revelando #[[1]]#. - hintTable[RHT_SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST] = HintText::Exclude({ - //obscure text - Text{"#the old hide what the young find# to reveal", /*french*/"l'#oeil dans le trou du bloc argent# dans le colosse voit", /*spanish*/"el #adulto esconde lo que el joven anhela#, revelando"}, - }); + hintTextTable[RHT_SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM_CHEST] = HintText(CustomMessage("They say that #sunlight in a maze of fire# hides #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #la lumière dans le labyrinthe de feu# du colosse révèle #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la #luz solar de un ígneo laberinto# esconde #[[1]]#. - hintTable[RHT_SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM_CHEST] = HintText::Exclude({ - //obscure text - Text{"#sunlight in a maze of fire# hides", /*french*/"#la lumière dans le labyrinthe de feu# du colosse révèle", /*spanish*/"la #luz solar de un ígneo laberinto# esconde"}, - }); + hintTextTable[RHT_SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST] = HintText(CustomMessage("They say that #across a pit of sand# in the Spirit Temple lies #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #trou sableux# dans le colosse a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #a través del pozo de arena# del Templo del Espíritu yace #[[1]]#. - hintTable[RHT_SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST] = HintText::Exclude({ - //obscure text - Text{"#across a pit of sand# in the Spirit Temple lies", /*french*/"le #trou sableux# dans le colosse a", /*spanish*/"#a través del pozo de arena# del Templo del Espíritu yace"}, - }); + hintTextTable[RHT_SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST] = HintText(CustomMessage("They say that where #temporal stone blocks the path# within the Spirit Temple lies #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #pierres temporelles# dans le colosse cachent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, donde los #bloques temporales bloquean# en el Templo del Espíritu yace #[[1]]#. - hintTable[RHT_SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST] = HintText::Exclude({ - //obscure text - Text{"where #temporal stone blocks the path# within the Spirit Temple lies", /*french*/"les #pierres temporelles# dans le colosse cachent", /*spanish*/"donde los #bloques temporales bloquean# en el Templo del Espíritu yace"}, - }); + hintTextTable[RHT_SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST] = HintText(CustomMessage("They say that a #chest of double purpose# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #coffre à usage double# du colosse contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #cofre de doble uso# contiene #[[1]]#. - hintTable[RHT_SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #chest of double purpose# holds", /*french*/"le #coffre à usage double# du colosse contient", /*spanish*/"un #cofre de doble uso# contiene"}, - }); + hintTextTable[RHT_SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST] = HintText(CustomMessage("They say that a #temporal stone blocks the light# leading to #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #pierre temporelle# le colosse fait ombre sur #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #bloque temporal bloquea la luz# que conduce a #[[1]]#. - hintTable[RHT_SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #temporal stone blocks the light# leading to", /*french*/"la #pierre temporelle# le colosse fait ombre sur", /*spanish*/"un #bloque temporal bloquea la luz# que conduce a"}, - }); + hintTextTable[RHT_SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST] = HintText(CustomMessage("They say that those who #show the light above the Colossus# find #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le trésor invisible #au sommet du colosse# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, aquellos que #revelen la luz sobre el Coloso# encontrarán #[[1]]#. - hintTable[RHT_SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST] = HintText::Exclude({ - //obscure text - Text{"those who #show the light above the Colossus# find", /*french*/"le trésor invisible #au sommet du colosse# contient", /*spanish*/"aquellos que #revelen la luz sobre el Coloso# encontrarán"}, - }); + hintTextTable[RHT_SPIRIT_TEMPLE_TWINROVA_HEART] = HintText(CustomMessage("They say that #Twinrova# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #Twinrova# possède #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, #Birova# porta #[[1]]#. + {}, { + CustomMessage("They say that the #Sorceress Sisters# hold #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #les sorcières jumelles# possède #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, las #hermanas hechiceras# portan #[[1]]#. - hintTable[RHT_SPIRIT_TEMPLE_TWINROVA_HEART] = HintText::Exclude({ - //obscure text - Text{"the #Sorceress Sisters# hold", /*french*/"#les sorcières jumelles# possède", /*spanish*/"las #hermanas hechiceras# portan"}, - }, {}, - //clear text - Text{"#Twinrova# holds", /*french*/"#Twinrova# possède", /*spanish*/"#Birova# porta"} - ); + hintTextTable[RHT_SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM] = HintText(CustomMessage("They say that a spider in the #hall of a knight# guards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula au dessus d'un escalier du Temple de l'Esprit# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula en el salón de un guerrero# otorga #[[1]]#. - hintTable[RHT_SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM] = HintText::Exclude({ - //obscure text - Text{"a spider in the #hall of a knight# guards", /*french*/"une #Skulltula au dessus d'un escalier du Temple de l'Esprit# a", /*spanish*/"una #Skulltula en el salón de un guerrero# otorga"}, - }); + hintTextTable[RHT_SPIRIT_TEMPLE_GS_BOULDER_ROOM] = HintText(CustomMessage("They say that a #spider behind a temporal stone# in the Spirit Temple yields #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula derrière une pierre temporelle du Temple de l'Esprit# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula tras un bloque temporal# del Templo del Espíritu otorga #[[1]]#. - hintTable[RHT_SPIRIT_TEMPLE_GS_BOULDER_ROOM] = HintText::Exclude({ - //obscure text - Text{"a #spider behind a temporal stone# in the Spirit Temple yields", /*french*/"une #Skulltula derrière une pierre temporelle du Temple de l'Esprit# a", /*spanish*/"una #Skulltula tras un bloque temporal# del Templo del Espíritu otorga"}, - }); + hintTextTable[RHT_SPIRIT_TEMPLE_GS_LOBBY] = HintText(CustomMessage("They say that a #spider beside a statue# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula dans la grande salle du Temple de l'Esprit# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula junto a una estatua# del Templo del Espíritu otorga #[[1]]#. - hintTable[RHT_SPIRIT_TEMPLE_GS_LOBBY] = HintText::Exclude({ - //obscure text - Text{"a #spider beside a statue# holds", /*french*/"une #Skulltula dans la grande salle du Temple de l'Esprit# a", /*spanish*/"una #Skulltula junto a una estatua# del Templo del Espíritu otorga"}, - }); + hintTextTable[RHT_SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM] = HintText(CustomMessage("They say that a #spider at the top of a deep shaft# in the Spirit Temple holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula près d'un mur d'escalade du Temple de l'Esprit# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula en lo alto de un gran hueco# del Templo del Espíritu otorga #[[1]]#. - hintTable[RHT_SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM] = HintText::Exclude({ - //obscure text - Text{"a #spider at the top of a deep shaft# in the Spirit Temple holds", /*french*/"une #Skulltula près d'un mur d'escalade du Temple de l'Esprit# a", /*spanish*/"una #Skulltula en lo alto de un gran hueco# del Templo del Espíritu otorga"}, - }); + hintTextTable[RHT_SPIRIT_TEMPLE_GS_METAL_FENCE] = HintText(CustomMessage("They say that a child defeats a #spider among bats# in the Spirit Temple to gain #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula sur le grillage du Temple de l'Esprit# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el joven que derrote la #Skulltula entre murciélagos# del Templo del Espíritu hallará #[[1]]#. - hintTable[RHT_SPIRIT_TEMPLE_GS_METAL_FENCE] = HintText::Exclude({ - //obscure text - Text{"a child defeats a #spider among bats# in the Spirit Temple to gain", /*french*/"une #Skulltula sur le grillage du Temple de l'Esprit# a", /*spanish*/"el joven que derrote la #Skulltula entre murciélagos# del Templo del Espíritu hallará"}, - }); + hintTextTable[RHT_SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM] = HintText(CustomMessage("They say that #above a pit of sand# in the Spirit Temple hides #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula au dessus du trou sableux du Temple de l'Esprit# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula sobre un pozo de arena# del Templo del Espíritu otorga #[[1]]#. + hintTextTable[RHT_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST] = HintText(CustomMessage("They say that a spider in the #hall of a knight# guards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula dans la salle aux neuf trônes du Temple de l'Esprit# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula en el salón de un guerrero# otorga #[[1]]#. - hintTable[RHT_SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM] = HintText::Exclude({ - //obscure text - Text{"#above a pit of sand# in the Spirit Temple hides", /*french*/"une #Skulltula au dessus du trou sableux du Temple de l'Esprit# a", /*spanish*/"una #Skulltula sobre un pozo de arena# del Templo del Espíritu otorga"}, - }); + hintTextTable[RHT_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH] = HintText(CustomMessage("They say that a spider in the #hall of a knight# guards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula dans la salle aux neuf trônes du Temple de l'Esprit# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula en el salón de un guerrero# otorga #[[1]]#. - hintTable[RHT_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST] = HintText::Exclude({ - //obscure text - Text{"a spider in the #hall of a knight# guards", /*french*/"une #Skulltula dans la salle aux neuf trônes du Temple de l'Esprit# a", /*spanish*/"una #Skulltula en el salón de un guerrero# otorga"}, - }); - - hintTable[RHT_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH] = HintText::Exclude({ - //obscure text - Text{"a spider in the #hall of a knight# guards", /*french*/"une #Skulltula dans la salle aux neuf trônes du Temple de l'Esprit# a", /*spanish*/"una #Skulltula en el salón de un guerrero# otorga"}, - }); - - hintTable[RHT_SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM] = HintText::Exclude({ - //obscure text - Text{"#upon a web of glass# in the Spirit Temple sits a spider holding", /*french*/"une #Skulltula sur une paroi de verre du Temple de l'Esprit# a", /*spanish*/"#sobre una plataforma de cristal# yace una Skulltula que otorga"}, - }); + hintTextTable[RHT_SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM] = HintText(CustomMessage("They say that #upon a web of glass# in the Spirit Temple sits a spider holding #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula sur une paroi de verre du Temple de l'Esprit# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #sobre una plataforma de cristal# yace una Skulltula que otorga #[[1]]#. /*-------------------------- | SHADOW TEMPLE | ---------------------------*/ - hintTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText::Exclude({ - //obscure text - Text{"the #Eye of Truth# pierces a hall of faces to reveal", /*french*/"l'#oeil de vérité# voit dans les couloirs du Temple de l'Ombre", /*spanish*/"el #Ojo de la Verdad# descubrirá un pasillo de facetas con"}, - }); +hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say that the #Eye of Truth# pierces a hall of faces to reveal #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#oeil de vérité# voit dans les couloirs du Temple de l'Ombre #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #Ojo de la Verdad# descubrirá un pasillo de facetas con #[[1]]#. - hintTable[RHT_SHADOW_TEMPLE_HOVER_BOOTS_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #nether dweller in the Shadow Temple# holds", /*french*/"le #spectre du Temple de l'Ombre# a", /*spanish*/"un #temido morador del Templo de las Sombras# guarda"}, - }, {}, - //clear text - Text{"#Dead Hand in the Shadow Temple# holds", /*french*/"le #Poigneur dans le Temple de l'Ombre# cache", /*spanish*/"la #Mano Muerta del Templo de las Sombras# guarda"} - ); + hintTextTable[RHT_SHADOW_TEMPLE_HOVER_BOOTS_CHEST] = HintText(CustomMessage("They say that #Dead Hand in the Shadow Temple# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #Poigneur dans le Temple de l'Ombre# cache #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, la #Mano Muerta del Templo de las Sombras# guarda #[[1]]#. + {}, { + CustomMessage("They say that a #nether dweller in the Shadow Temple# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #spectre du Temple de l'Ombre# a #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, un #temido morador del Templo de las Sombras# guarda #[[1]]#. - hintTable[RHT_SHADOW_TEMPLE_COMPASS_CHEST] = HintText::Exclude({ - //obscure text - Text{"#mummies revealed by the Eye of Truth# guard", /*french*/"les #Gibdos dans les couloirs# du Temple de l'Ombre protègent", /*spanish*/"las #momias reveladas por el Ojo de la Verdad# guardan"}, - }); + hintTextTable[RHT_SHADOW_TEMPLE_COMPASS_CHEST] = HintText(CustomMessage("They say that #mummies revealed by the Eye of Truth# guard #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #Gibdos dans les couloirs# du Temple de l'Ombre protègent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, las #momias reveladas por el Ojo de la Verdad# guardan #[[1]]#. - hintTable[RHT_SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST] = HintText::Exclude({ - //obscure text - Text{"#spinning scythes# protect", /*french*/"les #faucheurs danseurs# du Temple de l'Ombre protègent", /*spanish*/"las #giratorias guadañas# protegen"}, - }); + hintTextTable[RHT_SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST] = HintText(CustomMessage("They say that #spinning scythes# protect #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #faucheurs danseurs# du Temple de l'Ombre protègent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, las #giratorias guadañas# protegen #[[1]]#. - hintTable[RHT_SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST] = HintText::Exclude({ - //obscure text - Text{"#invisible blades# guard", /*french*/"les #faucheurs invisibles# du Temple de l'Ombre protègent", /*spanish*/"las #hojas invisibles# guardan"}, - }); + hintTextTable[RHT_SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST] = HintText(CustomMessage("They say that #invisible blades# guard #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #faucheurs invisibles# du Temple de l'Ombre protègent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, las #hojas invisibles# guardan #[[1]]#. - hintTable[RHT_SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST] = HintText::Exclude({ - //obscure text - Text{"#invisible blades# guard", /*french*/"les #faucheurs invisibles# du Temple de l'Ombre protègent", /*spanish*/"las #hojas invisibles# guardan"}, - }); + hintTextTable[RHT_SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST] = HintText(CustomMessage("They say that #invisible blades# guard #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #faucheurs invisibles# du Temple de l'Ombre protègent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, las #hojas invisibles# guardan #[[1]]#. - hintTable[RHT_SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST] = HintText::Exclude({ - //obscure text - Text{"#falling spikes# block the path to", /*french*/"la #pluie de clous# surplombe", /*spanish*/"los #pinchos de un techo# conducen a"}, - }); + hintTextTable[RHT_SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST] = HintText(CustomMessage("They say that #falling spikes# block the path to #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #pluie de clous# surplombe #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, los #pinchos de un techo# conducen a #[[1]]#. - hintTable[RHT_SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST] = HintText::Exclude({ - //obscure text - Text{"#falling spikes# block the path to", /*french*/"la #pluie de clous# surplombe", /*spanish*/"los #pinchos de un techo# conducen a"}, - }); + hintTextTable[RHT_SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST] = HintText(CustomMessage("They say that #falling spikes# block the path to #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #pluie de clous# surplombe #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, los #pinchos de un techo# conducen a #[[1]]#. - hintTable[RHT_SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST] = HintText::Exclude({ - //obscure text - Text{"#falling spikes# block the path to", /*french*/"la #pluie de clous# surplombe", /*spanish*/"los #pinchos de un techo# conducen a"}, - }); + hintTextTable[RHT_SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST] = HintText(CustomMessage("They say that #falling spikes# block the path to #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #pluie de clous# surplombe #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, los #pinchos de un techo# conducen a #[[1]]#. - hintTable[RHT_SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST] = HintText::Exclude({ - //obscure text - Text{"the #dead roam among invisible spikes# guarding", /*french*/"#parmi les clous invisibles# du Temple de l'Ombre se cache", /*spanish*/"los #muertos que vagan por pinchos invisibles# protegen"}, - }); + hintTextTable[RHT_SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST] = HintText(CustomMessage("They say that the #dead roam among invisible spikes# guarding #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #parmi les clous invisibles# du Temple de l'Ombre se cache #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, los #muertos que vagan por pinchos invisibles# protegen #[[1]]#. - hintTable[RHT_SHADOW_TEMPLE_WIND_HINT_CHEST] = HintText::Exclude({ - //obscure text - Text{"an #invisible chest guarded by the dead# holds", /*french*/"le #trésor invisible du cul-de-sac# du Temple de l'Ombre contient", /*spanish*/"un #cofre invisible custodiado por los del más allá# contiene"}, - }); + hintTextTable[RHT_SHADOW_TEMPLE_WIND_HINT_CHEST] = HintText(CustomMessage("They say that an #invisible chest guarded by the dead# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #trésor invisible du cul-de-sac# du Temple de l'Ombre contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #cofre invisible custodiado por los del más allá# contiene #[[1]]#. - hintTable[RHT_SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST] = HintText::Exclude({ - //obscure text - Text{"#mummies guarding a ferry# hide", /*french*/"les #Gibdos qui bloquent le traversier# cachent", /*spanish*/"las #momias que protegen un navío# esconden"}, - }); + hintTextTable[RHT_SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST] = HintText(CustomMessage("They say that #mummies guarding a ferry# hide #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #Gibdos qui bloquent le traversier# cachent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, las #momias que protegen un navío# esconden #[[1]]#. - hintTable[RHT_SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST] = HintText::Exclude({ - //obscure text - Text{"#mummies guarding a ferry# hide", /*french*/"les #Gibdos qui bloquent le traversier# cachent", /*spanish*/"las #momias que protegen un navío# esconden"}, - }); + hintTextTable[RHT_SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST] = HintText(CustomMessage("They say that #mummies guarding a ferry# hide #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #Gibdos qui bloquent le traversier# cachent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, las #momias que protegen un navío# esconden #[[1]]#. - hintTable[RHT_SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST] = HintText::Exclude({ - //obscure text - Text{"#walls consumed by a ball of fire# reveal", /*french*/"le #piège de bois# du Temple de l'Ombre cache", /*spanish*/"las #paredes consumidas por una esfera ígnea# revelan"}, - }); + hintTextTable[RHT_SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST] = HintText(CustomMessage("They say that #walls consumed by a ball of fire# reveal #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #piège de bois# du Temple de l'Ombre cache #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, las #paredes consumidas por una esfera ígnea# revelan #[[1]]#. - hintTable[RHT_SHADOW_TEMPLE_BOSS_KEY_CHEST] = HintText::Exclude({ - //obscure text - Text{"#walls consumed by a ball of fire# reveal", /*french*/"le #piège de bois# du Temple de l'Ombre cache", /*spanish*/"las #paredes consumidas por una esfera ígnea# revelan"}, - }); + hintTextTable[RHT_SHADOW_TEMPLE_BOSS_KEY_CHEST] = HintText(CustomMessage("They say that #walls consumed by a ball of fire# reveal #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #piège de bois# du Temple de l'Ombre cache #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, las #paredes consumidas por una esfera ígnea# revelan #[[1]]#. - hintTable[RHT_SHADOW_TEMPLE_FREESTANDING_KEY] = HintText::Exclude({ - //obscure text - Text{"#inside a burning skull# lies", /*french*/"#dans un crâne enflammé# gît", /*spanish*/"en el #interior de una calavera en llamas# aguarda"}, - }); + hintTextTable[RHT_SHADOW_TEMPLE_FREESTANDING_KEY] = HintText(CustomMessage("They say that #inside a burning skull# lies #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #dans un crâne enflammé# gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, en el #interior de una calavera en llamas# aguarda #[[1]]#. + hintTextTable[RHT_SHADOW_TEMPLE_MQ_COMPASS_CHEST] = HintText(CustomMessage("They say that the #Eye of Truth# pierces a hall of faces to reveal #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#oeil de vérité# voit dans les couloirs du Temple de l'Ombre #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #Ojo de la Verdad# descubre un pasillo de facetas con #[[1]]#. - hintTable[RHT_SHADOW_TEMPLE_MQ_COMPASS_CHEST] = HintText::Exclude({ - //obscure text - Text{"the #Eye of Truth# pierces a hall of faces to reveal", /*french*/"l'#oeil de vérité# voit dans les couloirs du Temple de l'Ombre", /*spanish*/"el #Ojo de la Verdad# descubre un pasillo de facetas con"}, - }); + hintTextTable[RHT_SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST] = HintText(CustomMessage("They say that #Dead Hand in the Shadow Temple# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #Poigneur dans le Temple de l'Ombre# cache #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la #Mano Muerta del Templo de las Sombras# guarda #[[1]]#. - hintTable[RHT_SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST] = HintText::Exclude({ - //obscure text - Text{"#Dead Hand in the Shadow Temple# holds", /*french*/"le #Poigneur dans le Temple de l'Ombre# cache", /*spanish*/"la #Mano Muerta del Templo de las Sombras# guarda"}, - }); + hintTextTable[RHT_SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST] = HintText(CustomMessage("They say that #mummies revealed by the Eye of Truth# guard #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #Gibdos dans les couloirs# du Temple de l'Ombre protègent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, las #momias reveladas por el Ojo de la Verdad# guardan #[[1]]#. - hintTable[RHT_SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST] = HintText::Exclude({ - //obscure text - Text{"#mummies revealed by the Eye of Truth# guard", /*french*/"les #Gibdos dans les couloirs# du Temple de l'Ombre protègent", /*spanish*/"las #momias reveladas por el Ojo de la Verdad# guardan"}, - }); + hintTextTable[RHT_SHADOW_TEMPLE_MQ_MAP_CHEST] = HintText(CustomMessage("They say that #spinning scythes# protect #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #faucheurs danseurs# du Temple de l'Ombre protègent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, las #giratorias guadañas# protegen #[[1]]#. - hintTable[RHT_SHADOW_TEMPLE_MQ_MAP_CHEST] = HintText::Exclude({ - //obscure text - Text{"#spinning scythes# protect", /*french*/"les #faucheurs danseurs# du Temple de l'Ombre protègent", /*spanish*/"las #giratorias guadañas# protegen"}, - }); + hintTextTable[RHT_SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST] = HintText(CustomMessage("They say that #collecting rupees in a vast cavern# with the Shadow Temple unveils #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #pièces argentées dans le Temple de l'Ombre# révèlent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, hacerte con las #rupias en una gran caverna# del Templo de las Sombras revela #[[1]]#. - hintTable[RHT_SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST] = HintText::Exclude({ - //obscure text - Text{"#collecting rupees in a vast cavern# with the Shadow Temple unveils", /*french*/"les #pièces argentées dans le Temple de l'Ombre# révèlent", /*spanish*/"hacerte con las #rupias en una gran caverna# del Templo de las Sombras revela"}, - }); + hintTextTable[RHT_SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST] = HintText(CustomMessage("They say that #falling spikes# block the path to #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #pluie de clous# surplombe #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, los #pinchos de un techo# conducen a #[[1]]#. - hintTable[RHT_SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST] = HintText::Exclude({ - //obscure text - Text{"#falling spikes# block the path to", /*french*/"la #pluie de clous# surplombe", /*spanish*/"los #pinchos de un techo# conducen a"}, - }); + hintTextTable[RHT_SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST] = HintText(CustomMessage("They say that #falling spikes# block the path to #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #pluie de clous# surplombe #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, los #pinchos de un techo# conducen a #[[1]]#. - hintTable[RHT_SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST] = HintText::Exclude({ - //obscure text - Text{"#falling spikes# block the path to", /*french*/"la #pluie de clous# surplombe", /*spanish*/"los #pinchos de un techo# conducen a"}, - }); + hintTextTable[RHT_SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST] = HintText(CustomMessage("They say that #falling spikes# block the path to #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #pluie de clous# surplombe #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, los #pinchos de un techo# conducen a #[[1]]#. - hintTable[RHT_SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST] = HintText::Exclude({ - //obscure text - Text{"#falling spikes# block the path to", /*french*/"la #pluie de clous# surplombe", /*spanish*/"los #pinchos de un techo# conducen a"}, - }); + hintTextTable[RHT_SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST] = HintText(CustomMessage("They say that the #dead roam among invisible spikes# guarding #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #parmi les clous invisibles# du Temple de l'Ombre se cache #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, los #muertos que vagan por pinchos invisibles# protegen #[[1]]#. - hintTable[RHT_SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST] = HintText::Exclude({ - //obscure text - Text{"the #dead roam among invisible spikes# guarding", /*french*/"#parmi les clous invisibles# du Temple de l'Ombre se cache", /*spanish*/"los #muertos que vagan por pinchos invisibles# protegen"}, - }); + hintTextTable[RHT_SHADOW_TEMPLE_MQ_BOSS_KEY_CHEST] = HintText(CustomMessage("They say that #walls consumed by a ball of fire# reveal #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #piège de bois# du Temple de l'Ombre cache #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, las #paredes consumidas por una esfera ígnea# revelan #[[1]]#. - hintTable[RHT_SHADOW_TEMPLE_MQ_BOSS_KEY_CHEST] = HintText::Exclude({ - //obscure text - Text{"#walls consumed by a ball of fire# reveal", /*french*/"le #piège de bois# du Temple de l'Ombre cache", /*spanish*/"las #paredes consumidas por una esfera ígnea# revelan"}, - }); + hintTextTable[RHT_SHADOW_TEMPLE_MQ_SPIKE_WALLS_LEFT_CHEST] = HintText(CustomMessage("They say that #walls consumed by a ball of fire# reveal #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #piège de bois# du Temple de l'Ombre cache #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, las #paredes consumidas por una esfera ígnea# revelan #[[1]]#. - hintTable[RHT_SHADOW_TEMPLE_MQ_SPIKE_WALLS_LEFT_CHEST] = HintText::Exclude({ - //obscure text - Text{"#walls consumed by a ball of fire# reveal", /*french*/"le #piège de bois# du Temple de l'Ombre cache", /*spanish*/"las #paredes consumidas por una esfera ígnea# revelan"}, - }); + hintTextTable[RHT_SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST] = HintText(CustomMessage("They say that near an #empty pedestal# within the Shadow Temple lies #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #près d'un pédestal vide du Temple de l'Ombre# gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, cerca de un #vacío pedestal# del Templo de las Sombras yace #[[1]]#. - hintTable[RHT_SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST] = HintText::Exclude({ - //obscure text - Text{"near an #empty pedestal# within the Shadow Temple lies", /*french*/"#près d'un pédestal vide du Temple de l'Ombre# gît", /*spanish*/"cerca de un #vacío pedestal# del Templo de las Sombras yace"}, - }); + hintTextTable[RHT_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST] = HintText(CustomMessage("They say that #invisible blades# guard #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #faucheurs invisibles# du Temple de l'Ombre protègent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, unas #hojas invisibles# guardan #[[1]]#. - hintTable[RHT_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST] = HintText::Exclude({ - //obscure text - Text{"#invisible blades# guard", /*french*/"les #faucheurs invisibles# du Temple de l'Ombre protègent", /*spanish*/"unas #hojas invisibles# guardan"}, - }); + hintTextTable[RHT_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_VISIBLE_CHEST] = HintText(CustomMessage("They say that #invisible blades# guard #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #faucheurs invisibles# du Temple de l'Ombre protègent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, unas #hojas invisibles# guardan #[[1]]#. - hintTable[RHT_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_VISIBLE_CHEST] = HintText::Exclude({ - //obscure text - Text{"#invisible blades# guard", /*french*/"les #faucheurs invisibles# du Temple de l'Ombre protègent", /*spanish*/"unas #hojas invisibles# guardan"}, - }); + hintTextTable[RHT_SHADOW_TEMPLE_MQ_WIND_HINT_CHEST] = HintText(CustomMessage("They say that an #invisible chest guarded by the dead# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #trésor invisible du cul-de-sac# du Temple de l'Ombre contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #cofre invisible custodiado por los del más allá# contiene #[[1]]#. - hintTable[RHT_SHADOW_TEMPLE_MQ_WIND_HINT_CHEST] = HintText::Exclude({ - //obscure text - Text{"an #invisible chest guarded by the dead# holds", /*french*/"le #trésor invisible du cul-de-sac# du Temple de l'Ombre contient", /*spanish*/"un #cofre invisible custodiado por los del más allá# contiene"}, - }); + hintTextTable[RHT_SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST] = HintText(CustomMessage("They say that #mummies guarding a ferry# hide #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #Gibdos qui bloquent le traversier# cachent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, las #momias que protegen un navío# esconden #[[1]]#. - hintTable[RHT_SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST] = HintText::Exclude({ - //obscure text - Text{"#mummies guarding a ferry# hide", /*french*/"les #Gibdos qui bloquent le traversier# cachent", /*spanish*/"las #momias que protegen un navío# esconden"}, - }); + hintTextTable[RHT_SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST] = HintText(CustomMessage("They say that #mummies guarding a ferry# hide #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #Gibdos qui bloquent le traversier# cachent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, las #momias que protegen un navío# esconden #[[1]]#. - hintTable[RHT_SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST] = HintText::Exclude({ - //obscure text - Text{"#mummies guarding a ferry# hide", /*french*/"les #Gibdos qui bloquent le traversier# cachent", /*spanish*/"las #momias que protegen un navío# esconden"}, - }); + hintTextTable[RHT_SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST] = HintText(CustomMessage("They say that #caged near a ship# lies #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #dans une cage près du traversier# gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #entre rejas al lado de un navío# yace #[[1]]#. - hintTable[RHT_SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST] = HintText::Exclude({ - //obscure text - Text{"#caged near a ship# lies", /*french*/"#dans une cage près du traversier# gît", /*spanish*/"#entre rejas al lado de un navío# yace"}, - }); + hintTextTable[RHT_SHADOW_TEMPLE_MQ_FREESTANDING_KEY] = HintText(CustomMessage("They say that #behind three burning skulls# lies #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #derrière trois crânes enflammés# gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, tras #tres ardientes calaveras# yace #[[1]]#. - hintTable[RHT_SHADOW_TEMPLE_MQ_FREESTANDING_KEY] = HintText::Exclude({ - //obscure text - Text{"#behind three burning skulls# lies", /*french*/"#derrière trois crânes enflammés# gît", /*spanish*/"tras #tres ardientes calaveras# yace"}, - }); + hintTextTable[RHT_SHADOW_TEMPLE_BONGO_BONGO_HEART] = HintText(CustomMessage("They say that #Bongo Bongo# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #Bongo Bongo# possède #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, #Bongo Bongo# porta #[[1]]#. + {}, { + CustomMessage("They say that the #Phantom Shadow Beast# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #monstre de l'ombre# possède #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, la #alimaña oscura espectral# porta #[[1]]#. - hintTable[RHT_SHADOW_TEMPLE_BONGO_BONGO_HEART] = HintText::Exclude({ - //obscure text - Text{"the #Phantom Shadow Beast# holds", /*french*/"le #monstre de l'ombre# possède", /*spanish*/"la #alimaña oscura espectral# porta"}, - }, {}, - //clear text - Text{"#Bongo Bongo# holds", /*french*/"#Bongo Bongo# possède", /*spanish*/"#Bongo Bongo# porta"} - ); + hintTextTable[RHT_SHADOW_TEMPLE_GS_SINGLE_GIANT_POT] = HintText(CustomMessage("They say that #beyond a burning skull# lies a spider with #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula derrière un crâne enflammé du Temple de l'Ombre# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #tras una ardiente calavera# yace una Skulltula que otorga #[[1]]#. - hintTable[RHT_SHADOW_TEMPLE_GS_SINGLE_GIANT_POT] = HintText::Exclude({ - //obscure text - Text{"#beyond a burning skull# lies a spider with", /*french*/"une #Skulltula derrière un crâne enflammé du Temple de l'Ombre# a", /*spanish*/"#tras una ardiente calavera# yace una Skulltula que otorga"}, - }); + hintTextTable[RHT_SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM] = HintText(CustomMessage("They say that a #spider beyond falling spikes# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula au delà de la pluie de clous du Temple de l'Ombre# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula tras los pinchos del techo# otorga #[[1]]#. - hintTable[RHT_SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM] = HintText::Exclude({ - //obscure text - Text{"a #spider beyond falling spikes# holds", /*french*/"une #Skulltula au delà de la pluie de clous du Temple de l'Ombre# a", /*spanish*/"una #Skulltula tras los pinchos del techo# otorga"}, - }); + hintTextTable[RHT_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT] = HintText(CustomMessage("They say that #beyond three burning skulls# lies a spider with #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula derrière trois crânes enflammés du Temple de l'Ombre# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #tras tres ardientes calaveras# yace una Skulltula que otorga #[[1]]#. - hintTable[RHT_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT] = HintText::Exclude({ - //obscure text - Text{"#beyond three burning skulls# lies a spider with", /*french*/"une #Skulltula derrière trois crânes enflammés du Temple de l'Ombre# a", /*spanish*/"#tras tres ardientes calaveras# yace una Skulltula que otorga"}, - }); + hintTextTable[RHT_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM] = HintText(CustomMessage("They say that a spider guarded by #invisible blades# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula protégée par les faucheurs invisibles du Temple de l'Ombre# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula custodiada por hojas invisibles# otorga #[[1]]#. - hintTable[RHT_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM] = HintText::Exclude({ - //obscure text - Text{"a spider guarded by #invisible blades# holds", /*french*/"une #Skulltula protégée par les faucheurs invisibles du Temple de l'Ombre# a", /*spanish*/"una #Skulltula custodiada por hojas invisibles# otorga"}, - }); + hintTextTable[RHT_SHADOW_TEMPLE_GS_NEAR_SHIP] = HintText(CustomMessage("They say that a spider near a #docked ship# hoards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula près du traversier du Temple de l'Ombre# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula cercana a un navío# otorga #[[1]]#. - hintTable[RHT_SHADOW_TEMPLE_GS_NEAR_SHIP] = HintText::Exclude({ - //obscure text - Text{"a spider near a #docked ship# hoards", /*french*/"une #Skulltula près du traversier du Temple de l'Ombre# a", /*spanish*/"una #Skulltula cercana a un navío# otorga"}, - }); + hintTextTable[RHT_SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM] = HintText(CustomMessage("They say that a #spider beyond falling spikes# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula au delà de la pluie de clous du Temple de l'Ombre# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula tras los pinchos del techo# otorga #[[1]]#. + hintTextTable[RHT_SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM] = HintText(CustomMessage("They say that a #spider amidst roaring winds# in the Shadow Temple holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula près des vents du Temple de l'Ombre# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula entre ventarrones# del Templo de las Sombras otorga #[[1]]#. - hintTable[RHT_SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM] = HintText::Exclude({ - //obscure text - Text{"a #spider beyond falling spikes# holds", /*french*/"une #Skulltula au delà de la pluie de clous du Temple de l'Ombre# a", /*spanish*/"una #Skulltula tras los pinchos del techo# otorga"}, - }); + hintTextTable[RHT_SHADOW_TEMPLE_MQ_GS_AFTER_WIND] = HintText(CustomMessage("They say that a #spider beneath gruesome debris# in the Shadow Temple hides #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula sous des débris du Temple de l'Ombre# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula bajo unos horripilantes escombros# del Templo de las Sombras otorga #[[1]]#. - hintTable[RHT_SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM] = HintText::Exclude({ - //obscure text - Text{"a #spider amidst roaring winds# in the Shadow Temple holds", /*french*/"une #Skulltula près des vents du Temple de l'Ombre# a", /*spanish*/"una #Skulltula entre ventarrones# del Templo de las Sombras otorga"}, - }); + hintTextTable[RHT_SHADOW_TEMPLE_MQ_GS_AFTER_SHIP] = HintText(CustomMessage("They say that a #fallen statue# reveals a spider with #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula près de la statue écroulée du Temple de l'Ombre# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #estatua caída# revelará una Skulltula que otorgue #[[1]]#. - hintTable[RHT_SHADOW_TEMPLE_MQ_GS_AFTER_WIND] = HintText::Exclude({ - //obscure text - Text{"a #spider beneath gruesome debris# in the Shadow Temple hides", /*french*/"une #Skulltula sous des débris du Temple de l'Ombre# a", /*spanish*/"una #Skulltula bajo unos horripilantes escombros# del Templo de las Sombras otorga"}, - }); - - hintTable[RHT_SHADOW_TEMPLE_MQ_GS_AFTER_SHIP] = HintText::Exclude({ - //obscure text - Text{"a #fallen statue# reveals a spider with", /*french*/"une #Skulltula près de la statue écroulée du Temple de l'Ombre# a", /*spanish*/"una #estatua caída# revelará una Skulltula que otorgue"}, - }); - - hintTable[RHT_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS] = HintText::Exclude({ - //obscure text - Text{"a #suspended spider# guards", /*french*/"une #Skulltula près du repère du Temple de l'Ombre# a", /*spanish*/"una #Skulltula flotante# del Templo de las Sombras otorga"}, - }); + hintTextTable[RHT_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS] = HintText(CustomMessage("They say that a #suspended spider# guards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula près du repère du Temple de l'Ombre# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula flotante# del Templo de las Sombras otorga #[[1]]#. /*-------------------------- | BOTTOM OF THE WELL | ---------------------------*/ - hintTable[RHT_BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST] = HintText::Exclude({ - //obscure text - Text{"the #Eye of Truth in the well# reveals", /*french*/"l'#oeil de vérité dans le Puits# révèle", /*spanish*/"el #Ojo de la Verdad en el pozo# revela"}, - }); + hintTextTable[RHT_BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST] = HintText(CustomMessage("They say that the #Eye of Truth in the well# reveals #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#oeil de vérité dans le Puits# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #Ojo de la Verdad en el pozo# revela #[[1]]#. - hintTable[RHT_BOTTOM_OF_THE_WELL_FRONT_CENTER_BOMBABLE_CHEST] = HintText::Exclude({ - //obscure text - Text{"#gruesome debris# in the well hides", /*french*/"des #débris dans le Puits# cachent", /*spanish*/"unos #horripilantes escombros# del pozo esconden"}, - }); + hintTextTable[RHT_BOTTOM_OF_THE_WELL_FRONT_CENTER_BOMBABLE_CHEST] = HintText(CustomMessage("They say that #gruesome debris# in the well hides #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, des #débris dans le Puits# cachent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, unos #horripilantes escombros# del pozo esconden #[[1]]#. - hintTable[RHT_BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST] = HintText::Exclude({ - //obscure text - Text{"the #Eye of Truth in the well# reveals", /*french*/"l'#oeil de vérité dans le Puits# révèle", /*spanish*/"el #Ojo de la Verdad en el pozo# revela"}, - }); + hintTextTable[RHT_BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST] = HintText(CustomMessage("They say that the #Eye of Truth in the well# reveals #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#oeil de vérité dans le Puits# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #Ojo de la Verdad en el pozo# revela #[[1]]#. - hintTable[RHT_BOTTOM_OF_THE_WELL_COMPASS_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #hidden entrance to a cage# in the well leads to", /*french*/"dans un #chemin caché dans le Puits# gît", /*spanish*/"la #entrada oculta de una celda# del pozo conduce a"}, - }); + hintTextTable[RHT_BOTTOM_OF_THE_WELL_COMPASS_CHEST] = HintText(CustomMessage("They say that a #hidden entrance to a cage# in the well leads to #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, dans un #chemin caché dans le Puits# gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la #entrada oculta de una celda# del pozo conduce a #[[1]]#. - hintTable[RHT_BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #spider guarding a cage# in the well protects", /*french*/"l'#araignée dans la cage du Puits# protège", /*spanish*/"una #araña protegiendo una celda# del pozo guarda"}, - }); + hintTextTable[RHT_BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST] = HintText(CustomMessage("They say that a #spider guarding a cage# in the well protects #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#araignée dans la cage du Puits# protège #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #araña protegiendo una celda# del pozo guarda #[[1]]#. - hintTable[RHT_BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST] = HintText::Exclude({ - //obscure text - Text{"#gruesome debris# in the well hides", /*french*/"des #débris dans le Puits# cachent", /*spanish*/"unos #horripilantes escombros# del pozo esconden"}, - }); + hintTextTable[RHT_BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST] = HintText(CustomMessage("They say that #gruesome debris# in the well hides #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, des #débris dans le Puits# cachent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, unos #horripilantes escombros# del pozo esconden #[[1]]#. - hintTable[RHT_BOTTOM_OF_THE_WELL_INVISIBLE_CHEST] = HintText::Exclude({ - //obscure text - Text{"#Dead Hand's invisible secret# is", /*french*/"le #trésor invisible du Poigneur# est", /*spanish*/"el #secreto invisible de la Mano Muerta# esconde"}, - }); + hintTextTable[RHT_BOTTOM_OF_THE_WELL_INVISIBLE_CHEST] = HintText(CustomMessage("They say that #Dead Hand's invisible secret# is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #trésor invisible du Poigneur# est #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #secreto invisible de la Mano Muerta# esconde #[[1]]#. - hintTable[RHT_BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #royal melody in the well# uncovers", /*french*/"la #mélodie royale révèle dans le Puits#", /*spanish*/"una #melodía real en el pozo# revela"}, - }); + hintTextTable[RHT_BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST] = HintText(CustomMessage("They say that a #royal melody in the well# uncovers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #mélodie royale révèle dans le Puits# #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #melodía real en el pozo# revela #[[1]]#. - hintTable[RHT_BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #royal melody in the well# uncovers", /*french*/"la #mélodie royale révèle dans le Puits#", /*spanish*/"una #melodía real en el pozo# revela"}, - }); + hintTextTable[RHT_BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST] = HintText(CustomMessage("They say that a #royal melody in the well# uncovers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #mélodie royale révèle dans le Puits# #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #melodía real en el pozo# revela #[[1]]#. - hintTable[RHT_BOTTOM_OF_THE_WELL_MAP_CHEST] = HintText::Exclude({ - //obscure text - Text{"in the #depths of the well# lies", /*french*/"#dans le coeur du Puits# gît", /*spanish*/"en las #profundidades del pozo# yace"}, - }); + hintTextTable[RHT_BOTTOM_OF_THE_WELL_MAP_CHEST] = HintText(CustomMessage("They say that in the #depths of the well# lies #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #dans le coeur du Puits# gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, en las #profundidades del pozo# yace #[[1]]#. - hintTable[RHT_BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST] = HintText::Exclude({ - //obscure text - Text{"#perilous pits# in the well guard the path to", /*french*/"#trois trous# dans le Puits protègent", /*spanish*/"#peligrosos fosos# del pozo conducen a"}, - }); + hintTextTable[RHT_BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST] = HintText(CustomMessage("They say that #perilous pits# in the well guard the path to #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #trois trous# dans le Puits protègent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #peligrosos fosos# del pozo conducen a #[[1]]#. - hintTable[RHT_BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST] = HintText::Exclude({ - //obscure text - Text{"#locked in a cage# in the well lies", /*french*/"#dans une cage# du Puits gît", /*spanish*/"#entre rejas# en el pozo yace"}, - }); + hintTextTable[RHT_BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST] = HintText(CustomMessage("They say that #locked in a cage# in the well lies #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #dans une cage# du Puits gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #entre rejas# en el pozo yace #[[1]]#. - hintTable[RHT_BOTTOM_OF_THE_WELL_FREESTANDING_KEY] = HintText::Exclude({ - //obscure text - Text{"#inside a coffin# hides", /*french*/"dans #un cercueil# gît", /*spanish*/"en el #interior de un ataúd# yace"}, - }); + hintTextTable[RHT_BOTTOM_OF_THE_WELL_FREESTANDING_KEY] = HintText(CustomMessage("They say that #inside a coffin# hides #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, dans #un cercueil# gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, en el #interior de un ataúd# yace #[[1]]#. + hintTextTable[RHT_BOTTOM_OF_THE_WELL_MQ_MAP_CHEST] = HintText(CustomMessage("They say that a #royal melody in the well# uncovers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #mélodie royale révèle dans le Puits# #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #melodía real en el pozo# revela #[[1]]#. - hintTable[RHT_BOTTOM_OF_THE_WELL_MQ_MAP_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #royal melody in the well# uncovers", /*french*/"la #mélodie royale révèle dans le Puits#", /*spanish*/"una #melodía real en el pozo# revela"}, - }); + hintTextTable[RHT_BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST] = HintText(CustomMessage("They say that an #army of the dead# in the well guards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#armée des morts# dans le Puits protège #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #ejército del más allá# del pozo guarda #[[1]]#. - hintTable[RHT_BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST] = HintText::Exclude({ - //obscure text - Text{"an #army of the dead# in the well guards", /*french*/"l'#armée des morts# dans le Puits protège", /*spanish*/"un #ejército del más allá# del pozo guarda"}, - }); + hintTextTable[RHT_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY] = HintText(CustomMessage("They say that #Dead Hand's explosive secret# is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #secret explosif du Poigneur# est #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #explosivo secreto de la Mano Muerta# esconde #[[1]]#. - hintTable[RHT_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY] = HintText::Exclude({ - //obscure text - Text{"#Dead Hand's explosive secret# is", /*french*/"le #secret explosif du Poigneur# est", /*spanish*/"el #explosivo secreto de la Mano Muerta# esconde"}, - }); + hintTextTable[RHT_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY] = HintText(CustomMessage("They say that an #invisible path in the well# leads to #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, dans un #chemin caché dans le Puits# gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #camino invisible del pozo# conduce a #[[1]]#. - hintTable[RHT_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY] = HintText::Exclude({ - //obscure text - Text{"an #invisible path in the well# leads to", /*french*/"dans un #chemin caché dans le Puits# gît", /*spanish*/"un #camino invisible del pozo# conduce a"}, - }); + hintTextTable[RHT_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE] = HintText(CustomMessage("They say that a #spider locked in a cage# in the well holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula dans une cage au fonds du Puits# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula enjaulada# del pozo otorga #[[1]]#. - hintTable[RHT_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE] = HintText::Exclude({ - //obscure text - Text{"a #spider locked in a cage# in the well holds", /*french*/"une #Skulltula dans une cage au fonds du Puits# a", /*spanish*/"una #Skulltula enjaulada# del pozo otorga"}, - }); + hintTextTable[RHT_BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM] = HintText(CustomMessage("They say that an #invisible path in the well# leads to #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula dans le chemin invisible au fonds du Puits# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #camino invisible del pozo# conduce a una Skulltula que otorga #[[1]]#. - hintTable[RHT_BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM] = HintText::Exclude({ - //obscure text - Text{"an #invisible path in the well# leads to", /*french*/"une #Skulltula dans le chemin invisible au fonds du Puits# a", /*spanish*/"un #camino invisible del pozo# conduce a una Skulltula que otorga"}, - }); + hintTextTable[RHT_BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM] = HintText(CustomMessage("They say that a #spider locked in a crypt# within the well guards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula embarrée dans la crypte au fonds du Puits# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula encerrada en una cripta# del pozo otorga #[[1]]#. - hintTable[RHT_BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM] = HintText::Exclude({ - //obscure text - Text{"a #spider locked in a crypt# within the well guards", /*french*/"une #Skulltula embarrée dans la crypte au fonds du Puits# a", /*spanish*/"una #Skulltula encerrada en una cripta# del pozo otorga"}, - }); + hintTextTable[RHT_BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT] = HintText(CustomMessage("They say that a #gauntlet of invisible spiders# protects #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula protégée par les araignées invisibles au fonds du Puits# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, unas #arañas invisibles# custodian una Skulltula que otorga #[[1]]#. + hintTextTable[RHT_BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM] = HintText(CustomMessage("They say that a #spider crawling near the dead# in the well holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula près des cercueils au fonds du Puits# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula junto a los muertos# del pozo otorga #[[1]]#. - hintTable[RHT_BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT] = HintText::Exclude({ - //obscure text - Text{"a #gauntlet of invisible spiders# protects", /*french*/"une #Skulltula protégée par les araignées invisibles au fonds du Puits# a", /*spanish*/"unas #arañas invisibles# custodian una Skulltula que otorga"}, - }); - - hintTable[RHT_BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM] = HintText::Exclude({ - //obscure text - Text{"a #spider crawling near the dead# in the well holds", /*french*/"une #Skulltula près des cercueils au fonds du Puits# a", /*spanish*/"una #Skulltula junto a los muertos# del pozo otorga"}, - }); - - hintTable[RHT_BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM] = HintText::Exclude({ - //obscure text - Text{"a #spider locked in a crypt# within the well guards", /*french*/"une #Skulltula embarrée dans la crypte au fonds du Puits# a", /*spanish*/"una #Skulltula encerrada en una cripta# del pozo otorga"}, - }); + hintTextTable[RHT_BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM] = HintText(CustomMessage("They say that a #spider locked in a crypt# within the well guards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula embarrée dans la crypte au fonds du Puits# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula encerrada en una cripta# del pozo otorga #[[1]]#. /*-------------------------- | ICE CAVERN | ---------------------------*/ - hintTable[RHT_ICE_CAVERN_MAP_CHEST] = HintText::Exclude({ - //obscure text - Text{"#winds of ice# surround", /*french*/"#figé dans la glace rouge# gît", /*spanish*/"#heladas borrascas# rodean"}, - }); + hintTextTable[RHT_ICE_CAVERN_MAP_CHEST] = HintText(CustomMessage("They say that #winds of ice# surround #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #figé dans la glace rouge# gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #heladas borrascas# rodean #[[1]]#. - hintTable[RHT_ICE_CAVERN_COMPASS_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #wall of ice# protects", /*french*/"#un mur de glace rouge# cache", /*spanish*/"una #gélida pared# protege"}, - }); + hintTextTable[RHT_ICE_CAVERN_COMPASS_CHEST] = HintText(CustomMessage("They say that a #wall of ice# protects #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #un mur de glace rouge# cache #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #gélida pared# protege #[[1]]#. - hintTable[RHT_ICE_CAVERN_IRON_BOOTS_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #monster in a frozen cavern# guards", /*french*/"le #monstre de la caverne de glace# protège", /*spanish*/"un #monstruo de una helada caverna# guarda"}, - }); + hintTextTable[RHT_ICE_CAVERN_IRON_BOOTS_CHEST] = HintText(CustomMessage("They say that a #monster in a frozen cavern# guards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #monstre de la caverne de glace# protège #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #monstruo de una helada caverna# guarda #[[1]]#. - hintTable[RHT_ICE_CAVERN_FREESTANDING_POH] = HintText::Exclude({ - //obscure text - Text{"a #wall of ice# protects", /*french*/"un #mur de glace rouge# cache", /*spanish*/"una #gélida pared# protege"}, - }); + hintTextTable[RHT_ICE_CAVERN_FREESTANDING_POH] = HintText(CustomMessage("They say that a #wall of ice# protects #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, un #mur de glace rouge# cache #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #gélida pared# protege #[[1]]#. + hintTextTable[RHT_ICE_CAVERN_MQ_IRON_BOOTS_CHEST] = HintText(CustomMessage("They say that a #monster in a frozen cavern# guards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #monstre de la caverne de glace# protège #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #monstruo de una helada caverna# guarda #[[1]]#. - hintTable[RHT_ICE_CAVERN_MQ_IRON_BOOTS_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #monster in a frozen cavern# guards", /*french*/"le #monstre de la caverne de glace# protège", /*spanish*/"un #monstruo de una helada caverna# guarda"}, - }); + hintTextTable[RHT_ICE_CAVERN_MQ_COMPASS_CHEST] = HintText(CustomMessage("They say that #winds of ice# surround #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #entouré de vent glacial# gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #heladas borrascas# rodean #[[1]]#. - hintTable[RHT_ICE_CAVERN_MQ_COMPASS_CHEST] = HintText::Exclude({ - //obscure text - Text{"#winds of ice# surround", /*french*/"#entouré de vent glacial# gît", /*spanish*/"#heladas borrascas# rodean"}, - }); + hintTextTable[RHT_ICE_CAVERN_MQ_MAP_CHEST] = HintText(CustomMessage("They say that a #wall of ice# protects #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #un mur de glace rouge# cache #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #gélida pared# protege #[[1]]#. - hintTable[RHT_ICE_CAVERN_MQ_MAP_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #wall of ice# protects", /*french*/"#un mur de glace rouge# cache", /*spanish*/"una #gélida pared# protege"}, - }); + hintTextTable[RHT_ICE_CAVERN_MQ_FREESTANDING_POH] = HintText(CustomMessage("They say that #winds of ice# surround #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #entouré de vent glacial# gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #heladas borrascas# rodean #[[1]]#. - hintTable[RHT_ICE_CAVERN_MQ_FREESTANDING_POH] = HintText::Exclude({ - //obscure text - Text{"#winds of ice# surround", /*french*/"#entouré de vent glacial# gît", /*spanish*/"#heladas borrascas# rodean"}, - }); + hintTextTable[RHT_ICE_CAVERN_GS_PUSH_BLOCK_ROOM] = HintText(CustomMessage("They say that a #spider above icy pits# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula au dessus d'un goufre glacial# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula sobre gélidos vacíos# otorga #[[1]]#. - hintTable[RHT_ICE_CAVERN_GS_PUSH_BLOCK_ROOM] = HintText::Exclude({ - //obscure text - Text{"a #spider above icy pits# holds", /*french*/"une #Skulltula au dessus d'un goufre glacial# a", /*spanish*/"una #Skulltula sobre gélidos vacíos# otorga"}, - }); + hintTextTable[RHT_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM] = HintText(CustomMessage("They say that #spinning ice# guards a spider holding #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula près de deux lames de glace# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, unos #témpanos giratorios# custodian una Skulltula que otorga #[[1]]#. - hintTable[RHT_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM] = HintText::Exclude({ - //obscure text - Text{"#spinning ice# guards a spider holding", /*french*/"une #Skulltula près de deux lames de glace# a", /*spanish*/"unos #témpanos giratorios# custodian una Skulltula que otorga"}, - }); + hintTextTable[RHT_ICE_CAVERN_GS_HEART_PIECE_ROOM] = HintText(CustomMessage("They say that a #spider behind a wall of ice# hides #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula derrière un mur de glace# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula tras una gélida pared# otorga #[[1]]#. - hintTable[RHT_ICE_CAVERN_GS_HEART_PIECE_ROOM] = HintText::Exclude({ - //obscure text - Text{"a #spider behind a wall of ice# hides", /*french*/"une #Skulltula derrière un mur de glace# a", /*spanish*/"una #Skulltula tras una gélida pared# otorga"}, - }); + hintTextTable[RHT_ICE_CAVERN_MQ_GS_SCARECROW] = HintText(CustomMessage("They say that a #spider above icy pits# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula au dessus d'un goufre glacial# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula sobre gélidos vacíos# otorga #[[1]]#. + hintTextTable[RHT_ICE_CAVERN_MQ_GS_ICE_BLOCK] = HintText(CustomMessage("They say that a #web of ice# surrounds a spider with #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula protégée d'une toile glacée# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #gélida red# rodea a una Skulltula que otorga #[[1]]#. - hintTable[RHT_ICE_CAVERN_MQ_GS_SCARECROW] = HintText::Exclude({ - //obscure text - Text{"a #spider above icy pits# holds", /*french*/"une #Skulltula au dessus d'un goufre glacial# a", /*spanish*/"una #Skulltula sobre gélidos vacíos# otorga"}, - }); - - hintTable[RHT_ICE_CAVERN_MQ_GS_ICE_BLOCK] = HintText::Exclude({ - //obscure text - Text{"a #web of ice# surrounds a spider with", /*french*/"une #Skulltula protégée d'une toile glacée# a", /*spanish*/"una #gélida red# rodea a una Skulltula que otorga"}, - }); - - hintTable[RHT_ICE_CAVERN_MQ_GS_RED_ICE] = HintText::Exclude({ - //obscure text - Text{"a #spider in fiery ice# hoards", /*french*/"une #Skulltula figée dans la glace rouge# a", /*spanish*/"una #Skulltula tras un ardiente hielo# otorga"}, - }); + hintTextTable[RHT_ICE_CAVERN_MQ_GS_RED_ICE] = HintText(CustomMessage("They say that a #spider in fiery ice# hoards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula figée dans la glace rouge# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula tras un ardiente hielo# otorga #[[1]]#. /*-------------------------- | GERUDO TRAINING GROUNDS | ---------------------------*/ - hintTable[RHT_GERUDO_TRAINING_GROUND_LOBBY_LEFT_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #blinded eye in the Gerudo Training Grounds# drops", /*french*/"l'#Oeil dans le Gymnase Gerudo# voit", /*spanish*/"#cegar un ojo en el Centro de Instrucción Gerudo# revela"}, - }); + hintTextTable[RHT_GERUDO_TRAINING_GROUND_LOBBY_LEFT_CHEST] = HintText(CustomMessage("They say that a #blinded eye in the Gerudo Training Grounds# drops #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#Oeil dans le Gymnase Gerudo# voit #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #cegar un ojo en el Centro de Instrucción Gerudo# revela #[[1]]#. - hintTable[RHT_GERUDO_TRAINING_GROUND_LOBBY_RIGHT_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #blinded eye in the Gerudo Training Grounds# drops", /*french*/"l'#Oeil dans le Gymnase Gerudo# voit", /*spanish*/"#cegar un ojo en el Centro de Instrucción Gerudo# revela"}, - }); + hintTextTable[RHT_GERUDO_TRAINING_GROUND_LOBBY_RIGHT_CHEST] = HintText(CustomMessage("They say that a #blinded eye in the Gerudo Training Grounds# drops #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#Oeil dans le Gymnase Gerudo# voit #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #cegar un ojo en el Centro de Instrucción Gerudo# revela #[[1]]#. - hintTable[RHT_GERUDO_TRAINING_GROUND_STALFOS_CHEST] = HintText::Exclude({ - //obscure text - Text{"#soldiers walking on shifting sands# in the Gerudo Training Grounds guard", /*french*/"les #squelettes# du Gymnase Gerudo protègent", /*spanish*/"#soldados en resbaladizas arenas# del Centro de Instrucción Gerudo protegen"}, - }); + hintTextTable[RHT_GERUDO_TRAINING_GROUND_STALFOS_CHEST] = HintText(CustomMessage("They say that #soldiers walking on shifting sands# in the Gerudo Training Grounds guard #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #squelettes# du Gymnase Gerudo protègent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #soldados en resbaladizas arenas# del Centro de Instrucción Gerudo protegen #[[1]]#. - hintTable[RHT_GERUDO_TRAINING_GROUND_BEAMOS_CHEST] = HintText::Exclude({ - //obscure text - Text{"#reptilian warriors# in the Gerudo Training Grounds protect", /*french*/"les #lézards# dans le Gymnase Gerudo protègent", /*spanish*/"#unos escamosos guerreros# del Centro de Instrucción Gerudo protegen"}, - }); + hintTextTable[RHT_GERUDO_TRAINING_GROUND_BEAMOS_CHEST] = HintText(CustomMessage("They say that #reptilian warriors# in the Gerudo Training Grounds protect #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #lézards# dans le Gymnase Gerudo protègent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #unos escamosos guerreros# del Centro de Instrucción Gerudo protegen #[[1]]#. - hintTable[RHT_GERUDO_TRAINING_GROUND_HIDDEN_CEILING_CHEST] = HintText::Exclude({ - //obscure text - Text{"the #Eye of Truth# in the Gerudo Training Grounds reveals", /*french*/"#bien caché# dans le Gymnase Gerudo gît", /*spanish*/"el #Ojo de la Verdad# en el Centro de Instrucción Gerudo revela"}, - }); + hintTextTable[RHT_GERUDO_TRAINING_GROUND_HIDDEN_CEILING_CHEST] = HintText(CustomMessage("They say that the #Eye of Truth# in the Gerudo Training Grounds reveals #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #bien caché# dans le Gymnase Gerudo gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #Ojo de la Verdad# en el Centro de Instrucción Gerudo revela #[[1]]#. - hintTable[RHT_GERUDO_TRAINING_GROUND_MAZE_PATH_FIRST_CHEST] = HintText::Exclude({ - //obscure text - Text{"the first prize of #the thieves' training# is", /*french*/"le #premier trésor du Gymnase Gerudo# est", /*spanish*/"el primer premio de la #instrucción bandida# se trata de"}, - }); + hintTextTable[RHT_GERUDO_TRAINING_GROUND_MAZE_PATH_FIRST_CHEST] = HintText(CustomMessage("They say that the first prize of #the thieves' training# is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #premier trésor du Gymnase Gerudo# est #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el primer premio de la #instrucción bandida# se trata de #[[1]]#. - hintTable[RHT_GERUDO_TRAINING_GROUND_MAZE_PATH_SECOND_CHEST] = HintText::Exclude({ - //obscure text - Text{"the second prize of #the thieves' training# is", /*french*/"le #deuxième trésor du Gymnase Gerudo# est", /*spanish*/"el segundo premio de la #instrucción bandida# se trata de"}, - }); + hintTextTable[RHT_GERUDO_TRAINING_GROUND_MAZE_PATH_SECOND_CHEST] = HintText(CustomMessage("They say that the second prize of #the thieves' training# is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #deuxième trésor du Gymnase Gerudo# est #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el segundo premio de la #instrucción bandida# se trata de #[[1]]#. - hintTable[RHT_GERUDO_TRAINING_GROUND_MAZE_PATH_THIRD_CHEST] = HintText::Exclude({ - //obscure text - Text{"the third prize of #the thieves' training# is", /*french*/"le #troisième trésor du Gymnase Gerudo# est", /*spanish*/"el tercer premio de la #instrucción bandida# se trata de"}, - }); + hintTextTable[RHT_GERUDO_TRAINING_GROUND_MAZE_PATH_THIRD_CHEST] = HintText(CustomMessage("They say that the third prize of #the thieves' training# is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #troisième trésor du Gymnase Gerudo# est #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el tercer premio de la #instrucción bandida# se trata de #[[1]]#. - hintTable[RHT_GERUDO_TRAINING_GROUND_MAZE_RIGHT_CENTRAL_CHEST] = HintText::Exclude({ - //obscure text - Text{"the #Song of Time# in the Gerudo Training Grounds leads to", /*french*/"le #chant du temps# révèle dans le Gymnase Gerudo", /*spanish*/"la #Canción del Tiempo# en el Centro de Instrucción Gerudo conduce a"}, - }); + hintTextTable[RHT_GERUDO_TRAINING_GROUND_MAZE_RIGHT_CENTRAL_CHEST] = HintText(CustomMessage("They say that the #Song of Time# in the Gerudo Training Grounds leads to #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #chant du temps# révèle dans le Gymnase Gerudo #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la #Canción del Tiempo# en el Centro de Instrucción Gerudo conduce a #[[1]]#. - hintTable[RHT_GERUDO_TRAINING_GROUND_MAZE_RIGHT_SIDE_CHEST] = HintText::Exclude({ - //obscure text - Text{"the #Song of Time# in the Gerudo Training Grounds leads to", /*french*/"le #chant du temps# révèle dans le Gymnase Gerudo", /*spanish*/"la #Canción del Tiempo# en el Centro de Instrucción Gerudo conduce a"}, - }); + hintTextTable[RHT_GERUDO_TRAINING_GROUND_MAZE_RIGHT_SIDE_CHEST] = HintText(CustomMessage("They say that the #Song of Time# in the Gerudo Training Grounds leads to #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #chant du temps# révèle dans le Gymnase Gerudo #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la #Canción del Tiempo# en el Centro de Instrucción Gerudo conduce a #[[1]]#. - hintTable[RHT_GERUDO_TRAINING_GROUND_HAMMER_ROOM_CLEAR_CHEST] = HintText::Exclude({ - //obscure text - Text{"#fiery foes# in the Gerudo Training Grounds guard", /*french*/"les #limaces de feu# du Gymnase Gerudo protègent", /*spanish*/"unos #flamígeros enemigos# del Centro de Instrucción Gerudo guardan"}, - }); + hintTextTable[RHT_GERUDO_TRAINING_GROUND_HAMMER_ROOM_CLEAR_CHEST] = HintText(CustomMessage("They say that #fiery foes# in the Gerudo Training Grounds guard #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #limaces de feu# du Gymnase Gerudo protègent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, unos #flamígeros enemigos# del Centro de Instrucción Gerudo guardan #[[1]]#. - hintTable[RHT_GERUDO_TRAINING_GROUND_HAMMER_ROOM_SWITCH_CHEST] = HintText::Exclude({ - //obscure text - Text{"#engulfed in flame# where thieves train lies", /*french*/"le #trésor enflammé# du Gymnase Gerudo est", /*spanish*/"donde entrenan las bandidas #entre llamas# yace"}, - }); + hintTextTable[RHT_GERUDO_TRAINING_GROUND_HAMMER_ROOM_SWITCH_CHEST] = HintText(CustomMessage("They say that #engulfed in flame# where thieves train lies #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #trésor enflammé# du Gymnase Gerudo est #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, donde entrenan las bandidas #entre llamas# yace #[[1]]#. - hintTable[RHT_GERUDO_TRAINING_GROUND_EYE_STATUE_CHEST] = HintText::Exclude({ - //obscure text - Text{"thieves #blind four faces# to find", /*french*/"l'#épreuve d'archerie# du Gymnase Gerudo donne", /*spanish*/"las bandidas #ciegan cuatro bustos# para hallar"}, - }); + hintTextTable[RHT_GERUDO_TRAINING_GROUND_EYE_STATUE_CHEST] = HintText(CustomMessage("They say that thieves #blind four faces# to find #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#épreuve d'archerie# du Gymnase Gerudo donne #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, las bandidas #ciegan cuatro bustos# para hallar #[[1]]#. - hintTable[RHT_GERUDO_TRAINING_GROUND_NEAR_SCARECROW_CHEST] = HintText::Exclude({ - //obscure text - Text{"thieves #blind four faces# to find", /*french*/"l'#épreuve d'archerie# du Gymnase Gerudo donne", /*spanish*/"las bandidas #ciegan cuatro bustos# para hallar"}, - }); + hintTextTable[RHT_GERUDO_TRAINING_GROUND_NEAR_SCARECROW_CHEST] = HintText(CustomMessage("They say that thieves #blind four faces# to find #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#épreuve d'archerie# du Gymnase Gerudo donne #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, las bandidas #ciegan cuatro bustos# para hallar #[[1]]#. - hintTable[RHT_GERUDO_TRAINING_GROUND_BEFORE_HEAVY_BLOCK_CHEST] = HintText::Exclude({ - //obscure text - Text{"#before a block of silver# thieves can find", /*french*/"#près d'un bloc argent# dans le Gymnase Gerudo gît", /*spanish*/"#ante un plateado bloque# las bandidas hallan"}, - }); + hintTextTable[RHT_GERUDO_TRAINING_GROUND_BEFORE_HEAVY_BLOCK_CHEST] = HintText(CustomMessage("They say that #before a block of silver# thieves can find #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #près d'un bloc argent# dans le Gymnase Gerudo gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #ante un plateado bloque# las bandidas hallan #[[1]]#. - hintTable[RHT_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FIRST_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #feat of strength# rewards thieves with", /*french*/"#derrière un bloc argent# dans le Gymnase Gerudo gît", /*spanish*/"una #hazaña de fuerza# premia a las bandidas con"}, - }); + hintTextTable[RHT_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FIRST_CHEST] = HintText(CustomMessage("They say that a #feat of strength# rewards thieves with #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #derrière un bloc argent# dans le Gymnase Gerudo gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #hazaña de fuerza# premia a las bandidas con #[[1]]#. - hintTable[RHT_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_SECOND_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #feat of strength# rewards thieves with", /*french*/"#derrière un bloc argent# dans le Gymnase Gerudo gît", /*spanish*/"una #hazaña de fuerza# premia a las bandidas con"}, - }); + hintTextTable[RHT_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_SECOND_CHEST] = HintText(CustomMessage("They say that a #feat of strength# rewards thieves with #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #derrière un bloc argent# dans le Gymnase Gerudo gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #hazaña de fuerza# premia a las bandidas con #[[1]]#. - hintTable[RHT_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_THIRD_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #feat of strength# rewards thieves with", /*french*/"#derrière un bloc argent# dans le Gymnase Gerudo gît", /*spanish*/"una #hazaña de fuerza# premia a las bandidas con"}, - }); + hintTextTable[RHT_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_THIRD_CHEST] = HintText(CustomMessage("They say that a #feat of strength# rewards thieves with #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #derrière un bloc argent# dans le Gymnase Gerudo gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #hazaña de fuerza# premia a las bandidas con #[[1]]#. - hintTable[RHT_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FOURTH_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #feat of strength# rewards thieves with", /*french*/"#derrière un bloc argent# dans le Gymnase Gerudo gît", /*spanish*/"una #hazaña de fuerza# premia a las bandidas con"}, - }); + hintTextTable[RHT_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FOURTH_CHEST] = HintText(CustomMessage("They say that a #feat of strength# rewards thieves with #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #derrière un bloc argent# dans le Gymnase Gerudo gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #hazaña de fuerza# premia a las bandidas con #[[1]]#. - hintTable[RHT_GERUDO_TRAINING_GROUND_FREESTANDING_KEY] = HintText::Exclude({ - //obscure text - Text{"the #Song of Time# in the Gerudo Training Grounds leads to", /*french*/"le #chant du temps# révèle dans le Gymnase Gerudo", /*spanish*/"la #Canción del Tiempo# en el Centro de Instrucción Gerudo conduce a"}, - }); + hintTextTable[RHT_GERUDO_TRAINING_GROUND_FREESTANDING_KEY] = HintText(CustomMessage("They say that the #Song of Time# in the Gerudo Training Grounds leads to #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #chant du temps# révèle dans le Gymnase Gerudo #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la #Canción del Tiempo# en el Centro de Instrucción Gerudo conduce a #[[1]]#. + hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_CHEST] = HintText(CustomMessage("They say that #thieves prepare for training# with #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, dans #l'entrée du Gymnase Gerudo# gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, las #bandidas se instruyen# con #[[1]]#. - hintTable[RHT_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_CHEST] = HintText::Exclude({ - //obscure text - Text{"#thieves prepare for training# with", /*french*/"dans #l'entrée du Gymnase Gerudo# gît", /*spanish*/"las #bandidas se instruyen# con"}, - }); + hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_CHEST] = HintText(CustomMessage("They say that #thieves prepare for training# with #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, dans #l'entrée du Gymnase Gerudo# gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, las #bandidas se instruyen# con #[[1]]#. - hintTable[RHT_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_CHEST] = HintText::Exclude({ - //obscure text - Text{"#thieves prepare for training# with", /*french*/"dans #l'entrée du Gymnase Gerudo# gît", /*spanish*/"las #bandidas se instruyen# con"}, - }); + hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_FIRST_IRON_KNUCKLE_CHEST] = HintText(CustomMessage("They say that #soldiers walking on shifting sands# in the Gerudo Training Grounds guard #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #squelettes# du Gymnase Gerudo protègent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #soldados en resbaladizas arenas# del Centro de Instrucción Gerudo protegen #[[1]]#. - hintTable[RHT_GERUDO_TRAINING_GROUND_MQ_FIRST_IRON_KNUCKLE_CHEST] = HintText::Exclude({ - //obscure text - Text{"#soldiers walking on shifting sands# in the Gerudo Training Grounds guard", /*french*/"les #squelettes# du Gymnase Gerudo protègent", /*spanish*/"#soldados en resbaladizas arenas# del Centro de Instrucción Gerudo protegen"}, - }); + hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_BEFORE_HEAVY_BLOCK_CHEST] = HintText(CustomMessage("They say that #before a block of silver# thieves can find #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #près d'un bloc argent# dans le Gymnase Gerudo gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #ante un plateado bloque# las bandidas hallan #[[1]]#. - hintTable[RHT_GERUDO_TRAINING_GROUND_MQ_BEFORE_HEAVY_BLOCK_CHEST] = HintText::Exclude({ - //obscure text - Text{"#before a block of silver# thieves can find", /*french*/"#près d'un bloc argent# dans le Gymnase Gerudo gît", /*spanish*/"#ante un plateado bloque# las bandidas hallan"}, - }); + hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_EYE_STATUE_CHEST] = HintText(CustomMessage("They say that thieves #blind four faces# to find #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#épreuve d'archerie# du Gymnase Gerudo donne #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, las bandidas #ciegan cuatro bustos# para hallar #[[1]]#. - hintTable[RHT_GERUDO_TRAINING_GROUND_MQ_EYE_STATUE_CHEST] = HintText::Exclude({ - //obscure text - Text{"thieves #blind four faces# to find", /*french*/"l'#épreuve d'archerie# du Gymnase Gerudo donne", /*spanish*/"las bandidas #ciegan cuatro bustos# para hallar"}, - }); + hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_FLAME_CIRCLE_CHEST] = HintText(CustomMessage("They say that #engulfed in flame# where thieves train lies #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #trésor enflammé# du Gymnase Gerudo est #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, donde entrenan las bandidas #entre llamas# yace #[[1]]#. - hintTable[RHT_GERUDO_TRAINING_GROUND_MQ_FLAME_CIRCLE_CHEST] = HintText::Exclude({ - //obscure text - Text{"#engulfed in flame# where thieves train lies", /*french*/"le #trésor enflammé# du Gymnase Gerudo est", /*spanish*/"donde entrenan las bandidas #entre llamas# yace"}, - }); + hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_SECOND_IRON_KNUCKLE_CHEST] = HintText(CustomMessage("They say that #fiery foes# in the Gerudo Training Grounds guard #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #ennemis de feu# du Gymnase Gerudo protègent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, unos #flamígeros enemigos# del Centro de Instrucción Gerudo guardan #[[1]]#. - hintTable[RHT_GERUDO_TRAINING_GROUND_MQ_SECOND_IRON_KNUCKLE_CHEST] = HintText::Exclude({ - //obscure text - Text{"#fiery foes# in the Gerudo Training Grounds guard", /*french*/"les #ennemis de feu# du Gymnase Gerudo protègent", /*spanish*/"unos #flamígeros enemigos# del Centro de Instrucción Gerudo guardan"}, - }); + hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_CHEST] = HintText(CustomMessage("They say that #reptilian warriors# in the Gerudo Training Grounds protect #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #lézards# dans le Gymnase Gerudo protègent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #unos escamosos guerreros# del Centro de Instrucción Gerudo protegen #[[1]]#. - hintTable[RHT_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_CHEST] = HintText::Exclude({ - //obscure text - Text{"#reptilian warriors# in the Gerudo Training Grounds protect", /*french*/"les #lézards# dans le Gymnase Gerudo protègent", /*spanish*/"#unos escamosos guerreros# del Centro de Instrucción Gerudo protegen"}, - }); + hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_CENTRAL_CHEST] = HintText(CustomMessage("They say that a #path of fire# leads thieves to #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, dans le #chemin enflammé# dans le Gymnase Gerudo gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #camino de fuego# conduce a las bandidas a #[[1]]#. - hintTable[RHT_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_CENTRAL_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #path of fire# leads thieves to", /*french*/"dans le #chemin enflammé# dans le Gymnase Gerudo gît", /*spanish*/"un #camino de fuego# conduce a las bandidas a"}, - }); + hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_FIRST_CHEST] = HintText(CustomMessage("They say that the first prize of #the thieves' training# is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #premier trésor du Gymnase Gerudo# est #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el primer premio de la #instrucción bandida# se trata de #[[1]]#. - hintTable[RHT_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_FIRST_CHEST] = HintText::Exclude({ - //obscure text - Text{"the first prize of #the thieves' training# is", /*french*/"le #premier trésor du Gymnase Gerudo# est", /*spanish*/"el primer premio de la #instrucción bandida# se trata de"}, - }); + hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_SIDE_CHEST] = HintText(CustomMessage("They say that a #path of fire# leads thieves to #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, dans le #chemin enflammé# dans le Gymnase Gerudo gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #camino de fuego# conduce a las bandidas a #[[1]]#. - hintTable[RHT_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_SIDE_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #path of fire# leads thieves to", /*french*/"dans le #chemin enflammé# dans le Gymnase Gerudo gît", /*spanish*/"un #camino de fuego# conduce a las bandidas a"}, - }); + hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_THIRD_CHEST] = HintText(CustomMessage("They say that the third prize of #the thieves' training# is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #troisième trésor du Gymnase Gerudo# est #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el tercer premio de la #instrucción bandida# se trata de #[[1]]#. - hintTable[RHT_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_THIRD_CHEST] = HintText::Exclude({ - //obscure text - Text{"the third prize of #the thieves' training# is", /*french*/"le #troisième trésor du Gymnase Gerudo# est", /*spanish*/"el tercer premio de la #instrucción bandida# se trata de"}, - }); + hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_SECOND_CHEST] = HintText(CustomMessage("They say that the second prize of #the thieves' training# is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #deuxième trésor du Gymnase Gerudo# est #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el segundo premio de la #instrucción bandida# se trata de #[[1]]#. - hintTable[RHT_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_SECOND_CHEST] = HintText::Exclude({ - //obscure text - Text{"the second prize of #the thieves' training# is", /*french*/"le #deuxième trésor du Gymnase Gerudo# est", /*spanish*/"el segundo premio de la #instrucción bandida# se trata de"}, - }); + hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_HIDDEN_CEILING_CHEST] = HintText(CustomMessage("They say that the #Eye of Truth# in the Gerudo Training Grounds reveals #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #bien caché# dans le Gymnase Gerudo gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #Ojo de la Verdad# en el Centro de Instrucción Gerudo revela #[[1]]#. - hintTable[RHT_GERUDO_TRAINING_GROUND_MQ_HIDDEN_CEILING_CHEST] = HintText::Exclude({ - //obscure text - Text{"the #Eye of Truth# in the Gerudo Training Grounds reveals", /*french*/"#bien caché# dans le Gymnase Gerudo gît", /*spanish*/"el #Ojo de la Verdad# en el Centro de Instrucción Gerudo revela"}, - }); - - hintTable[RHT_GERUDO_TRAINING_GROUND_MQ_HEAVY_BLOCK_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #feat of strength# rewards thieves with", /*french*/"#derrière un bloc argent# dans le Gymnase Gerudo gît", /*spanish*/"una #hazaña de fuerza# premia a las bandidas con"}, - }); + hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_HEAVY_BLOCK_CHEST] = HintText(CustomMessage("They say that a #feat of strength# rewards thieves with #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #derrière un bloc argent# dans le Gymnase Gerudo gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #hazaña de fuerza# premia a las bandidas con #[[1]]#. /*-------------------------- | GANONS CASTLE | ---------------------------*/ - hintTable[RHT_GANONS_TOWER_BOSS_KEY_CHEST] = HintText::Exclude({ - //obscure text - Text{"the #Evil King# hoards", /*french*/"le #Roi du Mal# possède", /*spanish*/"el #Rey del Mal# acapara"}, - }); + hintTextTable[RHT_GANONS_TOWER_BOSS_KEY_CHEST] = HintText(CustomMessage("They say that the #Evil King# hoards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #Roi du Mal# possède #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #Rey del Mal# acapara #[[1]]#. + hintTextTable[RHT_GANONS_CASTLE_FOREST_TRIAL_CHEST] = HintText(CustomMessage("They say that the #test of the wilds# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#épreuve des bois# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la #prueba de la naturaleza# brinda #[[1]]#. - hintTable[RHT_GANONS_CASTLE_FOREST_TRIAL_CHEST] = HintText::Exclude({ - //obscure text - Text{"the #test of the wilds# holds", /*french*/"l'#épreuve des bois# contient", /*spanish*/"la #prueba de la naturaleza# brinda"}, - }); + hintTextTable[RHT_GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST] = HintText(CustomMessage("They say that the #test of the seas# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#épreuve des mers# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la #prueba del mar# brinda #[[1]]#. - hintTable[RHT_GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST] = HintText::Exclude({ - //obscure text - Text{"the #test of the seas# holds", /*french*/"l'#épreuve des mers# contient", /*spanish*/"la #prueba del mar# brinda"}, - }); + hintTextTable[RHT_GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST] = HintText(CustomMessage("They say that the #test of the seas# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#épreuve des mers# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la #prueba del mar# brinda #[[1]]#. - hintTable[RHT_GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST] = HintText::Exclude({ - //obscure text - Text{"the #test of the seas# holds", /*french*/"l'#épreuve des mers# contient", /*spanish*/"la #prueba del mar# brinda"}, - }); + hintTextTable[RHT_GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST] = HintText(CustomMessage("They say that #music in the test of darkness# unveils #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #musique dans l'épreuve des ténèbres# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la #música en la prueba de la oscuridad# revela #[[1]]#. - hintTable[RHT_GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST] = HintText::Exclude({ - //obscure text - Text{"#music in the test of darkness# unveils", /*french*/"la #musique dans l'épreuve des ténèbres# révèle", /*spanish*/"la #música en la prueba de la oscuridad# revela"}, - }); + hintTextTable[RHT_GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST] = HintText(CustomMessage("They say that #light in the test of darkness# unveils #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #lumière dans l'épreuve des ténèbres# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la #luz en la prueba de la oscuridad# revela #[[1]]#. - hintTable[RHT_GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST] = HintText::Exclude({ - //obscure text - Text{"#light in the test of darkness# unveils", /*french*/"la #lumière dans l'épreuve des ténèbres# révèle", /*spanish*/"la #luz en la prueba de la oscuridad# revela"}, - }); + hintTextTable[RHT_GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST] = HintText(CustomMessage("They say that the #test of the sands# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#épreuve des sables# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la #prueba de las arenas# brinda #[[1]]#. - hintTable[RHT_GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST] = HintText::Exclude({ - //obscure text - Text{"the #test of the sands# holds", /*french*/"l'#épreuve des sables# contient", /*spanish*/"la #prueba de las arenas# brinda"}, - }); + hintTextTable[RHT_GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST] = HintText(CustomMessage("They say that the #test of the sands# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#épreuve des sables# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la #prueba de las arenas# brinda #[[1]]#. - hintTable[RHT_GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST] = HintText::Exclude({ - //obscure text - Text{"the #test of the sands# holds", /*french*/"l'#épreuve des sables# contient", /*spanish*/"la #prueba de las arenas# brinda"}, - }); + hintTextTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST] = HintText(CustomMessage("They say that the #test of radiance# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#épreuve du ciel# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la #prueba del resplandor# brinda #[[1]]#. - hintTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST] = HintText::Exclude({ - //obscure text - Text{"the #test of radiance# holds", /*french*/"l'#épreuve du ciel# contient", /*spanish*/"la #prueba del resplandor# brinda"}, - }); + hintTextTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST] = HintText(CustomMessage("They say that the #test of radiance# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#épreuve du ciel# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la #prueba del resplandor# brinda #[[1]]#. - hintTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST] = HintText::Exclude({ - //obscure text - Text{"the #test of radiance# holds", /*french*/"l'#épreuve du ciel# contient", /*spanish*/"la #prueba del resplandor# brinda"}, - }); + hintTextTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST] = HintText(CustomMessage("They say that the #test of radiance# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#épreuve du ciel# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la #prueba del resplandor# brinda #[[1]]#. - hintTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST] = HintText::Exclude({ - //obscure text - Text{"the #test of radiance# holds", /*french*/"l'#épreuve du ciel# contient", /*spanish*/"la #prueba del resplandor# brinda"}, - }); + hintTextTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_FIRST_RIGHT_CHEST] = HintText(CustomMessage("They say that the #test of radiance# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#épreuve du ciel# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la #prueba del resplandor# brinda #[[1]]#. - hintTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_FIRST_RIGHT_CHEST] = HintText::Exclude({ - //obscure text - Text{"the #test of radiance# holds", /*french*/"l'#épreuve du ciel# contient", /*spanish*/"la #prueba del resplandor# brinda"}, - }); + hintTextTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_SECOND_RIGHT_CHEST] = HintText(CustomMessage("They say that the #test of radiance# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#épreuve du ciel# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la #prueba del resplandor# brinda #[[1]]#. - hintTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_SECOND_RIGHT_CHEST] = HintText::Exclude({ - //obscure text - Text{"the #test of radiance# holds", /*french*/"l'#épreuve du ciel# contient", /*spanish*/"la #prueba del resplandor# brinda"}, - }); + hintTextTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST] = HintText(CustomMessage("They say that the #test of radiance# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#épreuve du ciel# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la #prueba del resplandor# brinda #[[1]]#. - hintTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST] = HintText::Exclude({ - //obscure text - Text{"the #test of radiance# holds", /*french*/"l'#épreuve du ciel# contient", /*spanish*/"la #prueba del resplandor# brinda"}, - }); + hintTextTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST] = HintText(CustomMessage("They say that the #test of radiance# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#épreuve du ciel# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la #prueba del resplandor# brinda #[[1]]#. - hintTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST] = HintText::Exclude({ - //obscure text - Text{"the #test of radiance# holds", /*french*/"l'#épreuve du ciel# contient", /*spanish*/"la #prueba del resplandor# brinda"}, - }); + hintTextTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST] = HintText(CustomMessage("They say that #music in the test of radiance# reveals #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #musique dans l'épreuve du ciel# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la #música en la prueba del resplandor# revela #[[1]]#. - hintTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST] = HintText::Exclude({ - //obscure text - Text{"#music in the test of radiance# reveals", /*french*/"la #musique dans l'épreuve du ciel# révèle", /*spanish*/"la #música en la prueba del resplandor# revela"}, - }); + hintTextTable[RHT_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST] = HintText(CustomMessage("They say that the #test of the seas# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#épreuve des mers# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la #prueba del mar# brinda #[[1]]#. + hintTextTable[RHT_GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST] = HintText(CustomMessage("They say that the #test of the wilds# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#épreuve des bois# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la #prueba de la naturaleza# brinda #[[1]]#. - hintTable[RHT_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST] = HintText::Exclude({ - //obscure text - Text{"the #test of the seas# holds", /*french*/"l'#épreuve des mers# contient", /*spanish*/"la #prueba del mar# brinda"}, - }); + hintTextTable[RHT_GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST] = HintText(CustomMessage("They say that the #test of the wilds# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#épreuve des bois# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la #prueba de la naturaleza# brinda #[[1]]#. - hintTable[RHT_GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST] = HintText::Exclude({ - //obscure text - Text{"the #test of the wilds# holds", /*french*/"l'#épreuve des bois# contient", /*spanish*/"la #prueba de la naturaleza# brinda"}, - }); + hintTextTable[RHT_GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST] = HintText(CustomMessage("They say that #music in the test of radiance# reveals #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #musique dans l'épreuve du ciel# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la #música en la prueba del resplandor# revela #[[1]]#. - hintTable[RHT_GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST] = HintText::Exclude({ - //obscure text - Text{"the #test of the wilds# holds", /*french*/"l'#épreuve des bois# contient", /*spanish*/"la #prueba de la naturaleza# brinda"}, - }); + hintTextTable[RHT_GANONS_CASTLE_MQ_SHADOW_TRIAL_BOMB_FLOWER_CHEST] = HintText(CustomMessage("They say that the #test of darkness# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#épreuve des ténèbres# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la #prueba de la oscuridad# brinda #[[1]]#. - hintTable[RHT_GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST] = HintText::Exclude({ - //obscure text - Text{"#music in the test of radiance# reveals", /*french*/"la #musique dans l'épreuve du ciel# révèle", /*spanish*/"la #música en la prueba del resplandor# revela"}, - }); + hintTextTable[RHT_GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST] = HintText(CustomMessage("They say that the #test of darkness# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#épreuve des ténèbres# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la #prueba de la oscuridad# brinda #[[1]]#. - hintTable[RHT_GANONS_CASTLE_MQ_SHADOW_TRIAL_BOMB_FLOWER_CHEST] = HintText::Exclude({ - //obscure text - Text{"the #test of darkness# holds", /*french*/"l'#épreuve des ténèbres# contient", /*spanish*/"la #prueba de la oscuridad# brinda"}, - }); + hintTextTable[RHT_GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST] = HintText(CustomMessage("They say that #reflected light in the test of the sands# reveals #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #soleil dans l'épreuve des sables# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #reflejar la luz en la prueba de las arenas# revela #[[1]]#. - hintTable[RHT_GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST] = HintText::Exclude({ - //obscure text - Text{"the #test of darkness# holds", /*french*/"l'#épreuve des ténèbres# contient", /*spanish*/"la #prueba de la oscuridad# brinda"}, - }); + hintTextTable[RHT_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST] = HintText(CustomMessage("They say that #reflected light in the test of the sands# reveals #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #soleil dans l'épreuve des sables# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #reflejar la luz en la prueba de las arenas# revela #[[1]]#. - hintTable[RHT_GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST] = HintText::Exclude({ - //obscure text - Text{"#reflected light in the test of the sands# reveals", /*french*/"le #soleil dans l'épreuve des sables# révèle", /*spanish*/"#reflejar la luz en la prueba de las arenas# revela"}, - }); + hintTextTable[RHT_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST] = HintText(CustomMessage("They say that #reflected light in the test of the sands# reveals #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #soleil dans l'épreuve des sables# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #reflejar la luz en la prueba de las arenas# revela #[[1]]#. - hintTable[RHT_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST] = HintText::Exclude({ - //obscure text - Text{"#reflected light in the test of the sands# reveals", /*french*/"le #soleil dans l'épreuve des sables# révèle", /*spanish*/"#reflejar la luz en la prueba de las arenas# revela"}, - }); + hintTextTable[RHT_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_FRONT_LEFT_CHEST] = HintText(CustomMessage("They say that #reflected light in the test of the sands# reveals #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #soleil dans l'épreuve des sables# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #reflejar la luz en la prueba de las arenas# revela #[[1]]#. - hintTable[RHT_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST] = HintText::Exclude({ - //obscure text - Text{"#reflected light in the test of the sands# reveals", /*french*/"le #soleil dans l'épreuve des sables# révèle", /*spanish*/"#reflejar la luz en la prueba de las arenas# revela"}, - }); + hintTextTable[RHT_GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST] = HintText(CustomMessage("They say that #reflected light in the test of the sands# reveals #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #soleil dans l'épreuve des sables# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #reflejar la luz en la prueba de las arenas# revela #[[1]]#. - hintTable[RHT_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_FRONT_LEFT_CHEST] = HintText::Exclude({ - //obscure text - Text{"#reflected light in the test of the sands# reveals", /*french*/"le #soleil dans l'épreuve des sables# révèle", /*spanish*/"#reflejar la luz en la prueba de las arenas# revela"}, - }); + hintTextTable[RHT_GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST] = HintText(CustomMessage("They say that #reflected light in the test of the sands# reveals #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #soleil dans l'épreuve des sables# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #reflejar la luz en la prueba de las arenas# revela #[[1]]#. - hintTable[RHT_GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST] = HintText::Exclude({ - //obscure text - Text{"#reflected light in the test of the sands# reveals", /*french*/"le #soleil dans l'épreuve des sables# révèle", /*spanish*/"#reflejar la luz en la prueba de las arenas# revela"}, - }); + hintTextTable[RHT_GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY] = HintText(CustomMessage("They say that the #test of the wilds# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#épreuve des bois# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la #prueba de la naturaleza# brinda #[[1]]#. - hintTable[RHT_GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST] = HintText::Exclude({ - //obscure text - Text{"#reflected light in the test of the sands# reveals", /*french*/"le #soleil dans l'épreuve des sables# révèle", /*spanish*/"#reflejar la luz en la prueba de las arenas# revela"}, - }); + hintTextTable[RHT_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT] = HintText(CustomMessage("They say that #scrubs in Ganon's Castle# sell #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #pestes Mojo dans le Château de Ganon# vendent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, los #dekus del Castillo de Ganon# venden #[[1]]#. - hintTable[RHT_GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY] = HintText::Exclude({ - //obscure text - Text{"the #test of the wilds# holds", /*french*/"l'#épreuve des bois# révèle", /*spanish*/"la #prueba de la naturaleza# brinda"}, - }); + hintTextTable[RHT_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT] = HintText(CustomMessage("They say that #scrubs in Ganon's Castle# sell #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #pestes Mojo dans le Château de Ganon# vendent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, los #dekus del Castillo de Ganon# venden #[[1]]#. - hintTable[RHT_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT] = HintText::Exclude({ - //obscure text - Text{"#scrubs in Ganon's Castle# sell", /*french*/"les #pestes Mojo dans le Château de Ganon# vendent", /*spanish*/"los #dekus del Castillo de Ganon# venden"}, - }); + hintTextTable[RHT_GANONS_CASTLE_DEKU_SCRUB_RIGHT] = HintText(CustomMessage("They say that #scrubs in Ganon's Castle# sell #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #pestes Mojo dans le Château de Ganon# vendent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, los #dekus del Castillo de Ganon# venden #[[1]]#. - hintTable[RHT_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT] = HintText::Exclude({ - //obscure text - Text{"#scrubs in Ganon's Castle# sell", /*french*/"les #pestes Mojo dans le Château de Ganon# vendent", /*spanish*/"los #dekus del Castillo de Ganon# venden"}, - }); + hintTextTable[RHT_GANONS_CASTLE_DEKU_SCRUB_LEFT] = HintText(CustomMessage("They say that #scrubs in Ganon's Castle# sell #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #pestes Mojo dans le Château de Ganon# vendent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, los #dekus del Castillo de Ganon# venden #[[1]]#. - hintTable[RHT_GANONS_CASTLE_DEKU_SCRUB_RIGHT] = HintText::Exclude({ - //obscure text - Text{"#scrubs in Ganon's Castle# sell", /*french*/"les #pestes Mojo dans le Château de Ganon# vendent", /*spanish*/"los #dekus del Castillo de Ganon# venden"}, - }); + hintTextTable[RHT_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT] = HintText(CustomMessage("They say that #scrubs in Ganon's Castle# sell #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #pestes Mojo dans le Château de Ganon# vendent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, los #dekus del Castillo de Ganon# venden #[[1]]#. - hintTable[RHT_GANONS_CASTLE_DEKU_SCRUB_LEFT] = HintText::Exclude({ - //obscure text - Text{"#scrubs in Ganon's Castle# sell", /*french*/"les #pestes Mojo dans le Château de Ganon# vendent", /*spanish*/"los #dekus del Castillo de Ganon# venden"}, - }); + hintTextTable[RHT_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT] = HintText(CustomMessage("They say that #scrubs in Ganon's Castle# sell #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #pestes Mojo dans le Château de Ganon# vendent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, los #dekus del Castillo de Ganon# venden #[[1]]#. + hintTextTable[RHT_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER] = HintText(CustomMessage("They say that #scrubs in Ganon's Castle# sell #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #pestes Mojo dans le Château de Ganon# vendent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, los #dekus del Castillo de Ganon# venden #[[1]]#. - hintTable[RHT_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT] = HintText::Exclude({ - //obscure text - Text{"#scrubs in Ganon's Castle# sell", /*french*/"les #pestes Mojo dans le Château de Ganon# vendent", /*spanish*/"los #dekus del Castillo de Ganon# venden"}, - }); + hintTextTable[RHT_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT] = HintText(CustomMessage("They say that #scrubs in Ganon's Castle# sell #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #pestes Mojo dans le Château de Ganon# vendent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, los #dekus del Castillo de Ganon# venden #[[1]]#. - hintTable[RHT_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT] = HintText::Exclude({ - //obscure text - Text{"#scrubs in Ganon's Castle# sell", /*french*/"les #pestes Mojo dans le Château de Ganon# vendent", /*spanish*/"los #dekus del Castillo de Ganon# venden"}, - }); - - hintTable[RHT_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER] = HintText::Exclude({ - //obscure text - Text{"#scrubs in Ganon's Castle# sell", /*french*/"les #pestes Mojo dans le Château de Ganon# vendent", /*spanish*/"los #dekus del Castillo de Ganon# venden"}, - }); - - hintTable[RHT_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT] = HintText::Exclude({ - //obscure text - Text{"#scrubs in Ganon's Castle# sell", /*french*/"les #pestes Mojo dans le Château de Ganon# vendent", /*spanish*/"los #dekus del Castillo de Ganon# venden"}, - }); - - hintTable[RHT_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT] = HintText::Exclude({ - //obscure text - Text{"#scrubs in Ganon's Castle# sell", /*french*/"les #pestes Mojo dans le Château de Ganon# vendent", /*spanish*/"los #dekus del Castillo de Ganon# venden"}, - }); + hintTextTable[RHT_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT] = HintText(CustomMessage("They say that #scrubs in Ganon's Castle# sell #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #pestes Mojo dans le Château de Ganon# vendent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, los #dekus del Castillo de Ganon# venden #[[1]]#. +} } diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp index c705bb2b6..570101b4e 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp @@ -1,1467 +1,1491 @@ -#include "../hint_list.hpp" -#include - -void HintTable_Init_Exclude_Overworld() { - hintTable[RHT_KF_KOKIRI_SWORD_CHEST] = HintText::Exclude({ - //obscure text - Text{"the #hidden treasure of the Kokiri# is", /*french*/"le #trésor des Kokiri# est", /*spanish*/"el #tesoro oculto de los Kokiri# esconde"}, - }); - - hintTable[RHT_KF_MIDOS_TOP_LEFT_CHEST] = HintText::Exclude({ - //obscure text - Text{"the #leader of the Kokiri# hides", /*french*/"le #chef des Kokiri# possède", /*spanish*/"el #líder de los Kokiri# esconde"}, - }, {}, - //clear text - Text{"#inside Mido's house# is", /*french*/"#dans la maison de Mido# gît", /*spanish*/"en la #casa de Mido# yace"} - ); - - hintTable[RHT_KF_MIDOS_TOP_RIGHT_CHEST] = HintText::Exclude({ - //obscure text - Text{"the #leader of the Kokiri# hides", /*french*/"le #chef des Kokiri# possède", /*spanish*/"el #líder de los Kokiri# esconde"}, - }, {}, - //clear text - Text{"#inside Mido's house# is", /*french*/"#dans la maison de Mido# gît", /*spanish*/"en la #casa de Mido# yace"} - ); - - hintTable[RHT_KF_MIDOS_BOTTOM_LEFT_CHEST] = HintText::Exclude({ - //obscure text - Text{"the #leader of the Kokiri# hides", /*french*/"le #chef des Kokiri# possède", /*spanish*/"el #líder de los Kokiri# esconde"}, - }, {}, - //clear text - Text{"#inside Mido's house# is", /*french*/"#dans la maison de Mido# gît", /*spanish*/"en la #casa de Mido# yace"} - ); - - hintTable[RHT_KF_MIDOS_BOTTOM_RIGHT_CHEST] = HintText::Exclude({ - //obscure text - Text{"the #leader of the Kokiri# hides", /*french*/"le #chef des Kokiri# possède", /*spanish*/"el #líder de los Kokiri# esconde"}, - }, {}, - //clear text - Text{"#inside Mido's house# is", /*french*/"#dans la maison de Mido# gît", /*spanish*/"en la #casa de Mido# yace"} - ); - - hintTable[RHT_GRAVEYARD_SHIELD_GRAVE_CHEST] = HintText::Exclude({ - //obscure text - Text{"the #treasure of a fallen soldier# is", /*french*/"le #trésor du soldat mort# est", /*spanish*/"el #tesoro de un soldado caído# esconde"}, - }); - - hintTable[RHT_DMT_CHEST] = HintText::Exclude({ - //obscure text - Text{"hidden behind a wall on a #mountain trail# is", /*french*/"derrière une façade du #chemin montagneux# est", /*spanish*/"tras una pared del #sendero de la montaña# yace"}, - }); - - hintTable[RHT_GC_MAZE_RIGHT_CHEST] = HintText::Exclude({ - //obscure text - Text{"in #Goron City# explosives unlock", /*french*/"des explosions dans le #village Goron# révèlent", /*spanish*/"en la #Ciudad Goron# unos explosivos desbloquean"}, - }); - - hintTable[RHT_GC_MAZE_CENTER_CHEST] = HintText::Exclude({ - //obscure text - Text{"in #Goron City# explosives unlock", /*french*/"des explosions dans le #village Goron# révèlent", /*spanish*/"en la #Ciudad Goron# unos explosivos desbloquean"}, - }); - - hintTable[RHT_ZD_CHEST] = HintText::Exclude({ - //obscure text - Text{"fire #beyond a waterfall# reveals", /*french*/"du feu #derrière la cascade# éclaire", /*spanish*/"las #llamas tras una una cascada# revelan"}, - }); - - hintTable[RHT_GRAVEYARD_HOOKSHOT_CHEST] = HintText::Exclude({ - //obscure text - Text{"a chest hidden by a #speedy spectre# holds", /*french*/"le #coffre du rapide revenant# contient", /*spanish*/"un cofre custodiado por un #espectro veloz# contiene"}, - }, {}, - //clear text - Text{"#dead Dampé's first prize# is", /*french*/"la #première course d'Igor# donne", /*spanish*/"el primer premio de #la carrera de Dampé# se trata de"} - ); - - hintTable[RHT_GF_CHEST] = HintText::Exclude({ - //obscure text - Text{"on a #rooftop in the desert# lies", /*french*/"sur un #toit du désert# gît", /*spanish*/"en una #azotea del desierto# yace"}, - }); - - hintTable[RHT_KAK_REDEAD_GROTTO_CHEST] = HintText::Exclude({ - //obscure text - Text{"#zombies beneath the earth# guard", /*french*/"les #revenants sous terre# protègent", /*spanish*/"unos #zombis subterráneos# esconden"}, - }); - - hintTable[RHT_SFM_WOLFOS_GROTTO_CHEST] = HintText::Exclude({ - //obscure text - Text{"#wolves beneath the earth# guard", /*french*/"les #loups sous terre# protègent", /*spanish*/"unos #lobos subterráneos# esconden"}, - }); - - hintTable[RHT_HF_NEAR_MARKET_GROTTO_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #hole in a field near a drawbridge# holds", /*french*/"la #grotte près d'un pont# contient", /*spanish*/"bajo el #hoyo de una llanura cercano a un puente# yace"}, - }); - - hintTable[RHT_HF_NEAR_MARKET_GROTTO_FISH] = HintText::Exclude({ - //obscure text - Text{"a #fish in a hole in a field near a drawbridge# holds", /*french*/"la #grotte près d'un pont# contient", /*spanish*/"bajo el #hoyo de una llanura cercano a un puente# yace"}, - }); - - hintTable[RHT_HF_SOUTHEAST_GROTTO_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #hole amongst trees in a field# holds", /*french*/"la #grotte près des arbres# contient", /*spanish*/"bajo el #hoyo de una llanura rodeado de árboles# yace"}, - }); - - hintTable[RHT_HF_SOUTHEAST_GROTTO_FISH] = HintText::Exclude({ - //obscure text - Text{"a #fish in a hole amongst trees in a field# holds", /*french*/"la #grotte près des arbres# contient", /*spanish*/"bajo el #hoyo de una llanura rodeado de árboles# yace"}, - }); - - hintTable[RHT_HF_OPEN_GROTTO_CHEST] = HintText::Exclude({ - //obscure text - Text{"an #open hole in a field# holds", /*french*/"la #grotte dans les plaines# contient", /*spanish*/"bajo el #hoyo descubierto de una llanura# yace"}, - }); - - hintTable[RHT_HF_OPEN_GROTTO_FISH] = HintText::Exclude({ - //obscure text - Text{"a #fish in an open hole in a field# holds", /*french*/"la #grotte dans les plaines# contient", /*spanish*/"bajo el #hoyo descubierto de una llanura# yace"}, - }); - - hintTable[RHT_KAK_OPEN_GROTTO_CHEST] = HintText::Exclude({ - //obscure text - Text{"an #open hole in a town# holds", /*french*/"la #grotte dans le village# contient", /*spanish*/"bajo el #hoyo descubierto de un pueblo# yace"}, - }); - - hintTable[RHT_KAK_OPEN_GROTTO_FISH] = HintText::Exclude({ - //obscure text - Text{"a #fish in an open hole in a town# holds", /*french*/"la #grotte dans le village# contient", /*spanish*/"bajo el #hoyo descubierto de un pueblo# yace"}, - }); - - hintTable[RHT_ZR_OPEN_GROTTO_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #hole along a river# holds", /*french*/"la #grotte près du fleuve# contient", /*spanish*/"bajo un #hoyo junto a un río# yace"}, - }); - - hintTable[RHT_ZR_OPEN_GROTTO_FISH] = HintText::Exclude({ - //obscure text - Text{"a #fish in a hole along a river# holds", /*french*/"la #grotte près du fleuve# contient", /*spanish*/"bajo un #hoyo junto a un río# yace"}, - }); - - hintTable[RHT_KF_STORMS_GROTTO_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #hole in a forest village# holds", /*french*/"la #grotte inondée de pluie dans le Village Kokiri# révèle", /*spanish*/"bajo el #hoyo de una tribu del bosque# yace"}, - }); - - hintTable[RHT_KF_STORMS_GROTTO_FISH] = HintText::Exclude({ - //obscure text - Text{"a #fish in a hole in a forest village# holds", /*french*/"la #grotte inondée de pluie dans le Village Kokiri# révèle", /*spanish*/"bajo el #hoyo de una tribu del bosque# yace"}, - }); - - hintTable[RHT_LW_NEAR_SHORTCUTS_GROTTO_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #hole in a wooded maze# holds", /*french*/"la #grotte dans le labyrinthe sylvestre# contient", /*spanish*/"bajo un #hoyo de un laberinto forestal# yace"}, - }); - - hintTable[RHT_LW_NEAR_SHORTCUTS_GROTTO_FISH] = HintText::Exclude({ - //obscure text - Text{"a #fish in a hole in a wooded maze# holds", /*french*/"la #grotte dans le labyrinthe sylvestre# contient", /*spanish*/"bajo un #hoyo de un laberinto forestal# yace"}, - }); - - hintTable[RHT_DMT_STORMS_GROTTO_CHEST] = HintText::Exclude({ - //obscure text - Text{"#hole flooded with rain on a mountain# holds", /*french*/"la #grotte inondée de pluie sur la montagne# contient", /*spanish*/"bajo un #hoyo de una montaña inundado de lluvia# yace"}, - }); - - hintTable[RHT_DMT_STORMS_GROTTO_FISH] = HintText::Exclude({ - //obscure text - Text{"#fish in a hole flooded with rain on a mountain# holds", /*french*/"la #grotte inondée de pluie sur la montagne# contient", /*spanish*/"bajo un #hoyo de una montaña inundado de lluvia# yace"}, - }); - - hintTable[RHT_DMC_UPPER_GROTTO_CHEST] = HintText::Exclude({ - //obscure text - Text{"a #hole in a volcano# holds", /*french*/"la #grotte dans le volcan# contient", /*spanish*/"bajo el #hoyo de un volcán# yace"}, - }); - - hintTable[RHT_DMC_UPPER_GROTTO_FISH] = HintText::Exclude({ - //obscure text - Text{"a #fish in a hole in a volcano# holds", /*french*/"la #grotte dans le volcan# contient", /*spanish*/"bajo el #hoyo de un volcán# yace"}, - }); - - hintTable[RHT_TOT_MASTER_SWORD] = HintText::Exclude({ - //obscure text - Text{"a #pedestal in a temple# holds", /*french*/"un #piédestal dans un temple# contient", /*spanish*/"un #pedestal en un templo# sostiene"}, - }); - - hintTable[RHT_TOT_LIGHT_ARROWS_CUTSCENE] = HintText::Exclude({ - //obscure text - Text{"the #final gift of a princess# is", /*french*/"le #cadeau d'adieu de la princesse# est", /*spanish*/"el #obsequio final de la princesa# se trata de"}, - }); - - hintTable[RHT_LW_GIFT_FROM_SARIA] = HintText::Exclude({ - //obscure text - Text{"a #potato hoarder# holds", /*french*/"le #panini mélodieux# est en fait", /*spanish*/"cierta #jovencita verde# concede"}, - Text{"a rooty tooty #flutey cutey# gifts", /*french*/"la #patate musicale# est en fait", /*spanish*/"una #gran amiga# concede"}, - }, {}, - //clear text - Text{"#Saria's Gift# is", /*french*/"le #cadeau de Saria# est", /*spanish*/"el #regalo de Saria# se trata de"} - ); - - hintTable[RHT_ZF_GREAT_FAIRY_REWARD] = HintText::Exclude({ - //obscure text - Text{"the #fairy of winds# holds", /*french*/"la #fée du vent# a", /*spanish*/"el #hada del viento# brinda"}, - }); - - hintTable[RHT_HC_GREAT_FAIRY_REWARD] = HintText::Exclude({ - //obscure text - Text{"the #fairy of fire# holds", /*french*/"la #fée du feu# a", /*spanish*/"el #hada del fuego# brinda"}, - }); - - hintTable[RHT_COLOSSUS_GREAT_FAIRY_REWARD] = HintText::Exclude({ - //obscure text - Text{"the #fairy of love# holds", /*french*/"la #fée de l'amour# a", /*spanish*/"el #hada del amor# brinda"}, - }); - - hintTable[RHT_DMT_GREAT_FAIRY_REWARD] = HintText::Exclude({ - //obscure text - Text{"a #magical fairy# gifts", /*french*/"la #fée de la magie# a", /*spanish*/"un #hada mágica# brinda"}, - }); - - hintTable[RHT_DMC_GREAT_FAIRY_REWARD] = HintText::Exclude({ - //obscure text - Text{"a #magical fairy# gifts", /*french*/"la #fée de la magie# a", /*spanish*/"un #hada mágica# brinda"}, - }); - - hintTable[RHT_OGC_GREAT_FAIRY_REWARD] = HintText::Exclude({ - //obscure text - Text{"the #fairy of strength# holds", /*french*/"la #fée de la force# a", /*spanish*/"el #hada de la fuerza# brinda"}, - }); - - - hintTable[RHT_SONG_FROM_IMPA] = HintText::Exclude({ - //obscure text - Text{"#deep in a castle#, Impa teaches", /*french*/"#la gardienne de la princesse# donne", /*spanish*/"en el #jardín del castillo Impa enseña#"}, - }); - - hintTable[RHT_SONG_FROM_MALON] = HintText::Exclude({ - //obscure text - Text{"#a farm girl# sings", /*french*/"la #fillette de la ferme# donne", /*spanish*/"una #chica rupestre# canta"}, - }); - - hintTable[RHT_SONG_FROM_SARIA] = HintText::Exclude({ - //obscure text - Text{"#deep in the forest#, Saria teaches", /*french*/"la #fille de la forêt# donne", /*spanish*/"al #fondo del bosque# Saria enseña"}, - }); - - hintTable[RHT_SONG_FROM_WINDMILL] = HintText::Exclude({ - //obscure text - Text{"a man #in a windmill# is obsessed with", /*french*/"l'#homme du moulin# donne", /*spanish*/"el #hombre del molino# está obsesionado con"}, - }); - - - hintTable[RHT_HC_MALON_EGG] = HintText::Exclude({ - //obscure text - Text{"a #girl looking for her father# gives", /*french*/"la #fillette qui cherche son père# donne", /*spanish*/"una #chica en busca de su padre# otorga"}, - }); - - hintTable[RHT_HC_ZELDAS_LETTER] = HintText::Exclude({ - //obscure text - Text{"a #princess in a castle# gifts", /*french*/"la #princesse dans le château# donne", /*spanish*/"la #princesa de un castillo# otorga"}, - }); - - hintTable[RHT_ZD_DIVING_MINIGAME] = HintText::Exclude({ - //obscure text - Text{"an #unsustainable business model# gifts", /*french*/"le #mauvais modèle d'affaires# donne", /*spanish*/"un #mal modelo de negocio# premia con"}, - }, {}, - //clear text - Text{"those who #dive for Zora rupees# will find", /*french*/"ceux qui #plongent pour des rubis Zora# trouveront", /*spanish*/"aquellos que se #sumergan por las rupias zora# encontrarán"} - ); - - hintTable[RHT_LH_CHILD_FISHING] = HintText::Exclude({ - //obscure text - Text{"#fishing in youth# bestows", /*french*/"#pêcher dans sa jeunesse# promet", /*spanish*/"#pescar en la juventud# conduce a"}, - }); - - // TODO: needs french + spanish translation - hintTable[RHT_LH_POND_FISH] = HintText::Exclude({ - //obscure text - Text{"#hitting the pond# reveals", /*french*/ "", /*spanish*/ ""}, - {}, - //clear text - Text{"#the fishing pond's bounty# includes", /*french*/ "", /*spanish*/ ""} - }); - - // TODO: needs french translation - hintTable[RHT_LH_HYRULE_LOACH] = HintText::Exclude( - { - // obscure text - Text{ "#fishing the legend# bestows", /*french*/ "!!!", /*spanish*/ "#pescar a la leyenda# conduce a" }, - }, - {}, - // clear text - Text{ "#fishing the hyrule loach# will give you", /*french*/ "!!!", - /*spanish*/ "si #pescas a la Locha de Hyrule# encontrarás" }); - - - hintTable[RHT_LH_ADULT_FISHING] = HintText::Exclude({ - //obscure text - Text{"#fishing in maturity# bestows", /*french*/"#pêcher dans sa maturité# promet", /*spanish*/"#pescar en la madurez# conduce a"}, - }); - - hintTable[RHT_LH_LAB_DIVE] = HintText::Exclude({ - //obscure text - Text{"a #diving experiment# is rewarded with", /*french*/"l'#expérience de plongée# donne", /*spanish*/"#bucear para un experimento# se premia con"}, - }); - - // TODO: needs translation - hintTable[RHT_ZD_FISH] = HintText::Exclude({ - // obscure text - Text{"a #fish by a waterfall# hoards", /*french*/"", /*spanish*/""} - }); - - hintTable[RHT_GC_ROLLING_GORON_AS_ADULT] = HintText::Exclude({ - //obscure text - Text{"#comforting yourself# provides", /*french*/"se #réconforter soi-même# donne", /*spanish*/"#confrontarte a ti mismo# otorga"}, - }, {}, - //clear text - Text{"#reassuring a young Goron# is rewarded with", /*french*/"#rassurer un jeune Goron# donne", /*spanish*/"#calmar a un joven Goron# otorga"} - ); - - hintTable[RHT_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE] = HintText::Exclude({ - //obscure text - Text{"the #first explosive prize# is", /*french*/"le #premier prix explosif# est", /*spanish*/"el #primer premio explosivo# se trata de"}, - }); - - hintTable[RHT_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE] = HintText::Exclude({ - //obscure text - Text{"the #second explosive prize# is", /*french*/"le #deuxième prix explosif# est", /*spanish*/"el #segundo premio explosivo# se trata de"}, - }); - - hintTable[RHT_MARKET_LOST_DOG] = HintText::Exclude({ - //obscure text - Text{"#puppy lovers# will find", /*french*/"les #amoureux canins# trouveront", /*spanish*/"los #amantes caninos# encontrarán"}, - }, {}, - //clear text - Text{"#rescuing Richard the Dog# is rewarded with", /*french*/"#retrouver Kiki le chien# promet", /*spanish*/"#rescatar al perrito Ricardo# conduce a"} - ); - - hintTable[RHT_LW_OCARINA_MEMORY_GAME] = HintText::Exclude({ - //obscure text - Text{"the prize for a #game of Simon Says# is", /*french*/"la #récompense de Jean Dit# est", /*spanish*/"#repetir ciertas melodías# otorga"}, - Text{"a #child sing-a-long# holds", /*french*/"les #jeunes flûtistes# donnent", /*spanish*/"#tocar junto a otros# otorga"}, - }, {}, - //clear text - Text{"#playing an Ocarina in Lost Woods# is rewarded with", /*french*/"#jouer l'ocarina dans les Bois Perdus# donne", /*spanish*/"#tocar la ocarina en el Bosque Perdido# otorga"} - ); - - hintTable[RHT_KAK_10_GOLD_SKULLTULA_REWARD] = HintText::Exclude({ - //obscure text - Text{"#10 bug badges# rewards", /*french*/"#10 écussons# donnent", /*spanish*/"#10 medallas de insectos# otorgan"}, - Text{"#10 spider souls# yields", /*french*/"#10 âmes# donnent", /*spanish*/"#10 almas de araña# otorgan"}, - Text{"#10 auriferous arachnids# lead to", /*french*/"#10 arachnides aurifères# donnent", /*spanish*/"#10 arácnidos auríferos# otorgan"}, - }, {}, - //clear text - Text{"slaying #10 Gold Skulltulas# reveals", /*french*/"détruire #10 Skulltulas d'or# donne", /*spanish*/"#exterminar 10 skulltulas doradas# revela"} - ); - - hintTable[RHT_KAK_MAN_ON_ROOF] = HintText::Exclude({ - //obscure text - Text{"a #rooftop wanderer# holds", /*french*/"une #rencontre sur un toit# donne", /*spanish*/"#alguien sobre un tejado# otorga"}, - }); - - hintTable[RHT_ZR_MAGIC_BEAN_SALESMAN] = HintText::Exclude({ - //obscure text - Text{"a seller of #colorful crops# has", /*french*/"le #marchand de légumes# vend", /*spanish*/"el vendedor de un #colorido cultivo# ofrece"}, - }, {}, - //clear text - Text{"a #bean seller# offers", /*french*/"le #marchand de haricots magiques# vend en fait", /*spanish*/"el #vendedor de judías# ofrece"} - ); - - hintTable[RHT_ZR_FROGS_IN_THE_RAIN] = HintText::Exclude({ - //obscure text - Text{"#frogs in a storm# gift", /*french*/"#des grenouilles mouillées# donnent", /*spanish*/"las #ancas bajo la tormenta# otorgan"}, - }); - hintTable[RHT_ZR_FROGS_ZELDAS_LULLABY] = HintText::Exclude( - { - // obscure text - Text{ "#sleepy frogs# gift", /*french*/ "#les grenouilles somnolentes# donnent", - /*spanish*/ "las #ranas somnolientas# regalan" }, - Text{ "#the Froggish Tenor in the back-left# gifts", - /*french*/ "#le ténor grenouillesque au fond à gauche# donne", - /*spanish*/ "el #Sapo Tenore al fondo, a la izquierda#, regala" }, - }, - {}, - // clear text - Text{ "after hearing #Zelda's Lullaby, the frogs# gift", - /*french*/ "à l'écoute de #la berceuse de Zelda, les grenouilles# donnent", - /*spanish*/ "después de escuchar #la Nana de Zelda, las ranas# regalan" }); - - hintTable[RHT_ZR_FROGS_EPONAS_SONG] = HintText::Exclude( - { - // obscure text - Text{ "#equine frogs# gift", /*french*/ "#les grenouilles équestres# donnent", - /*spanish*/ "las #ranas equinas# regalan" }, - Text{ "#the Froggish Tenor in the back-right# gifts", - /*french*/ "#le ténor grenouillesque au fond à droite# donne", - /*spanish*/ "el #Sapo Tenore al fondo, a la derecha#, regala" }, - }, - {}, - // clear text - Text{ "after hearing #Epona's Song, the frogs# gift", - /*french*/ "à l'écoute du #chant d'Epona, les grenouilles# donnent", - /*spanish*/ "después de escuchar #la Canción de Epona, las ranas# regalan" }); - - hintTable[RHT_ZR_FROGS_SARIAS_SONG] = HintText::Exclude( - { - // obscure text - Text{ "#sylvan frogs# gift", /*french*/ "#les grenouilles sylvestres# donnent", - /*spanish*/ "las #ranas silvestres# regalan" }, - Text{ "#the Froggish Tenor in the center# gifts", - /*french*/ "#le ténor grenouillesque dans le centre# donne", - /*spanish*/ "el #Sapo Tenore en el centro# regala" }, - }, - {}, - // clear text - Text{ "after hearing #Saria's Song, the frogs# gift", - /*french*/ "à l'écoute du #chant de Saria, les grenouilles# donnent", - /*spanish*/ "después de escuchar #la Canción de Saria, las ranas# regalan" }); - - hintTable[RHT_ZR_FROGS_SUNS_SONG] = HintText::Exclude( - { - // obscure text - Text{ "#enlightened frogs# gift", /*french*/ "#les grenouilles éclairées# donnent", - /*spanish*/ "las #ranas alumbradas# regalan" }, - Text{ "#the Froggish Tenor in the front-left# gifts", - /*french*/ "#le ténor grenouillesque à l'avant gauche# donne", - /*spanish*/ "el #Sapo Tenore al frente, a la izquierda#, regala" }, - }, - {}, - // clear text - Text{ "after hearing #the Sun's Song, the frogs# gift", - /*french*/ "à l'écoute du #chant du soleil, les grenouilles# donnent", - /*spanish*/ "después de escuchar #la Canción del Sol, las ranas# regalan" }); - - hintTable[RHT_ZR_FROGS_SONG_OF_TIME] = HintText::Exclude( - { - // obscure text - Text{ "#time-traveling frogs# gift", /*french*/ "#les grenouilles voyageuses dans le temps# donnent", - /*spanish*/ "las #ranas viajeras del tiempo# regalan" }, - Text{ "#the Froggish Tenor in the front-right# gifts", - /*french*/ "#le ténor grenouillesque à l'avant droite# donne", - /*spanish*/ "el #Sapo Tenore al frente, a la derecha#, regala" }, - }, - {}, - // clear text - Text{ "after hearing #the Song of Time, the frogs# gift", - /*french*/ "à l'écoute du #chant du temps, les grenouilles# donnent", - /*spanish*/ "después de escuchar #la Canción del tiempo, las ranas# regalan" }); - - hintTable[RHT_GF_HBA_1000_POINTS] = HintText::Exclude({ - //obscure text - Text{"scoring 1000 in #horseback archery# grants", /*french*/"obtenir 1000 points dans l'#archerie équestre# donne", /*spanish*/"conseguir 1000 puntos en el #tiro con arco a caballo# premia"}, - }); - - hintTable[RHT_MARKET_SHOOTING_GALLERY_REWARD] = HintText::Exclude({ - //obscure text - Text{"#shooting in youth# grants", /*french*/"#faire du tir dans sa jeunesse# donne", /*spanish*/"#disparar en la juventud# otorga"}, - }); - - hintTable[RHT_KAK_SHOOTING_GALLERY_REWARD] = HintText::Exclude({ - //obscure text - Text{"#shooting in maturity# grants", /*french*/"#faire du tir dans sa maturité# donne", /*spanish*/"#disparar en la madurez# otorga"}, - }); - - hintTable[RHT_LW_TARGET_IN_WOODS] = HintText::Exclude({ - //obscure text - Text{"shooting a #target in the woods# grants", /*french*/"#tirer une cible dans les bois# donne", /*spanish*/"disparar a un #blanco forestal# brinda"}, - }); - - hintTable[RHT_KAK_ANJU_AS_ADULT] = HintText::Exclude({ - //obscure text - Text{"a #chicken caretaker# offers adults", /*french*/"devenir un #éleveur de Cocottes# donne", /*spanish*/"una #cuidadora de emplumados# le ofrece a los mayores"}, - }); - - hintTable[RHT_LLR_TALONS_CHICKENS] = HintText::Exclude({ - //obscure text - Text{"#finding Super Cuccos# is rewarded with", /*french*/"#trouver des Super Cocottes# donne", /*spanish*/"#hallar los supercucos# conduce a"}, - }); - - hintTable[RHT_GC_ROLLING_GORON_AS_CHILD] = HintText::Exclude({ - //obscure text - Text{"the prize offered by a #large rolling Goron# is", /*french*/"la récompense d'un #gros Goron roulant# est", /*spanish*/"un #gran Goron rodante# otorga"}, - }); - - hintTable[RHT_LH_UNDERWATER_ITEM] = HintText::Exclude({ - //obscure text - Text{"the #sunken treasure in a lake# is", /*french*/"le #trésor au fond du lac# est", /*spanish*/"el #tesoro hundido del lago# se trata de"}, - }); - - hintTable[RHT_GF_GERUDO_MEMBERSHIP_CARD] = HintText::Exclude({ - //obscure text - Text{"#rescuing captured carpenters# is rewarded with", /*french*/"#secourir les charpentiers capturés# assure", /*spanish*/"#rescatar los apresados carpinteros# se premia con"}, - }); - - hintTable[RHT_WASTELAND_BOMBCHU_SALESMAN] = HintText::Exclude({ - //obscure text - Text{"a #carpet guru# sells", /*french*/"#un marchand du désert# vend", /*spanish*/"el #genio de una alfombra# vende"}, - }); - - hintTable[RHT_GC_MEDIGORON] = HintText::Exclude({ - //obscure text - Text{"#Medigoron# sells", /*french*/"#Medigoron# vend", /*spanish*/"#Medigoron# vende"}, - }); - - hintTable[RHT_KAK_GRANNYS_SHOP] = HintText::Exclude({ - // obscure text - Text{"the #potion shop lady# sells", /*french*/"la #dame du magasin de potion# vend", /*spanish*/"la #señora de la tienda de pociones# vende" }, - }); - - hintTable[RHT_KAK_IMPAS_HOUSE_FREESTANDING_POH] = HintText::Exclude({ - //obscure text - Text{"#imprisoned in a house# lies", /*french*/"#encagé dans une maison# gît", /*spanish*/"#en una casa entre rejas# yace"}, - }); - - hintTable[RHT_HF_TEKTITE_GROTTO_FREESTANDING_POH] = HintText::Exclude({ - //obscure text - Text{"#deep underwater in a hole# is", /*french*/"#dans les profondeurs d'une grotte# gît", /*spanish*/"#en lo hondo bajo un hoyo# yace"}, - }); - - hintTable[RHT_KAK_WINDMILL_FREESTANDING_POH] = HintText::Exclude({ - //obscure text - Text{"on a #windmill ledge# lies", /*french*/"#haut perché dans le moulin# gît", /*spanish*/"al #borde de un molino# yace"}, - }); - - hintTable[RHT_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH] = HintText::Exclude({ - //obscure text - Text{"#racing a ghost# leads to", /*french*/"le défi du #revenant rapide# donne", /*spanish*/"#perseguir a un fantasma# conduce a"}, - }, {}, - //clear text - Text{"#dead Dampe's second# prize is", /*french*/"la #deuxième course d'Igor# donne", /*spanish*/"el segundo premio de #la carrera de Dampé# se trata de"} - ); - - hintTable[RHT_LLR_FREESTANDING_POH] = HintText::Exclude({ - //obscure text - Text{"in a #ranch silo# lies", /*french*/"#dans l'entrepôt de la ferme# gît", /*spanish*/"en un #granero rupestre# yace"}, - }); - - hintTable[RHT_GRAVEYARD_FREESTANDING_POH] = HintText::Exclude({ - //obscure text - Text{"a #crate in a graveyard# hides", /*french*/"#la boîte dans le Cimetière# contient", /*spanish*/"bajo la #caja de un cementerio# yace"}, - }); - - hintTable[RHT_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR] = HintText::Exclude({ - //obscure text - Text{"a #gravekeeper digs up#", /*french*/"#le jeu du fossoyeur# cache", /*spanish*/"cierto #sepultero desentierra#"}, - }); - - hintTable[RHT_ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH] = HintText::Exclude({ - //obscure text - Text{"on top of a #pillar in a river# lies", /*french*/"#sur un pilier au dessus du fleuve# gît", /*spanish*/"en lo alto del #pilar de un río# yace"}, - }); - - hintTable[RHT_ZR_NEAR_DOMAIN_FREESTANDING_POH] = HintText::Exclude({ - //obscure text - Text{"on a #river ledge by a waterfall# lies", /*french*/"#sur la falaise au dessus du fleuve# gît", /*spanish*/"al borde de #la entrada a una cascada# yace"}, - }); - - hintTable[RHT_LH_FREESTANDING_POH] = HintText::Exclude({ - //obscure text - Text{"high on a #lab rooftop# one can find", /*french*/"#la tour d'observation du lac# cache", /*spanish*/"en lo #alto de un laboratorio# yace"}, - }); - - hintTable[RHT_ZF_ICEBERG_FREESTANDING_POH] = HintText::Exclude({ - //obscure text - Text{"#floating on ice# is", /*french*/"#gisant sur la glace# gît", /*spanish*/"#flotando sobre hielo# yace"}, - }); - - hintTable[RHT_GV_WATERFALL_FREESTANDING_POH] = HintText::Exclude({ - //obscure text - Text{"behind a #valley waterfall# is", /*french*/"#derrière la cascade du désert# se cache", /*spanish*/"tras una #desierta cascada# yace"}, - }); - - hintTable[RHT_GV_CRATE_FREESTANDING_POH] = HintText::Exclude({ - //obscure text - Text{"a #crate in a valley# hides", /*french*/"la #boîte dans la vallée# contient", /*spanish*/"bajo la #caja de un valle# yace"}, - }); - - hintTable[RHT_COLOSSUS_FREESTANDING_POH] = HintText::Exclude({ - //obscure text - Text{"on top of an #arch of stone# lies", /*french*/"#gisant sur une arche de pierre# gît", /*spanish*/"en lo alto de un #arco de piedra# yace"}, - }); - - hintTable[RHT_DMT_FREESTANDING_POH] = HintText::Exclude({ - //obscure text - Text{"above a #mountain cavern entrance# is", /*french*/"gisant #au dessus de la caverne montagneuse# gît", /*spanish*/"en lo alto de la #entrada de una cueva en la montaña# yace"}, - }); - - hintTable[RHT_DMC_WALL_FREESTANDING_POH] = HintText::Exclude({ - //obscure text - Text{"nestled in a #volcanic wall# is", /*french*/"dans une #alcove volcanique# gît", /*spanish*/"entre unas #murallas volcánicas# yace"}, - }); - - hintTable[RHT_DMC_VOLCANO_FREESTANDING_POH] = HintText::Exclude({ - //obscure text - Text{"obscured by #volcanic ash# is", /*french*/"#recouvert de cendres volcaniques# gît", /*spanish*/"bajo la #ceniza volcánica# yace"}, - }); - - hintTable[RHT_GF_NORTH_F1_CARPENTER] = HintText::Exclude({ - //obscure text - Text{"#defeating Gerudo guards# reveals", /*french*/"les #geôliers Gerudo# détiennent", /*spanish*/"#derrotar a las guardas Gerudo# revela"}, - }); - - hintTable[RHT_GF_NORTH_F2_CARPENTER] = HintText::Exclude({ - //obscure text - Text{"#defeating Gerudo guards# reveals", /*french*/"les #geôliers Gerudo# détiennent", /*spanish*/"#derrotar a las guardas Gerudo# revela"}, - }); - - hintTable[RHT_GF_SOUTH_F1_CARPENTER] = HintText::Exclude({ - //obscure text - Text{"#defeating Gerudo guards# reveals", /*french*/"les #geôliers Gerudo# détiennent", /*spanish*/"#derrotar a las guardas Gerudo# revela"}, - }); - - hintTable[RHT_GF_SOUTH_F2_CARPENTER] = HintText::Exclude({ - //obscure text - Text{"#defeating Gerudo guards# reveals", /*french*/"les #geôliers Gerudo# détiennent", /*spanish*/"#derrotar a las guardas Gerudo# revela"}, - }); - - - hintTable[RHT_HF_GS_NEAR_KAK_GROTTO] = HintText::Exclude({ - //obscure text - Text{"a #spider-guarded spider in a hole# hoards", /*french*/"une #Skulltula dans un trou d'arachnides# a", /*spanish*/"una #Skulltula custodiada por otra# de un hoyo otorga"}, - }); - - - hintTable[RHT_LLR_GS_BACK_WALL] = HintText::Exclude({ - //obscure text - Text{"night reveals a #spider in a ranch# holding", /*french*/"une #Skulltula sur la façade de la ferme# a", /*spanish*/"la noche revela una #Skulltula del rancho# que otorga"}, - }); - - hintTable[RHT_LLR_GS_RAIN_SHED] = HintText::Exclude({ - //obscure text - Text{"night reveals a #spider in a ranch# holding", /*french*/"une #Skulltula sur le mur de l'enclos# a", /*spanish*/"la noche revela una #Skulltula del rancho# que otorga"}, - }); - - hintTable[RHT_LLR_GS_HOUSE_WINDOW] = HintText::Exclude({ - //obscure text - Text{"night reveals a #spider in a ranch# holding", /*french*/"une #Skulltula sur la maison de ferme# a", /*spanish*/"la noche revela una #Skulltula del rancho# que otorga"}, - }); - - hintTable[RHT_LLR_GS_TREE] = HintText::Exclude({ - //obscure text - Text{"a spider hiding in a #ranch tree# holds", /*french*/"une #Skulltula dans l'arbre de la ferme# a", /*spanish*/"una Skulltula escondida en el #árbol de un rancho# otorga"}, - }); - - - hintTable[RHT_KF_GS_BEAN_PATCH] = HintText::Exclude({ - //obscure text - Text{"a #spider buried in a forest# holds", /*french*/"une #Skulltula enterrée dans la forêt# a", /*spanish*/"una #Skulltula enterrada en un bosque# otorga"}, - }); - - hintTable[RHT_KF_GS_KNOW_IT_ALL_HOUSE] = HintText::Exclude({ - //obscure text - Text{"night in the past reveals a #spider in a forest# holding", /*french*/"une #Skulltula derrière une cabane de la forêt# a", /*spanish*/"la noche revela en el pasado una #Skulltula del bosque# que otorga"}, - }); - - hintTable[RHT_KF_GS_HOUSE_OF_TWINS] = HintText::Exclude({ - //obscure text - Text{"night in the future reveals a #spider in a forest# holding", /*french*/"une #Skulltula sur une cabane de la forêt# a", /*spanish*/"la noche revela en el futuro una #Skulltula del rancho# que otorga"}, - }); - - - hintTable[RHT_LW_GS_BEAN_PATCH_NEAR_BRIDGE] = HintText::Exclude({ - //obscure text - Text{"a #spider buried deep in a forest maze# holds", /*french*/"une #Skulltula enterrée dans les bois# a", /*spanish*/"una #Skulltula enterrada en un laberinto forestal# otorga"}, - }); - - hintTable[RHT_LW_GS_BEAN_PATCH_NEAR_THEATER] = HintText::Exclude({ - //obscure text - Text{"a #spider buried deep in a forest maze# holds", /*french*/"une #Skulltula enterrée dans les bois# a", /*spanish*/"una #Skulltula enterrada en un laberinto forestal# otorga"}, - }); - - hintTable[RHT_LW_GS_ABOVE_THEATER] = HintText::Exclude({ - //obscure text - Text{"night reveals a #spider deep in a forest maze# holding", /*french*/"une #Skulltula haut perchée dans les bois# a", /*spanish*/"la noche revela una #Skulltula del laberinto forestal# que otorga"}, - }); - - hintTable[RHT_SFM_GS] = HintText::Exclude({ - //obscure text - Text{"night reveals a #spider in a forest meadow# holding", /*french*/"une #Skulltula dans le sanctuaire des bois# a", /*spanish*/"la noche revela una #Skulltula de la pradera del bosque# que otorga"}, - }); - - - hintTable[RHT_OGC_GS] = HintText::Exclude({ - //obscure text - Text{"a #spider outside a tyrant's tower# holds", /*french*/"une #Skulltula parmi les ruines du château# a", /*spanish*/"una #Skulltula a las afueras de la torre de un tirano# otorga"}, - }); - - hintTable[RHT_HC_GS_TREE] = HintText::Exclude({ - //obscure text - Text{"a spider hiding in a #tree outside of a castle# holds", /*french*/"une #Skulltula dans l'arbre près du château# a", /*spanish*/"una Skulltula escondida en el #árbol de las afueras de un castillo# otorga"}, - }); - - hintTable[RHT_MARKET_GS_GUARD_HOUSE] = HintText::Exclude({ - //obscure text - Text{"a #spider in a guarded crate# holds", /*french*/"une #Skulltula dans une boîte en ville# a", /*spanish*/"una #Skulltula bajo una custodiada caja# otorga"}, - }); - - - hintTable[RHT_DMC_GS_BEAN_PATCH] = HintText::Exclude({ - //obscure text - Text{"a #spider buried in a volcano# holds", /*french*/"une #Skulltula enterrée dans un volcan# a", /*spanish*/"una #Skulltula enterrada en un volcán# otorga"}, - }); - - - hintTable[RHT_DMT_GS_BEAN_PATCH] = HintText::Exclude({ - //obscure text - Text{"a #spider buried outside a cavern# holds", /*french*/"une #Skulltula enterrée près d'une caverne# a", /*spanish*/"una #Skulltula enterrada a la entrada de una cueva# otorga"}, - }); - - hintTable[RHT_DMT_GS_NEAR_KAK] = HintText::Exclude({ - //obscure text - Text{"a #spider hidden in a mountain nook# holds", /*french*/"une #Skulltula cachée dans le flanc d'une montagne# a", /*spanish*/"una #Skulltula oculta en el rincón de la montaña# otorga"}, - }); - - hintTable[RHT_DMT_GS_ABOVE_DODONGOS_CAVERN] = HintText::Exclude({ - //obscure text - Text{"the hammer reveals a #spider on a mountain# holding", /*french*/"une #Skulltula derrière un rocher massif près d'une caverne# a", /*spanish*/"el martillo revela #una Skulltula de la montaña# que otorga"}, - }); - - hintTable[RHT_DMT_GS_FALLING_ROCKS_PATH] = HintText::Exclude({ - //obscure text - Text{"the hammer reveals a #spider on a mountain# holding", /*french*/"une #Skulltula derrière un rocher massif près du sommet d'un volcan# a", /*spanish*/"el martillo revela #una Skulltula de la montaña# que otorga"}, - }); - - - hintTable[RHT_GC_GS_CENTER_PLATFORM] = HintText::Exclude({ - //obscure text - Text{"a #suspended spider# in Goron City holds", /*french*/"une #Skulltula perchée dans le village Goron# a", /*spanish*/"una #Skulltula suspendida# en la Ciudad Goron otorga"}, - }); - - hintTable[RHT_GC_GS_BOULDER_MAZE] = HintText::Exclude({ - //obscure text - Text{"a spider in a #Goron City crate# holds", /*french*/"une #Skulltula dans une boîte du village Goron# a", /*spanish*/"una #Skulltula bajo una caja# de la Ciudad Goron otorga"}, - }); - - - hintTable[RHT_KAK_GS_HOUSE_UNDER_CONSTRUCTION] = HintText::Exclude({ - //obscure text - Text{"night in the past reveals a #spider in a town# holding", /*french*/"une #Skulltula dans le chantier de construction# a", /*spanish*/"la noche del pasado revela una #Skulltula del pueblo# que otorga"}, - }); - - hintTable[RHT_KAK_GS_SKULLTULA_HOUSE] = HintText::Exclude({ - //obscure text - Text{"night in the past reveals a #spider in a town# holding", /*french*/"une #Skulltula sur une maison maudite# a", /*spanish*/"la noche del pasado revela una #Skulltula del pueblo# que otorga"}, - }); - - hintTable[RHT_KAK_GS_GUARDS_HOUSE] = HintText::Exclude({ - //obscure text - Text{"night in the past reveals a #spider in a town# holding", /*french*/"une #Skulltula sur une maison de village# a", /*spanish*/"la noche del pasado revela una #Skulltula del pueblo# que otorga"}, - }); - - hintTable[RHT_KAK_GS_TREE] = HintText::Exclude({ - //obscure text - Text{"night in the past reveals a #spider in a town# holding", /*french*/"une #Skulltula dans un arbre de village# a", /*spanish*/"la noche del pasado revela una #Skulltula del pueblo# que otorga"}, - }); - - hintTable[RHT_KAK_GS_WATCHTOWER] = HintText::Exclude({ - //obscure text - Text{"night in the past reveals a #spider in a town# holding", /*french*/"une #Skulltula sur une échelle dans un village# a", /*spanish*/"la noche del pasado revela una #Skulltula del pueblo# que otorga"}, - }); - - hintTable[RHT_KAK_GS_ABOVE_IMPAS_HOUSE] = HintText::Exclude({ - //obscure text - Text{"night in the future reveals a #spider in a town# holding", /*french*/"une #Skulltula au dessus d'une grande maison# a", /*spanish*/"la noche del futuro revela una #Skulltula del pueblo# que otorga"}, - }); - - - hintTable[RHT_GRAVEYARD_GS_WALL] = HintText::Exclude({ - //obscure text - Text{"night reveals a #spider in a graveyard# holding", /*french*/"une #Skulltula sur une façade du Cimetière# a", /*spanish*/"la noche revela una #Skulltula del cementerio# que otorga"}, - }); - - hintTable[RHT_GRAVEYARD_GS_BEAN_PATCH] = HintText::Exclude({ - //obscure text - Text{"a #spider buried in a graveyard# holds", /*french*/"une #Skulltula enterrée dans le Cimetière# a", /*spanish*/"una #Skulltula enterrada en el cementerio# otorga"}, - }); - - - hintTable[RHT_ZR_GS_LADDER] = HintText::Exclude({ - //obscure text - Text{"night in the past reveals a #spider in a river# holding", /*french*/"une #Skulltula sur une échelle près d'une cascade# a", /*spanish*/"la noche del pasado revela una #Skulltula del río# que otorga"}, - }); - - hintTable[RHT_ZR_GS_TREE] = HintText::Exclude({ - //obscure text - Text{"a spider hiding in a #tree by a river# holds", /*french*/"une #Skulltula dans un arbre près du fleuve# a", /*spanish*/"una Skulltula escondida en el #árbol de un río# otorga"}, - }); - - hintTable[RHT_ZR_GS_ABOVE_BRIDGE] = HintText::Exclude({ - //obscure text - Text{"night in the future reveals a #spider in a river# holding", /*french*/"une #Skulltula sur une façade près d'une cascade# a", /*spanish*/"la noche del futuro revela una #Skulltula del río# que otorga"}, - }); - - hintTable[RHT_ZR_GS_NEAR_RAISED_GROTTOS] = HintText::Exclude({ - //obscure text - Text{"night in the future reveals a #spider in a river# holding", /*french*/"une #Skulltula sur une façade près d'une grotte du fleuve# a", /*spanish*/"la noche del futuro revela una #Skulltula del río# que otorga"}, - }); - - - hintTable[RHT_ZD_GS_FROZEN_WATERFALL] = HintText::Exclude({ - //obscure text - Text{"night reveals a #spider by a frozen waterfall# holding", /*french*/"une #Skulltula près d'une cascade gelée# a", /*spanish*/"la noche revela una #Skulltula junto a una congelada cascada# que otorga"}, - }); - - hintTable[RHT_ZF_GS_ABOVE_THE_LOG] = HintText::Exclude({ - //obscure text - Text{"night reveals a #spider near a deity# holding", /*french*/"une #Skulltula près du gardien aquatique# a", /*spanish*/"la noche revela una #Skulltula junto a cierta deidad# que otorga"}, - }); - - hintTable[RHT_ZF_GS_TREE] = HintText::Exclude({ - //obscure text - Text{"a spider hiding in a #tree near a deity# holds", /*french*/"une #Skulltula dans un arbre dans un réservoir# a", /*spanish*/"una Skulltula escondida en el #árbol junto a cierta deidad# otorga"}, - }); - - - hintTable[RHT_LH_GS_BEAN_PATCH] = HintText::Exclude({ - //obscure text - Text{"a #spider buried by a lake# holds", /*french*/"une #Skulltula enterrée près d'un lac# a", /*spanish*/"una #Skulltula enterrada junto a un lago# otorga"}, - }); - - hintTable[RHT_LH_GS_SMALL_ISLAND] = HintText::Exclude({ - //obscure text - Text{"night reveals a #spider by a lake# holding", /*french*/"une #Skulltula sur un îlot du lac# a", /*spanish*/"la noche revela una #Skulltula junto a un lago# que otorga"}, - }); - - hintTable[RHT_LH_GS_LAB_WALL] = HintText::Exclude({ - //obscure text - Text{"night reveals a #spider by a lake# holding", /*french*/"une #Skulltula sur le mur d'un centre de recherche# a", /*spanish*/"la noche revela una #Skulltula junto a un lago# que otorga"}, - }); - - hintTable[RHT_LH_GS_LAB_CRATE] = HintText::Exclude({ - //obscure text - Text{"a spider deed underwater in a #lab crate# holds", /*french*/"une #Skulltula dans une boîte au fond d'une cuve d'eau# a", /*spanish*/"una #Skulltula bajo la sumergida caja de un laboratorio# otorga"}, - }); - - hintTable[RHT_LH_GS_TREE] = HintText::Exclude({ - //obscure text - Text{"night reveals a #spider by a lake high in a tree# holding", /*french*/"une #Skulltula dans un grand arbre du lac# a", /*spanish*/"la noche revela #una Skulltula del lago sobre un árbol# que otorga"}, - }); - - - hintTable[RHT_GV_GS_BEAN_PATCH] = HintText::Exclude({ - //obscure text - Text{"a #spider buried in a valley# holds", /*french*/"une #Skulltula enterré dans une vallée# a", /*spanish*/"una #Skulltula enterrada en un valle# otorga"}, - }); - - hintTable[RHT_GV_GS_SMALL_BRIDGE] = HintText::Exclude({ - //obscure text - Text{"night in the past reveals a #spider in a valley# holding", /*french*/"une #Skulltula au dessus d'une petite cascade# a", /*spanish*/"la noche del pasado revela una #Skulltula del valle# que otorga"}, - }); - - hintTable[RHT_GV_GS_PILLAR] = HintText::Exclude({ - //obscure text - Text{"night in the future reveals a #spider in a valley# holding", /*french*/"une #Skulltula sur une arche de pierre dans une vallée# a", /*spanish*/"la noche del futuro revela una #Skulltula del valle# que otorga"}, - }); - - hintTable[RHT_GV_GS_BEHIND_TENT] = HintText::Exclude({ - //obscure text - Text{"night in the future reveals a #spider in a valley# holding", /*french*/"une #Skulltula derrière une tente# a", /*spanish*/"la noche del futuro revela una #Skulltula del valle# que otorga"}, - }); - - - hintTable[RHT_GF_GS_ARCHERY_RANGE] = HintText::Exclude({ - //obscure text - Text{"night reveals a #spider in a fortress# holding", /*french*/"une #Skulltula sur une cible de tir# a", /*spanish*/"la noche revela una #Skulltula de una fortaleza# que otorga"}, - }); - - hintTable[RHT_GF_GS_TOP_FLOOR] = HintText::Exclude({ - //obscure text - Text{"night reveals a #spider in a fortress# holding", /*french*/"une #Skulltula au sommet d'une forteresse# a", /*spanish*/"la noche revela una #Skulltula de una fortaleza# que otorga"}, - }); - - - hintTable[RHT_COLOSSUS_GS_BEAN_PATCH] = HintText::Exclude({ - //obscure text - Text{"a #spider buried in the desert# holds", /*french*/"une #Skulltula enterrée au pied du colosse# a", /*spanish*/"una #Skulltula enterrada en el desierto# otorga"}, - }); - - hintTable[RHT_COLOSSUS_GS_HILL] = HintText::Exclude({ - //obscure text - Text{"night reveals a #spider deep in the desert# holding", /*french*/"une #Skulltula sur une colline dans le désert# a", /*spanish*/"la noche revela una #Skulltula en las profundidades del desierto# que otorga"}, - }); - - hintTable[RHT_COLOSSUS_GS_TREE] = HintText::Exclude({ - //obscure text - Text{"night reveals a #spider deep in the desert# holding", /*french*/"une #Skulltula dans un arbre du désert# a", /*spanish*/"la noche revela una #Skulltula en las profundidades del desierto# que otorga"}, - }); - - - hintTable[RHT_KF_SHOP_ITEM_1] = HintText::Exclude({ - //obscure text - Text{"a #child shopkeeper# sells", /*french*/"la #boutique Kokiri# vend", /*spanish*/"un #joven dependiente# vende"}, - }); - - hintTable[RHT_KF_SHOP_ITEM_2] = HintText::Exclude({ - //obscure text - Text{"a #child shopkeeper# sells", /*french*/"la #boutique Kokiri# vend", /*spanish*/"un #joven dependiente# vende"}, - }); - - hintTable[RHT_KF_SHOP_ITEM_3] = HintText::Exclude({ - //obscure text - Text{"a #child shopkeeper# sells", /*french*/"la #boutique Kokiri# vend", /*spanish*/"un #joven dependiente# vende"}, - }); - - hintTable[RHT_KF_SHOP_ITEM_4] = HintText::Exclude({ - //obscure text - Text{"a #child shopkeeper# sells", /*french*/"la #boutique Kokiri# vend", /*spanish*/"un #joven dependiente# vende"}, - }); - - hintTable[RHT_KF_SHOP_ITEM_5] = HintText::Exclude({ - //obscure text - Text{"a #child shopkeeper# sells", /*french*/"la #boutique Kokiri# vend", /*spanish*/"un #joven dependiente# vende"}, - }); - - hintTable[RHT_KF_SHOP_ITEM_6] = HintText::Exclude({ - //obscure text - Text{"a #child shopkeeper# sells", /*french*/"la #boutique Kokiri# vend", /*spanish*/"un #joven dependiente# vende"}, - }); - - hintTable[RHT_KF_SHOP_ITEM_7] = HintText::Exclude({ - //obscure text - Text{"a #child shopkeeper# sells", /*french*/"la #boutique Kokiri# vend", /*spanish*/"un #joven dependiente# vende"}, - }); - - hintTable[RHT_KF_SHOP_ITEM_8] = HintText::Exclude({ - //obscure text - Text{"a #child shopkeeper# sells", /*french*/"la #boutique Kokiri# vend", /*spanish*/"un #joven dependiente# vende"}, - }); - - - hintTable[RHT_KAK_POTION_SHOP_ITEM_1] = HintText::Exclude({ - //obscure text - Text{"a #potion seller# offers", /*french*/"l'#apothicaire# vend", /*spanish*/"un #vendedor de pociones# ofrece"}, - }, {}, - //clear text - Text{"the #Kakariko Potion Shop# offers", /*french*/"l'#apothicaire de Kakariko# vend", /*spanish*/"la #tienda de pociones de Kakariko# ofrece"} - ); - - hintTable[RHT_KAK_POTION_SHOP_ITEM_2] = HintText::Exclude({ - //obscure text - Text{"a #potion seller# offers", /*french*/"l'#apothicaire# vend", /*spanish*/"un #vendedor de pociones# ofrece"}, - }, {}, - //clear text - Text{"the #Kakariko Potion Shop# offers", /*french*/"l'#apothicaire de Kakariko# vend", /*spanish*/"la #tienda de pociones de Kakariko# ofrece"} - ); - - hintTable[RHT_KAK_POTION_SHOP_ITEM_3] = HintText::Exclude({ - //obscure text - Text{"a #potion seller# offers", /*french*/"l'#apothicaire# vend", /*spanish*/"un #vendedor de pociones# ofrece"}, - }, {}, - //clear text - Text{"the #Kakariko Potion Shop# offers", /*french*/"l'#apothicaire de Kakariko# vend", /*spanish*/"la #tienda de pociones de Kakariko# ofrece"} - ); - - hintTable[RHT_KAK_POTION_SHOP_ITEM_4] = HintText::Exclude({ - //obscure text - Text{"a #potion seller# offers", /*french*/"l'#apothicaire# vend", /*spanish*/"un #vendedor de pociones# ofrece"}, - }, {}, - //clear text - Text{"the #Kakariko Potion Shop# offers", /*french*/"l'#apothicaire de Kakariko# vend", /*spanish*/"la #tienda de pociones de Kakariko# ofrece"} - ); - - hintTable[RHT_KAK_POTION_SHOP_ITEM_5] = HintText::Exclude({ - //obscure text - Text{"a #potion seller# offers", /*french*/"l'#apothicaire# vend", /*spanish*/"un #vendedor de pociones# ofrece"}, - }, {}, - //clear text - Text{"the #Kakariko Potion Shop# offers", /*french*/"l'#apothicaire de Kakariko# vend", /*spanish*/"la #tienda de pociones de Kakariko# ofrece"} - ); - - hintTable[RHT_KAK_POTION_SHOP_ITEM_6] = HintText::Exclude({ - //obscure text - Text{"a #potion seller# offers", /*french*/"l'#apothicaire# vend", /*spanish*/"un #vendedor de pociones# ofrece"}, - }, {}, - //clear text - Text{"the #Kakariko Potion Shop# offers", /*french*/"l'#apothicaire de Kakariko# vend", /*spanish*/"la #tienda de pociones de Kakariko# ofrece"} - ); - - hintTable[RHT_KAK_POTION_SHOP_ITEM_7] = HintText::Exclude({ - //obscure text - Text{"a #potion seller# offers", /*french*/"l'#apothicaire# vend", /*spanish*/"un #vendedor de pociones# ofrece"}, - }, {}, - //clear text - Text{"the #Kakariko Potion Shop# offers", /*french*/"l'#apothicaire de Kakariko# vend", /*spanish*/"la #tienda de pociones de Kakariko# ofrece"} - ); - - hintTable[RHT_KAK_POTION_SHOP_ITEM_8] = HintText::Exclude({ - //obscure text - Text{"a #potion seller# offers", /*french*/"l'#apothicaire# vend", /*spanish*/"un #vendedor de pociones# ofrece"}, - }, {}, - //clear text - Text{"the #Kakariko Potion Shop# offers", /*french*/"l'#apothicaire de Kakariko# vend", /*spanish*/"la #tienda de pociones de Kakariko# ofrece"} - ); - - - hintTable[RHT_MARKET_BOMBCHU_SHOP_ITEM_1] = HintText::Exclude({ - //obscure text - Text{"a #Bombchu merchant# sells", /*french*/"le #marchand de Missiles# vend", /*spanish*/"un #mercader de bombchus# vende"}, - }); - - hintTable[RHT_MARKET_BOMBCHU_SHOP_ITEM_2] = HintText::Exclude({ - //obscure text - Text{"a #Bombchu merchant# sells", /*french*/"le #marchand de Missiles# vend", /*spanish*/"un #mercader de bombchus# vende"}, - }); - - hintTable[RHT_MARKET_BOMBCHU_SHOP_ITEM_3] = HintText::Exclude({ - //obscure text - Text{"a #Bombchu merchant# sells", /*french*/"le #marchand de Missiles# vend", /*spanish*/"un #mercader de bombchus# vende"}, - }); - - hintTable[RHT_MARKET_BOMBCHU_SHOP_ITEM_4] = HintText::Exclude({ - //obscure text - Text{"a #Bombchu merchant# sells", /*french*/"le #marchand de Missiles# vend", /*spanish*/"un #mercader de bombchus# vende"}, - }); - - hintTable[RHT_MARKET_BOMBCHU_SHOP_ITEM_5] = HintText::Exclude({ - //obscure text - Text{"a #Bombchu merchant# sells", /*french*/"le #marchand de Missiles# vend", /*spanish*/"un #mercader de bombchus# vende"}, - }); - - hintTable[RHT_MARKET_BOMBCHU_SHOP_ITEM_6] = HintText::Exclude({ - //obscure text - Text{"a #Bombchu merchant# sells", /*french*/"le #marchand de Missiles# vend", /*spanish*/"un #mercader de bombchus# vende"}, - }); - - hintTable[RHT_MARKET_BOMBCHU_SHOP_ITEM_7] = HintText::Exclude({ - //obscure text - Text{"a #Bombchu merchant# sells", /*french*/"le #marchand de Missiles# vend", /*spanish*/"un #mercader de bombchus# vende"}, - }); - - hintTable[RHT_MARKET_BOMBCHU_SHOP_ITEM_8] = HintText::Exclude({ - //obscure text - Text{"a #Bombchu merchant# sells", /*french*/"le #marchand de Missiles# vend", /*spanish*/"un #mercader de bombchus# vende"}, - }); - - - hintTable[RHT_MARKET_POTION_SHOP_ITEM_1] = HintText::Exclude({ - //obscure text - Text{"a #potion seller# offers", /*french*/"l'#apothicaire# vend", /*spanish*/"un #vendedor de pociones# ofrece"}, - }, {}, - //clear text - Text{"the #Market Potion Shop# offers", /*french*/"l'#apothicaire dans la Place du Marché# vend", /*spanish*/"la #tienda de pociones del mercado# ofrece"} - ); - - hintTable[RHT_MARKET_POTION_SHOP_ITEM_2] = HintText::Exclude({ - //obscure text - Text{"a #potion seller# offers", /*french*/"l'#apothicaire# vend", /*spanish*/"un #vendedor de pociones# ofrece"}, - }, {}, - //clear text - Text{"the #Market Potion Shop# offers", /*french*/"l'#apothicaire dans la Place du Marché# vend", /*spanish*/"la #tienda de pociones del mercado# ofrece"} - ); - - hintTable[RHT_MARKET_POTION_SHOP_ITEM_3] = HintText::Exclude({ - //obscure text - Text{"a #potion seller# offers", /*french*/"l'#apothicaire# vend", /*spanish*/"un #vendedor de pociones# ofrece"}, - }, {}, - //clear text - Text{"the #Market Potion Shop# offers", /*french*/"l'#apothicaire dans la Place du Marché# vend", /*spanish*/"la #tienda de pociones del mercado# ofrece"} - ); - - hintTable[RHT_MARKET_POTION_SHOP_ITEM_4] = HintText::Exclude({ - //obscure text - Text{"a #potion seller# offers", /*french*/"l'#apothicaire# vend", /*spanish*/"un #vendedor de pociones# ofrece"}, - }, {}, - //clear text - Text{"the #Market Potion Shop# offers", /*french*/"l'#apothicaire dans la Place du Marché# vend", /*spanish*/"la #tienda de pociones del mercado# ofrece"} - ); - - hintTable[RHT_MARKET_POTION_SHOP_ITEM_5] = HintText::Exclude({ - //obscure text - Text{"a #potion seller# offers", /*french*/"l'#apothicaire# vend", /*spanish*/"un #vendedor de pociones# ofrece"}, - }, {}, - //clear text - Text{"the #Market Potion Shop# offers", /*french*/"l'#apothicaire dans la Place du Marché# vend", /*spanish*/"la #tienda de pociones del mercado# ofrece"} - ); - - hintTable[RHT_MARKET_POTION_SHOP_ITEM_6] = HintText::Exclude({ - //obscure text - Text{"a #potion seller# offers", /*french*/"l'#apothicaire# vend", /*spanish*/"un #vendedor de pociones# ofrece"}, - }, {}, - //clear text - Text{"the #Market Potion Shop# offers", /*french*/"l'#apothicaire dans la Place du Marché# vend", /*spanish*/"la #tienda de pociones del mercado# ofrece"} - ); - - hintTable[RHT_MARKET_POTION_SHOP_ITEM_7] = HintText::Exclude({ - //obscure text - Text{"a #potion seller# offers", /*french*/"l'#apothicaire# vend", /*spanish*/"un #vendedor de pociones# ofrece"}, - }, {}, - //clear text - Text{"the #Market Potion Shop# offers", /*french*/"l'#apothicaire dans la Place du Marché# vend", /*spanish*/"la #tienda de pociones del mercado# ofrece"} - ); - - hintTable[RHT_MARKET_POTION_SHOP_ITEM_8] = HintText::Exclude({ - //obscure text - Text{"a #potion seller# offers", /*french*/"l'#apothicaire# vend", /*spanish*/"un #vendedor de pociones# ofrece"}, - }, {}, - //clear text - Text{"the #Market Potion Shop# offers", /*french*/"l'#apothicaire dans la Place du Marché# vend", /*spanish*/"la #tienda de pociones del mercado# ofrece"} - ); - - - hintTable[RHT_MARKET_BAZAAR_ITEM_1] = HintText::Exclude({ - //obscure text - Text{"the #Market Bazaar# offers", /*french*/"le #bazar de la Place du Marché# vend", /*spanish*/"el #bazar del mercado# ofrece"}, - }); - - hintTable[RHT_MARKET_BAZAAR_ITEM_2] = HintText::Exclude({ - //obscure text - Text{"the #Market Bazaar# offers", /*french*/"le #bazar de la Place du Marché# vend", /*spanish*/"el #bazar del mercado# ofrece"}, - }); - - hintTable[RHT_MARKET_BAZAAR_ITEM_3] = HintText::Exclude({ - //obscure text - Text{"the #Market Bazaar# offers", /*french*/"le #bazar de la Place du Marché# vend", /*spanish*/"el #bazar del mercado# ofrece"}, - }); - - hintTable[RHT_MARKET_BAZAAR_ITEM_4] = HintText::Exclude({ - //obscure text - Text{"the #Market Bazaar# offers", /*french*/"le #bazar de la Place du Marché# vend", /*spanish*/"el #bazar del mercado# ofrece"}, - }); - - hintTable[RHT_MARKET_BAZAAR_ITEM_5] = HintText::Exclude({ - //obscure text - Text{"the #Market Bazaar# offers", /*french*/"le #bazar de la Place du Marché# vend", /*spanish*/"el #bazar del mercado# ofrece"}, - }); - - hintTable[RHT_MARKET_BAZAAR_ITEM_6] = HintText::Exclude({ - //obscure text - Text{"the #Market Bazaar# offers", /*french*/"le #bazar de la Place du Marché# vend", /*spanish*/"el #bazar del mercado# ofrece"}, - }); - - hintTable[RHT_MARKET_BAZAAR_ITEM_7] = HintText::Exclude({ - //obscure text - Text{"the #Market Bazaar# offers", /*french*/"le #bazar de la Place du Marché# vend", /*spanish*/"el #bazar del mercado# ofrece"}, - }); - - hintTable[RHT_MARKET_BAZAAR_ITEM_8] = HintText::Exclude({ - //obscure text - Text{"the #Market Bazaar# offers", /*french*/"le #bazar de la Place du Marché# vend", /*spanish*/"el #bazar del mercado# ofrece"}, - }); - - - hintTable[RHT_KAK_BAZAAR_ITEM_1] = HintText::Exclude({ - //obscure text - Text{"the #Kakariko Bazaar# offers", /*french*/"le #bazar de Kakariko# vend", /*spanish*/"el #bazar de Kakariko# ofrece"}, - }); - - hintTable[RHT_KAK_BAZAAR_ITEM_2] = HintText::Exclude({ - //obscure text - Text{"the #Kakariko Bazaar# offers", /*french*/"le #bazar de Kakariko# vend", /*spanish*/"el #bazar de Kakariko# ofrece"}, - }); - - hintTable[RHT_KAK_BAZAAR_ITEM_3] = HintText::Exclude({ - //obscure text - Text{"the #Kakariko Bazaar# offers", /*french*/"le #bazar de Kakariko# vend", /*spanish*/"el #bazar de Kakariko# ofrece"}, - }); - - hintTable[RHT_KAK_BAZAAR_ITEM_4] = HintText::Exclude({ - //obscure text - Text{"the #Kakariko Bazaar# offers", /*french*/"le #bazar de Kakariko# vend", /*spanish*/"el #bazar de Kakariko# ofrece"}, - }); - - hintTable[RHT_KAK_BAZAAR_ITEM_5] = HintText::Exclude({ - //obscure text - Text{"the #Kakariko Bazaar# offers", /*french*/"le #bazar de Kakariko# vend", /*spanish*/"el #bazar de Kakariko# ofrece"}, - }); - - hintTable[RHT_KAK_BAZAAR_ITEM_6] = HintText::Exclude({ - //obscure text - Text{"the #Kakariko Bazaar# offers", /*french*/"le #bazar de Kakariko# vend", /*spanish*/"el #bazar de Kakariko# ofrece"}, - }); - - hintTable[RHT_KAK_BAZAAR_ITEM_7] = HintText::Exclude({ - //obscure text - Text{"the #Kakariko Bazaar# offers", /*french*/"le #bazar de Kakariko# vend", /*spanish*/"el #bazar de Kakariko# ofrece"}, - }); - - hintTable[RHT_KAK_BAZAAR_ITEM_8] = HintText::Exclude({ - //obscure text - Text{"the #Kakariko Bazaar# offers", /*french*/"le #bazar de Kakariko# vend", /*spanish*/"el #bazar de Kakariko# ofrece"}, - }); - - - hintTable[RHT_ZD_SHOP_ITEM_1] = HintText::Exclude({ - //obscure text - Text{"a #Zora shopkeeper# sells", /*french*/"la #boutique Zora# vend", /*spanish*/"el #dependiente Zora# vende"}, - }); - - hintTable[RHT_ZD_SHOP_ITEM_2] = HintText::Exclude({ - //obscure text - Text{"a #Zora shopkeeper# sells", /*french*/"la #boutique Zora# vend", /*spanish*/"el #dependiente Zora# vende"}, - }); - - hintTable[RHT_ZD_SHOP_ITEM_3] = HintText::Exclude({ - //obscure text - Text{"a #Zora shopkeeper# sells", /*french*/"la #boutique Zora# vend", /*spanish*/"el #dependiente Zora# vende"}, - }); - - hintTable[RHT_ZD_SHOP_ITEM_4] = HintText::Exclude({ - //obscure text - Text{"a #Zora shopkeeper# sells", /*french*/"la #boutique Zora# vend", /*spanish*/"el #dependiente Zora# vende"}, - }); - - hintTable[RHT_ZD_SHOP_ITEM_5] = HintText::Exclude({ - //obscure text - Text{"a #Zora shopkeeper# sells", /*french*/"la #boutique Zora# vend", /*spanish*/"el #dependiente Zora# vende"}, - }); - - hintTable[RHT_ZD_SHOP_ITEM_6] = HintText::Exclude({ - //obscure text - Text{"a #Zora shopkeeper# sells", /*french*/"la #boutique Zora# vend", /*spanish*/"el #dependiente Zora# vende"}, - }); - - hintTable[RHT_ZD_SHOP_ITEM_7] = HintText::Exclude({ - //obscure text - Text{"a #Zora shopkeeper# sells", /*french*/"la #boutique Zora# vend", /*spanish*/"el #dependiente Zora# vende"}, - }); - - hintTable[RHT_ZD_SHOP_ITEM_8] = HintText::Exclude({ - //obscure text - Text{"a #Zora shopkeeper# sells", /*french*/"la #boutique Zora# vend", /*spanish*/"el #dependiente Zora# vende"}, - }); - - - hintTable[RHT_GC_SHOP_ITEM_1] = HintText::Exclude({ - //obscure text - Text{"a #Goron shopkeeper# sells", /*french*/"la #boutique Goron# vend", /*spanish*/"el #dependiente Goron# vende"}, - }); - - hintTable[RHT_GC_SHOP_ITEM_2] = HintText::Exclude({ - //obscure text - Text{"a #Goron shopkeeper# sells", /*french*/"la #boutique Goron# vend", /*spanish*/"el #dependiente Goron# vende"}, - }); - - hintTable[RHT_GC_SHOP_ITEM_3] = HintText::Exclude({ - //obscure text - Text{"a #Goron shopkeeper# sells", /*french*/"la #boutique Goron# vend", /*spanish*/"el #dependiente Goron# vende"}, - }); - - hintTable[RHT_GC_SHOP_ITEM_4] = HintText::Exclude({ - //obscure text - Text{"a #Goron shopkeeper# sells", /*french*/"la #boutique Goron# vend", /*spanish*/"el #dependiente Goron# vende"}, - }); - - hintTable[RHT_GC_SHOP_ITEM_5] = HintText::Exclude({ - //obscure text - Text{"a #Goron shopkeeper# sells", /*french*/"la #boutique Goron# vend", /*spanish*/"el #dependiente Goron# vende"}, - }); - - hintTable[RHT_GC_SHOP_ITEM_6] = HintText::Exclude({ - //obscure text - Text{"a #Goron shopkeeper# sells", /*french*/"la #boutique Goron# vend", /*spanish*/"el #dependiente Goron# vende"}, - }); - - hintTable[RHT_GC_SHOP_ITEM_7] = HintText::Exclude({ - //obscure text - Text{"a #Goron shopkeeper# sells", /*french*/"la #boutique Goron# vend", /*spanish*/"el #dependiente Goron# vende"}, - }); - - hintTable[RHT_GC_SHOP_ITEM_8] = HintText::Exclude({ - //obscure text - Text{"a #Goron shopkeeper# sells", /*french*/"la #boutique Goron# vend", /*spanish*/"el #dependiente Goron# vende"}, - }); - - - hintTable[RHT_HF_DEKU_SCRUB_GROTTO] = HintText::Exclude({ - //obscure text - Text{"a lonely #scrub in a hole# sells", /*french*/"la #peste Mojo dans une grotte de la plaine# vend", /*spanish*/"un #singular deku bajo un hoyo# de la llanura vende"}, - }); - - hintTable[RHT_LLR_DEKU_SCRUB_GROTTO_LEFT] = HintText::Exclude({ - //obscure text - Text{"a #trio of scrubs# sells", /*french*/"le #trio de peste Mojo à la ferme# vend", /*spanish*/"un #trío de dekus# de una granja venden"}, - }); - - hintTable[RHT_LLR_DEKU_SCRUB_GROTTO_RIGHT] = HintText::Exclude({ - //obscure text - Text{"a #trio of scrubs# sells", /*french*/"le #trio de peste Mojo à la ferme# vend", /*spanish*/"un #trío de dekus# de una granja venden"}, - }); - - hintTable[RHT_LLR_DEKU_SCRUB_GROTTO_CENTER] = HintText::Exclude({ - //obscure text - Text{"a #trio of scrubs# sells", /*french*/"le #trio de peste Mojo à la ferme# vend", /*spanish*/"un #trío de dekus# de una granja venden"}, - }); - - - hintTable[RHT_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT] = HintText::Exclude({ - //obscure text - Text{"a pair of #scrubs in the woods# sells", /*french*/"le #duo de peste Mojo près du théâtre# vend", /*spanish*/"un par de #dekus del bosque# venden"}, - }); - - hintTable[RHT_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT] = HintText::Exclude({ - //obscure text - Text{"a pair of #scrubs in the woods# sells", /*french*/"le #duo de peste Mojo près du théâtre# vend", /*spanish*/"un par de #dekus del bosque# venden"}, - }); - - hintTable[RHT_LW_DEKU_SCRUB_NEAR_BRIDGE] = HintText::Exclude({ - //obscure text - Text{"a #scrub by a bridge# sells", /*french*/"la #peste Mojo près du pont dans les bois# vend", /*spanish*/"un #deku bajo un puente# del bosque venden"}, - }); - - hintTable[RHT_LW_DEKU_SCRUB_GROTTO_REAR] = HintText::Exclude({ - //obscure text - Text{"a #scrub underground duo# sells", /*french*/"le #duo de peste Mojo dans les sous-bois# vend", /*spanish*/"un #par de dekus subterráneos# del bosque venden"}, - }); - - hintTable[RHT_LW_DEKU_SCRUB_GROTTO_FRONT] = HintText::Exclude({ - //obscure text - Text{"a #scrub underground duo# sells", /*french*/"le #duo de peste Mojo dans les sous-bois# vend", /*spanish*/"un #par de dekus subterráneos# del bosque venden"}, - }); - - - hintTable[RHT_SFM_DEKU_SCRUB_GROTTO_REAR] = HintText::Exclude({ - //obscure text - Text{"a #scrub underground duo# sells", /*french*/"le #duo de peste Mojo au cœur du sanctuaire sylvestre# vend", /*spanish*/"un #par de dekus subterráneos# de la pradera sagrada venden"}, - }); - - hintTable[RHT_SFM_DEKU_SCRUB_GROTTO_FRONT] = HintText::Exclude({ - //obscure text - Text{"a #scrub underground duo# sells", /*french*/"le #duo de peste Mojo au cœur du sanctuaire sylvestre# vend", /*spanish*/"un #par de dekus subterráneos# de la pradera sagrada venden"}, - }); - - - hintTable[RHT_GC_DEKU_SCRUB_GROTTO_LEFT] = HintText::Exclude({ - //obscure text - Text{"a #trio of scrubs# sells", /*french*/"le #trio de peste Mojo dans le village Goron# vend", /*spanish*/"un #trío de dekus# de la Ciudad Goron venden"}, - }); - - hintTable[RHT_GC_DEKU_SCRUB_GROTTO_RIGHT] = HintText::Exclude({ - //obscure text - Text{"a #trio of scrubs# sells", /*french*/"le #trio de peste Mojo dans le village Goron# vend", /*spanish*/"un #trío de dekus# de la Ciudad Goron venden"}, - }); - - hintTable[RHT_GC_DEKU_SCRUB_GROTTO_CENTER] = HintText::Exclude({ - //obscure text - Text{"a #trio of scrubs# sells", /*french*/"le #trio de peste Mojo dans le village Goron# vend", /*spanish*/"un #trío de dekus# de la Ciudad Goron venden"}, - }); - - - hintTable[RHT_DMC_DEKU_SCRUB_GROTTO_LEFT] = HintText::Exclude({ - //obscure text - Text{"a #trio of scrubs# sells", /*french*/"le #trio de peste Mojo dans le volcan# vend", /*spanish*/"un #trío de dekus# del volcán venden"}, - }); - - hintTable[RHT_DMC_DEKU_SCRUB_GROTTO_RIGHT] = HintText::Exclude({ - //obscure text - Text{"a #trio of scrubs# sells", /*french*/"le #trio de peste Mojo dans le volcan# vend", /*spanish*/"un #trío de dekus# del volcán venden"}, - }); - - hintTable[RHT_DMC_DEKU_SCRUB_GROTTO_CENTER] = HintText::Exclude({ - //obscure text - Text{"a #trio of scrubs# sells", /*french*/"le #trio de peste Mojo dans le volcan# vend", /*spanish*/"un #trío de dekus# del volcán venden"}, - }); - - - hintTable[RHT_ZR_DEKU_SCRUB_GROTTO_REAR] = HintText::Exclude({ - //obscure text - Text{"a #scrub underground duo# sells", /*french*/"le #duo de peste Mojo près du fleuve# vend", /*spanish*/"un #par de dekus subterráneos# del río venden"}, - }); - - hintTable[RHT_ZR_DEKU_SCRUB_GROTTO_FRONT] = HintText::Exclude({ - //obscure text - Text{"a #scrub underground duo# sells", /*french*/"le #duo de peste Mojo près du fleuve# vend", /*spanish*/"un #par de dekus subterráneos# del río venden"}, - }); - - - hintTable[RHT_LH_DEKU_SCRUB_GROTTO_LEFT] = HintText::Exclude({ - //obscure text - Text{"a #trio of scrubs# sells", /*french*/"le #trio de peste Mojo près du lac# vend", /*spanish*/"un #trío de dekus# del lago venden"}, - }); - - hintTable[RHT_LH_DEKU_SCRUB_GROTTO_RIGHT] = HintText::Exclude({ - //obscure text - Text{"a #trio of scrubs# sells", /*french*/"le #trio de peste Mojo près du lac# vend", /*spanish*/"un #trío de dekus# del lago venden"}, - }); - - hintTable[RHT_LH_DEKU_SCRUB_GROTTO_CENTER] = HintText::Exclude({ - //obscure text - Text{"a #trio of scrubs# sells", /*french*/"le #trio de peste Mojo près du lac# vend", /*spanish*/"un #trío de dekus# del lago venden"}, - }); - - - hintTable[RHT_GV_DEKU_SCRUB_GROTTO_REAR] = HintText::Exclude({ - //obscure text - Text{"a #scrub underground duo# sells", /*french*/"le #duo de peste Mojo près de la vallée# vend", /*spanish*/"un #par de dekus subterráneos# del valle venden"}, - }); - - hintTable[RHT_GV_DEKU_SCRUB_GROTTO_FRONT] = HintText::Exclude({ - //obscure text - Text{"a #scrub underground duo# sells", /*french*/"le #duo de peste Mojo près de la vallée# vend", /*spanish*/"un #par de dekus subterráneos# del valle venden"}, - }); - - - hintTable[RHT_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT] = HintText::Exclude({ - //obscure text - Text{"a #scrub underground duo# sells", /*french*/"le #duo de peste Mojo dans le désert# vend", /*spanish*/"un #par de dekus subterráneos# del desierto venden"}, - }); - - hintTable[RHT_COLOSSUS_DEKU_SCRUB_GROTTO_REAR] = HintText::Exclude({ - //obscure text - Text{"a #scrub underground duo# sells", /*french*/"le #duo de peste Mojo dans le désert# vend", /*spanish*/"un #par de dekus subterráneos# del desierto venden"}, - }); - - - hintTable[RHT_LLR_STABLES_LEFT_COW] = HintText::Exclude({ - //obscure text - Text{"a #cow in a stable# gifts", /*french*/"la #vache dans l'étable# donne", /*spanish*/"una #vaca del establo# brinda"}, - }); - - hintTable[RHT_LLR_STABLES_RIGHT_COW] = HintText::Exclude({ - //obscure text - Text{"a #cow in a stable# gifts", /*french*/"la #vache dans l'étable# donne", /*spanish*/"una #vaca del establo# brinda"}, - }); - - hintTable[RHT_LLR_TOWER_RIGHT_COW] = HintText::Exclude({ - //obscure text - Text{"a #cow in a ranch silo# gifts", /*french*/"la #vache dans le silo de la ferme# donne", /*spanish*/"una #vaca del granero# brinda"}, - }); - - hintTable[RHT_LLR_TOWER_LEFT_COW] = HintText::Exclude({ - //obscure text - Text{"a #cow in a ranch silo# gifts", /*french*/"la #vache dans le silo de la ferme# donne", /*spanish*/"una #vaca del granero# brinda"}, - }); - - hintTable[RHT_KAK_IMPAS_HOUSE_COW] = HintText::Exclude({ - //obscure text - Text{"a #cow imprisoned in a house# protects", /*french*/"la #vache en cage# donne", /*spanish*/"una #vaca enjaulada de una casa# brinda"}, - }); - - hintTable[RHT_DMT_COW_GROTTO_COW] = HintText::Exclude({ - //obscure text - Text{"a #cow in a luxurious hole# offers", /*french*/"la #vache dans une grotte luxueuse# donne", /*spanish*/"una #vaca de un lujoso hoyo# brinda"}, - }); - - hintTable[RHT_BEEHIVE_CHEST_GROTTO] = HintText::Exclude({ - //obscure text - Text{"a #beehive above a chest# hides", /*french*/"", /*spanish*/"una #colmena sobre un cofre# esconde"}, - }); - - hintTable[RHT_BEEHIVE_LONELY_SCRUB_GROTTO] = HintText::Exclude({ - //obscure text - Text{"a #beehive above a lonely scrub# hides", /*french*/"", /*spanish*/"una #colmena sobre un deku solitario# esconde"}, - }); - - hintTable[RHT_BEEHIVE_SCRUB_PAIR_GROTTO] = HintText::Exclude({ - //obscure text - Text{"a #beehive above a pair of scrubs# hides", /*french*/"", /*spanish*/"una #colmena sobre un par de dekus# esconde"}, - }); - - hintTable[RHT_BEEHIVE_SCRUB_TRIO_GROTTO] = HintText::Exclude({ - //obscure text - Text{"a #beehive above a trio of scrubs# hides", /*french*/"", /*spanish*/"una #colmena sobre un trío de dekus# esconde"}, - }); - - hintTable[RHT_BEEHIVE_COW_GROTTO] = HintText::Exclude({ - //obscure text - Text{"a #beehive above a cow# hides", /*french*/"", /*spanish*/"una #colmena sobre una vaca# esconde"}, - }); - - hintTable[RHT_BEEHIVE_IN_FRONT_OF_KING_ZORA] = HintText::Exclude({ - //obscure text - Text{"a #beehive in front of the king of the zoras# hides", /*french*/"", /*spanish*/"una #colmena delante del rey de los zoras# esconde"}, - }); - - hintTable[RHT_BEEHIVE_BEHIND_KING_ZORA] = HintText::Exclude({ - //obscure text - Text{"a #beehive behind the king of the zoras# hides", /*french*/"", /*spanish*/"una #colmena detrás del rey de los zoras# esconde"}, - }); +#include "../../static_data.h" +#include "../hints.hpp" +#include "../../../custom-message/CustomMessageManager.h" + +namespace Rando { +void StaticData::HintTable_Init_Exclude_Overworld() { + + hintTextTable[RHT_KF_KOKIRI_SWORD_CHEST] = HintText(CustomMessage("They say that the #hidden treasure of the Kokiri# is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #trésor des Kokiri# est #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #tesoro oculto de los Kokiri# esconde #[[1]]#. + + hintTextTable[RHT_KF_MIDOS_TOP_LEFT_CHEST] = HintText(CustomMessage("They say that #inside Mido's house# is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #dans la maison de Mido# gît #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, en la #casa de Mido# yace #[[1]]#. + {}, { + CustomMessage("They say that the #leader of the Kokiri# hides #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #chef des Kokiri# possède #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, el #líder de los Kokiri# esconde #[[1]]#. + + hintTextTable[RHT_KF_MIDOS_TOP_RIGHT_CHEST] = HintText(CustomMessage("They say that #inside Mido's house# is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #dans la maison de Mido# gît #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, en la #casa de Mido# yace #[[1]]#. + {}, { + CustomMessage("They say that the #leader of the Kokiri# hides #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #chef des Kokiri# possède #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, el #líder de los Kokiri# esconde #[[1]]#. + + hintTextTable[RHT_KF_MIDOS_BOTTOM_LEFT_CHEST] = HintText(CustomMessage("They say that #inside Mido's house# is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #dans la maison de Mido# gît #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, en la #casa de Mido# yace #[[1]]#. + {}, { + CustomMessage("They say that the #leader of the Kokiri# hides #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #chef des Kokiri# possède #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, el #líder de los Kokiri# esconde #[[1]]#. + + hintTextTable[RHT_KF_MIDOS_BOTTOM_RIGHT_CHEST] = HintText(CustomMessage("They say that #inside Mido's house# is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #dans la maison de Mido# gît #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, en la #casa de Mido# yace #[[1]]#. + {}, { + CustomMessage("They say that the #leader of the Kokiri# hides #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #chef des Kokiri# possède #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, el #líder de los Kokiri# esconde #[[1]]#. + + hintTextTable[RHT_GRAVEYARD_SHIELD_GRAVE_CHEST] = HintText(CustomMessage("They say that the #treasure of a fallen soldier# is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #trésor du soldat mort# est #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #tesoro de un soldado caído# esconde #[[1]]#. + + hintTextTable[RHT_DMT_CHEST] = HintText(CustomMessage("They say that hidden behind a wall on a #mountain trail# is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, derrière une façade du #chemin montagneux# est #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, tras una pared del #sendero de la montaña# yace #[[1]]#. + + hintTextTable[RHT_GC_MAZE_RIGHT_CHEST] = HintText(CustomMessage("They say that in #Goron City# explosives unlock #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, des explosions dans le #village Goron# révèlent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, en la #Ciudad Goron# unos explosivos desbloquean #[[1]]#. + + hintTextTable[RHT_GC_MAZE_CENTER_CHEST] = HintText(CustomMessage("They say that in #Goron City# explosives unlock #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, des explosions dans le #village Goron# révèlent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, en la #Ciudad Goron# unos explosivos desbloquean #[[1]]#. + + hintTextTable[RHT_ZD_CHEST] = HintText(CustomMessage("They say that fire #beyond a waterfall# reveals #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, du feu #derrière la cascade# éclaire #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, las #llamas tras una una cascada# revelan #[[1]]#. + + hintTextTable[RHT_GRAVEYARD_HOOKSHOT_CHEST] = HintText(CustomMessage("They say that #dead Dampé's first prize# is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #première course d'Igor# donne #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, el primer premio de #la carrera de Dampé# se trata de #[[1]]#. + {}, { + CustomMessage("They say that a chest hidden by a #speedy spectre# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #coffre du rapide revenant# contient #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, un cofre custodiado por un #espectro veloz# contiene #[[1]]#. + + hintTextTable[RHT_GF_CHEST] = HintText(CustomMessage("They say that on a #rooftop in the desert# lies #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, sur un #toit du désert# gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, en una #azotea del desierto# yace #[[1]]#. + + hintTextTable[RHT_KAK_REDEAD_GROTTO_CHEST] = HintText(CustomMessage("They say that #zombies beneath the earth# guard #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #revenants sous terre# protègent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, unos #zombis subterráneos# esconden #[[1]]#. + + hintTextTable[RHT_SFM_WOLFOS_GROTTO_CHEST] = HintText(CustomMessage("They say that #wolves beneath the earth# guard #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #loups sous terre# protègent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, unos #lobos subterráneos# esconden #[[1]]#. + + hintTextTable[RHT_HF_NEAR_MARKET_GROTTO_CHEST] = HintText(CustomMessage("They say that a #hole in a field near a drawbridge# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #grotte près d'un pont# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, bajo el #hoyo de una llanura cercano a un puente# yace #[[1]]#. + + hintTextTable[RHT_HF_NEAR_MARKET_GROTTO_FISH] = HintText(CustomMessage("They say that a #fish in a hole in a field near a drawbridge# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #grotte près d'un pont# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, bajo el #hoyo de una llanura cercano a un puente# yace #[[1]]#. + + hintTextTable[RHT_HF_SOUTHEAST_GROTTO_CHEST] = HintText(CustomMessage("They say that a #hole amongst trees in a field# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #grotte près des arbres# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, bajo el #hoyo de una llanura rodeado de árboles# yace #[[1]]#. + + hintTextTable[RHT_HF_SOUTHEAST_GROTTO_FISH] = HintText(CustomMessage("They say that a #fish in a hole amongst trees in a field# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #grotte près des arbres# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, bajo el #hoyo de una llanura rodeado de árboles# yace #[[1]]#. + + hintTextTable[RHT_HF_OPEN_GROTTO_CHEST] = HintText(CustomMessage("They say that an #open hole in a field# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #grotte dans les plaines# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, bajo el #hoyo descubierto de una llanura# yace #[[1]]#. + + hintTextTable[RHT_HF_OPEN_GROTTO_FISH] = HintText(CustomMessage("They say that a #fish in an open hole in a field# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #grotte dans les plaines# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, bajo el #hoyo descubierto de una llanura# yace #[[1]]#. + + hintTextTable[RHT_KAK_OPEN_GROTTO_CHEST] = HintText(CustomMessage("They say that an #open hole in a town# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #grotte dans le village# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, bajo el #hoyo descubierto de un pueblo# yace #[[1]]#. + + hintTextTable[RHT_KAK_OPEN_GROTTO_FISH] = HintText(CustomMessage("They say that a #fish in an open hole in a town# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #grotte dans le village# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, bajo el #hoyo descubierto de un pueblo# yace #[[1]]#. + + hintTextTable[RHT_ZR_OPEN_GROTTO_CHEST] = HintText(CustomMessage("They say that a #hole along a river# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #grotte près du fleuve# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, bajo un #hoyo junto a un río# yace #[[1]]#. + + hintTextTable[RHT_ZR_OPEN_GROTTO_FISH] = HintText(CustomMessage("They say that a #fish in a hole along a river# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #grotte près du fleuve# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, bajo un #hoyo junto a un río# yace #[[1]]#. + + hintTextTable[RHT_KF_STORMS_GROTTO_CHEST] = HintText(CustomMessage("They say that a #hole in a forest village# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #grotte inondée de pluie dans le Village Kokiri# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, bajo el #hoyo de una tribu del bosque# yace #[[1]]#. + + hintTextTable[RHT_KF_STORMS_GROTTO_FISH] = HintText(CustomMessage("They say that a #fish in a hole in a forest village# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #grotte inondée de pluie dans le Village Kokiri# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, bajo el #hoyo de una tribu del bosque# yace #[[1]]#. + + hintTextTable[RHT_LW_NEAR_SHORTCUTS_GROTTO_CHEST] = HintText(CustomMessage("They say that a #hole in a wooded maze# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #grotte dans le labyrinthe sylvestre# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, bajo un #hoyo de un laberinto forestal# yace #[[1]]#. + + hintTextTable[RHT_LW_NEAR_SHORTCUTS_GROTTO_FISH] = HintText(CustomMessage("They say that a #fish in a hole in a wooded maze# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #grotte dans le labyrinthe sylvestre# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, bajo un #hoyo de un laberinto forestal# yace #[[1]]#. + + hintTextTable[RHT_DMT_STORMS_GROTTO_CHEST] = HintText(CustomMessage("They say that #hole flooded with rain on a mountain# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #grotte inondée de pluie sur la montagne# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, bajo un #hoyo de una montaña inundado de lluvia# yace #[[1]]#. + + hintTextTable[RHT_DMT_STORMS_GROTTO_FISH] = HintText(CustomMessage("They say that #fish in a hole flooded with rain on a mountain# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #grotte inondée de pluie sur la montagne# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, bajo un #hoyo de una montaña inundado de lluvia# yace #[[1]]#. + + hintTextTable[RHT_DMC_UPPER_GROTTO_CHEST] = HintText(CustomMessage("They say that a #hole in a volcano# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #grotte dans le volcan# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, bajo el #hoyo de un volcán# yace #[[1]]#. + + hintTextTable[RHT_DMC_UPPER_GROTTO_FISH] = HintText(CustomMessage("They say that a #fish in a hole in a volcano# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #grotte dans le volcan# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, bajo el #hoyo de un volcán# yace #[[1]]#. + + hintTextTable[RHT_TOT_MASTER_SWORD] = HintText(CustomMessage("They say that a #pedestal in a temple# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, un #piédestal dans un temple# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #pedestal en un templo# sostiene #[[1]]#. + + hintTextTable[RHT_TOT_LIGHT_ARROWS_CUTSCENE] = HintText(CustomMessage("They say that the #final gift of a princess# is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #cadeau d'adieu de la princesse# est #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #obsequio final de la princesa# se trata de #[[1]]#. + + hintTextTable[RHT_LW_GIFT_FROM_SARIA] = HintText(CustomMessage("They say that #Saria's Gift# is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #cadeau de Saria# est #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, el #regalo de Saria# se trata de #[[1]]#. + {}, { + CustomMessage("They say that a #potato hoarder# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #panini mélodieux# est en fait #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, cierta #jovencita verde# concede #[[1]]#. + CustomMessage("They say that a rooty tooty #flutey cutey# gifts #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #patate musicale# est en fait #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, una #gran amiga# concede #[[1]]#. + + hintTextTable[RHT_ZF_GREAT_FAIRY_REWARD] = HintText(CustomMessage("They say that the #fairy of winds# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #fée du vent# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #hada del viento# brinda #[[1]]#. + + hintTextTable[RHT_HC_GREAT_FAIRY_REWARD] = HintText(CustomMessage("They say that the #fairy of fire# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #fée du feu# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #hada del fuego# brinda #[[1]]#. + + hintTextTable[RHT_COLOSSUS_GREAT_FAIRY_REWARD] = HintText(CustomMessage("They say that the #fairy of love# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #fée de l'amour# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #hada del amor# brinda #[[1]]#. + + hintTextTable[RHT_DMT_GREAT_FAIRY_REWARD] = HintText(CustomMessage("They say that a #magical fairy# gifts #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #fée de la magie# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #hada mágica# brinda #[[1]]#. + + hintTextTable[RHT_DMC_GREAT_FAIRY_REWARD] = HintText(CustomMessage("They say that a #magical fairy# gifts #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #fée de la magie# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #hada mágica# brinda #[[1]]#. + + hintTextTable[RHT_OGC_GREAT_FAIRY_REWARD] = HintText(CustomMessage("They say that the #fairy of strength# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #fée de la force# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #hada de la fuerza# brinda #[[1]]#. + + hintTextTable[RHT_SONG_FROM_IMPA] = HintText(CustomMessage("They say that #deep in a castle#, Impa teaches #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #la gardienne de la princesse# donne #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, en el #jardín del castillo Impa enseña# #[[1]]#. + + hintTextTable[RHT_SONG_FROM_MALON] = HintText(CustomMessage("They say that #a farm girl# sings #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #fillette de la ferme# donne #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #chica rupestre# canta #[[1]]#. + + hintTextTable[RHT_SONG_FROM_SARIA] = HintText(CustomMessage("They say that #deep in the forest#, Saria teaches #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #fille de la forêt# donne #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, al #fondo del bosque# Saria enseña #[[1]]#. + + hintTextTable[RHT_SONG_FROM_WINDMILL] = HintText(CustomMessage("They say that a man #in a windmill# is obsessed with #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#homme du moulin# donne #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #hombre del molino# está obsesionado con #[[1]]#. + + hintTextTable[RHT_HC_MALON_EGG] = HintText(CustomMessage("They say that a #girl looking for her father# gives #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #fillette qui cherche son père# donne #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #chica en busca de su padre# otorga #[[1]]#. + + hintTextTable[RHT_HC_ZELDAS_LETTER] = HintText(CustomMessage("They say that a #princess in a castle# gifts #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #princesse dans le château# donne #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la #princesa de un castillo# otorga #[[1]]#. + + hintTextTable[RHT_ZD_DIVING_MINIGAME] = HintText(CustomMessage("They say that those who #dive for Zora rupees# will find #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, ceux qui #plongent pour des rubis Zora# trouveront #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, aquellos que se #sumergan por las rupias zora# encontrarán #[[1]]#. + {}, { + CustomMessage("They say that an #unsustainable business model# gifts #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #mauvais modèle d'affaires# donne #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, un #mal modelo de negocio# premia con #[[1]]#. + + hintTextTable[RHT_LH_CHILD_FISHING] = HintText(CustomMessage("They say that #fishing in youth# bestows #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #pêcher dans sa jeunesse# promet #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #pescar en la juventud# conduce a #[[1]]#. + + hintTextTable[RHT_LH_POND_FISH] = HintText(CustomMessage("They say that #hitting the pond# reveals #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_LH_HYRULE_LOACH] = HintText(CustomMessage("They say that #fishing the hyrule loach# will give you #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, !!! #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, si #pescas a la Locha de Hyrule# encontrarás #[[1]]#. + {}, { + CustomMessage("They say that #fishing the legend# bestows #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, !!! #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, #pescar a la leyenda# conduce a #[[1]]#. + + hintTextTable[RHT_LH_ADULT_FISHING] = HintText(CustomMessage("They say that #fishing in maturity# bestows #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #pêcher dans sa maturité# promet #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #pescar en la madurez# conduce a #[[1]]#. + + hintTextTable[RHT_LH_LAB_DIVE] = HintText(CustomMessage("They say that a #diving experiment# is rewarded with #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#expérience de plongée# donne #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #bucear para un experimento# se premia con #[[1]]#. + // RANDOTODO: needs translation + hintTextTable[RHT_ZD_FISH] = HintText(CustomMessage("They say that a #fish by a waterfall# hoards #[[1]]#.", {QM_RED, QM_GREEN})); + + + hintTextTable[RHT_GC_ROLLING_GORON_AS_ADULT] = HintText(CustomMessage("They say that #reassuring a young Goron# is rewarded with #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #rassurer un jeune Goron# donne #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, #calmar a un joven Goron# otorga #[[1]]#. + {}, { + CustomMessage("They say that #comforting yourself# provides #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, se #réconforter soi-même# donne #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, #confrontarte a ti mismo# otorga #[[1]]#. + + hintTextTable[RHT_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE] = HintText(CustomMessage("They say that the #first explosive prize# is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #premier prix explosif# est #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #primer premio explosivo# se trata de #[[1]]#. + + hintTextTable[RHT_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE] = HintText(CustomMessage("They say that the #second explosive prize# is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #deuxième prix explosif# est #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #segundo premio explosivo# se trata de #[[1]]#. + + hintTextTable[RHT_MARKET_LOST_DOG] = HintText(CustomMessage("They say that #rescuing Richard the Dog# is rewarded with #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #retrouver Kiki le chien# promet #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, #rescatar al perrito Ricardo# conduce a #[[1]]#. + {}, { + CustomMessage("They say that #puppy lovers# will find #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #amoureux canins# trouveront #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, los #amantes caninos# encontrarán #[[1]]#. + + hintTextTable[RHT_LW_OCARINA_MEMORY_GAME] = HintText(CustomMessage("They say that #playing an Ocarina in Lost Woods# is rewarded with #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #jouer l'ocarina dans les Bois Perdus# donne #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, #tocar la ocarina en el Bosque Perdido# otorga #[[1]]#. + {}, { + CustomMessage("They say that the prize for a #game of Simon Says# is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #récompense de Jean Dit# est #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, #repetir ciertas melodías# otorga #[[1]]#. + CustomMessage("They say that a #child sing-a-long# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #jeunes flûtistes# donnent #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, #tocar junto a otros# otorga #[[1]]#. + + hintTextTable[RHT_KAK_10_GOLD_SKULLTULA_REWARD] = HintText(CustomMessage("They say that slaying #10 Gold Skulltulas# reveals #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, détruire #10 Skulltulas d'or# donne #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, #exterminar 10 skulltulas doradas# revela #[[1]]#. + {}, { + CustomMessage("They say that #10 bug badges# rewards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #10 écussons# donnent #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, #10 medallas de insectos# otorgan #[[1]]#. + CustomMessage("They say that #10 spider souls# yields #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #10 âmes# donnent #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, #10 almas de araña# otorgan #[[1]]#. + CustomMessage("They say that #10 auriferous arachnids# lead to #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #10 arachnides aurifères# donnent #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, #10 arácnidos auríferos# otorgan #[[1]]#. + + hintTextTable[RHT_KAK_MAN_ON_ROOF] = HintText(CustomMessage("They say that a #rooftop wanderer# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #rencontre sur un toit# donne #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #alguien sobre un tejado# otorga #[[1]]#. + + hintTextTable[RHT_ZR_MAGIC_BEAN_SALESMAN] = HintText(CustomMessage("They say that a #bean seller# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #marchand de haricots magiques# vend en fait #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, el #vendedor de judías# ofrece #[[1]]#. + {}, { + CustomMessage("They say that a seller of #colorful crops# has #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #marchand de légumes# vend #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, el vendedor de un #colorido cultivo# ofrece #[[1]]#. + + hintTextTable[RHT_ZR_FROGS_IN_THE_RAIN] = HintText(CustomMessage("They say that #frogs in a storm# gift #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #des grenouilles mouillées# donnent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, las #ancas bajo la tormenta# otorgan #[[1]]#. + + hintTextTable[RHT_ZR_FROGS_ZELDAS_LULLABY] = HintText(CustomMessage("They say that after hearing #Zelda's Lullaby, the frogs# gift #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, à l'écoute de #la berceuse de Zelda, les grenouilles# donnent #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, después de escuchar #la Nana de Zelda, las ranas# regalan #[[1]]#. + {}, { + CustomMessage("They say that #sleepy frogs# gift #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #les grenouilles somnolentes# donnent #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, las #ranas somnolientas# regalan #[[1]]#. + CustomMessage("They say that #the Froggish Tenor in the back-left# gifts #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #le ténor grenouillesque au fond à gauche# donne #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, el #Sapo Tenore al fondo, a la izquierda#, regala #[[1]]#. + + hintTextTable[RHT_ZR_FROGS_EPONAS_SONG] = HintText(CustomMessage("They say that after hearing #Epona's Song, the frogs# gift #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, à l'écoute du #chant d'Epona, les grenouilles# donnent #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, después de escuchar #la Canción de Epona, las ranas# regalan #[[1]]#. + {}, { + CustomMessage("They say that #equine frogs# gift #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #les grenouilles équestres# donnent #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, las #ranas equinas# regalan #[[1]]#. + CustomMessage("They say that #the Froggish Tenor in the back-right# gifts #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #le ténor grenouillesque au fond à droite# donne #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, el #Sapo Tenore al fondo, a la derecha#, regala #[[1]]#. + + hintTextTable[RHT_ZR_FROGS_SARIAS_SONG] = HintText(CustomMessage("They say that after hearing #Saria's Song, the frogs# gift #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, à l'écoute du #chant de Saria, les grenouilles# donnent #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, después de escuchar #la Canción de Saria, las ranas# regalan #[[1]]#. + {}, { + CustomMessage("They say that #sylvan frogs# gift #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #les grenouilles sylvestres# donnent #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, las #ranas silvestres# regalan #[[1]]#. + CustomMessage("They say that #the Froggish Tenor in the center# gifts #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #le ténor grenouillesque dans le centre# donne #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, el #Sapo Tenore en el centro# regala #[[1]]#. + + hintTextTable[RHT_ZR_FROGS_SUNS_SONG] = HintText(CustomMessage("They say that after hearing #the Sun's Song, the frogs# gift #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, à l'écoute du #chant du soleil, les grenouilles# donnent #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, después de escuchar #la Canción del Sol, las ranas# regalan #[[1]]#. + {}, { + CustomMessage("They say that #enlightened frogs# gift #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #les grenouilles éclairées# donnent #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, las #ranas alumbradas# regalan #[[1]]#. + CustomMessage("They say that #the Froggish Tenor in the front-left# gifts #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #le ténor grenouillesque à l'avant gauche# donne #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, el #Sapo Tenore al frente, a la izquierda#, regala #[[1]]#. + + hintTextTable[RHT_ZR_FROGS_SONG_OF_TIME] = HintText(CustomMessage("They say that after hearing #the Song of Time, the frogs# gift #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, à l'écoute du #chant du temps, les grenouilles# donnent #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, después de escuchar #la Canción del tiempo, las ranas# regalan #[[1]]#. + {}, { + CustomMessage("They say that #time-traveling frogs# gift #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #les grenouilles voyageuses dans le temps# donnent #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, las #ranas viajeras del tiempo# regalan #[[1]]#. + CustomMessage("They say that #the Froggish Tenor in the front-right# gifts #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #le ténor grenouillesque à l'avant droite# donne #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, el #Sapo Tenore al frente, a la derecha#, regala #[[1]]#. + + hintTextTable[RHT_GF_HBA_1000_POINTS] = HintText(CustomMessage("They say that scoring 1000 in #horseback archery# grants #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, obtenir 1000 points dans l'#archerie équestre# donne #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, conseguir 1000 puntos en el #tiro con arco a caballo# premia #[[1]]#. + + hintTextTable[RHT_MARKET_SHOOTING_GALLERY_REWARD] = HintText(CustomMessage("They say that #shooting in youth# grants #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #faire du tir dans sa jeunesse# donne #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #disparar en la juventud# otorga #[[1]]#. + + hintTextTable[RHT_KAK_SHOOTING_GALLERY_REWARD] = HintText(CustomMessage("They say that #shooting in maturity# grants #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #faire du tir dans sa maturité# donne #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #disparar en la madurez# otorga #[[1]]#. + + hintTextTable[RHT_LW_TARGET_IN_WOODS] = HintText(CustomMessage("They say that shooting a #target in the woods# grants #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #tirer une cible dans les bois# donne #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, disparar a un #blanco forestal# brinda #[[1]]#. + + hintTextTable[RHT_KAK_ANJU_AS_ADULT] = HintText(CustomMessage("They say that a #chicken caretaker# offers adults #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, devenir un #éleveur de Cocottes# donne #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #cuidadora de emplumados# le ofrece a los mayores #[[1]]#. + + hintTextTable[RHT_LLR_TALONS_CHICKENS] = HintText(CustomMessage("They say that #finding Super Cuccos# is rewarded with #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #trouver des Super Cocottes# donne #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #hallar los supercucos# conduce a #[[1]]#. + + hintTextTable[RHT_GC_ROLLING_GORON_AS_CHILD] = HintText(CustomMessage("They say that the prize offered by a #large rolling Goron# is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la récompense d'un #gros Goron roulant# est #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #gran Goron rodante# otorga #[[1]]#. + + hintTextTable[RHT_LH_UNDERWATER_ITEM] = HintText(CustomMessage("They say that the #sunken treasure in a lake# is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #trésor au fond du lac# est #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #tesoro hundido del lago# se trata de #[[1]]#. + + hintTextTable[RHT_GF_GERUDO_MEMBERSHIP_CARD] = HintText(CustomMessage("They say that #rescuing captured carpenters# is rewarded with #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #secourir les charpentiers capturés# assure #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #rescatar los apresados carpinteros# se premia con #[[1]]#. + + hintTextTable[RHT_WASTELAND_BOMBCHU_SALESMAN] = HintText(CustomMessage("They say that a #carpet guru# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #un marchand du désert# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #genio de una alfombra# vende #[[1]]#. + + hintTextTable[RHT_GC_MEDIGORON] = HintText(CustomMessage("They say that #Medigoron# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #Medigoron# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #Medigoron# vende #[[1]]#. + + hintTextTable[RHT_KAK_GRANNYS_SHOP] = HintText(CustomMessage("They say that the #potion shop lady# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #dame du magasin de potion# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la #señora de la tienda de pociones# vende #[[1]]#. + + hintTextTable[RHT_KAK_IMPAS_HOUSE_FREESTANDING_POH] = HintText(CustomMessage("They say that #imprisoned in a house# lies #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #encagé dans une maison# gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #en una casa entre rejas# yace #[[1]]#. + + hintTextTable[RHT_HF_TEKTITE_GROTTO_FREESTANDING_POH] = HintText(CustomMessage("They say that #deep underwater in a hole# is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #dans les profondeurs d'une grotte# gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #en lo hondo bajo un hoyo# yace #[[1]]#. + + hintTextTable[RHT_KAK_WINDMILL_FREESTANDING_POH] = HintText(CustomMessage("They say that on a #windmill ledge# lies #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #haut perché dans le moulin# gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, al #borde de un molino# yace #[[1]]#. + + hintTextTable[RHT_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH] = HintText(CustomMessage("They say that #dead Dampe's second# prize is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #deuxième course d'Igor# donne #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, el segundo premio de #la carrera de Dampé# se trata de #[[1]]#. + {}, { + CustomMessage("They say that #racing a ghost# leads to #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le défi du #revenant rapide# donne #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, #perseguir a un fantasma# conduce a #[[1]]#. + + hintTextTable[RHT_LLR_FREESTANDING_POH] = HintText(CustomMessage("They say that in a #ranch silo# lies #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #dans l'entrepôt de la ferme# gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, en un #granero rupestre# yace #[[1]]#. + + hintTextTable[RHT_GRAVEYARD_FREESTANDING_POH] = HintText(CustomMessage("They say that a #crate in a graveyard# hides #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #la boîte dans le Cimetière# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, bajo la #caja de un cementerio# yace #[[1]]#. + + hintTextTable[RHT_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR] = HintText(CustomMessage("They say that a #gravekeeper digs up# #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #le jeu du fossoyeur# cache #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, cierto #sepultero desentierra# #[[1]]#. + + hintTextTable[RHT_ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH] = HintText(CustomMessage("They say that on top of a #pillar in a river# lies #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #sur un pilier au dessus du fleuve# gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, en lo alto del #pilar de un río# yace #[[1]]#. + + hintTextTable[RHT_ZR_NEAR_DOMAIN_FREESTANDING_POH] = HintText(CustomMessage("They say that on a #river ledge by a waterfall# lies #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #sur la falaise au dessus du fleuve# gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, al borde de #la entrada a una cascada# yace #[[1]]#. + + hintTextTable[RHT_LH_FREESTANDING_POH] = HintText(CustomMessage("They say that high on a #lab rooftop# one can find #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #la tour d'observation du lac# cache #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, en lo #alto de un laboratorio# yace #[[1]]#. + + hintTextTable[RHT_ZF_ICEBERG_FREESTANDING_POH] = HintText(CustomMessage("They say that #floating on ice# is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #gisant sur la glace# gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #flotando sobre hielo# yace #[[1]]#. + + hintTextTable[RHT_GV_WATERFALL_FREESTANDING_POH] = HintText(CustomMessage("They say that behind a #valley waterfall# is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #derrière la cascade du désert# se cache #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, tras una #desierta cascada# yace #[[1]]#. + + hintTextTable[RHT_GV_CRATE_FREESTANDING_POH] = HintText(CustomMessage("They say that a #crate in a valley# hides #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #boîte dans la vallée# contient #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, bajo la #caja de un valle# yace #[[1]]#. + + hintTextTable[RHT_COLOSSUS_FREESTANDING_POH] = HintText(CustomMessage("They say that on top of an #arch of stone# lies #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #gisant sur une arche de pierre# gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, en lo alto de un #arco de piedra# yace #[[1]]#. + + hintTextTable[RHT_DMT_FREESTANDING_POH] = HintText(CustomMessage("They say that above a #mountain cavern entrance# is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, gisant #au dessus de la caverne montagneuse# gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, en lo alto de la #entrada de una cueva en la montaña# yace #[[1]]#. + + hintTextTable[RHT_DMC_WALL_FREESTANDING_POH] = HintText(CustomMessage("They say that nestled in a #volcanic wall# is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, dans une #alcove volcanique# gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, entre unas #murallas volcánicas# yace #[[1]]#. + + hintTextTable[RHT_DMC_VOLCANO_FREESTANDING_POH] = HintText(CustomMessage("They say that obscured by #volcanic ash# is #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #recouvert de cendres volcaniques# gît #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, bajo la #ceniza volcánica# yace #[[1]]#. + + hintTextTable[RHT_GF_NORTH_F1_CARPENTER] = HintText(CustomMessage("They say that #defeating Gerudo guards# reveals #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #geôliers Gerudo# détiennent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #derrotar a las guardas Gerudo# revela #[[1]]#. + + hintTextTable[RHT_GF_NORTH_F2_CARPENTER] = HintText(CustomMessage("They say that #defeating Gerudo guards# reveals #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #geôliers Gerudo# détiennent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #derrotar a las guardas Gerudo# revela #[[1]]#. + + hintTextTable[RHT_GF_SOUTH_F1_CARPENTER] = HintText(CustomMessage("They say that #defeating Gerudo guards# reveals #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #geôliers Gerudo# détiennent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #derrotar a las guardas Gerudo# revela #[[1]]#. + + hintTextTable[RHT_GF_SOUTH_F2_CARPENTER] = HintText(CustomMessage("They say that #defeating Gerudo guards# reveals #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, les #geôliers Gerudo# détiennent #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #derrotar a las guardas Gerudo# revela #[[1]]#. + + hintTextTable[RHT_HF_GS_NEAR_KAK_GROTTO] = HintText(CustomMessage("They say that a #spider-guarded spider in a hole# hoards #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula dans un trou d'arachnides# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula custodiada por otra# de un hoyo otorga #[[1]]#. + + hintTextTable[RHT_LLR_GS_BACK_WALL] = HintText(CustomMessage("They say that night reveals a #spider in a ranch# holding #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula sur la façade de la ferme# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la noche revela una #Skulltula del rancho# que otorga #[[1]]#. + + hintTextTable[RHT_LLR_GS_RAIN_SHED] = HintText(CustomMessage("They say that night reveals a #spider in a ranch# holding #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula sur le mur de l'enclos# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la noche revela una #Skulltula del rancho# que otorga #[[1]]#. + + hintTextTable[RHT_LLR_GS_HOUSE_WINDOW] = HintText(CustomMessage("They say that night reveals a #spider in a ranch# holding #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula sur la maison de ferme# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la noche revela una #Skulltula del rancho# que otorga #[[1]]#. + + hintTextTable[RHT_LLR_GS_TREE] = HintText(CustomMessage("They say that a spider hiding in a #ranch tree# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula dans l'arbre de la ferme# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una Skulltula escondida en el #árbol de un rancho# otorga #[[1]]#. + + hintTextTable[RHT_KF_GS_BEAN_PATCH] = HintText(CustomMessage("They say that a #spider buried in a forest# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula enterrée dans la forêt# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula enterrada en un bosque# otorga #[[1]]#. + + hintTextTable[RHT_KF_GS_KNOW_IT_ALL_HOUSE] = HintText(CustomMessage("They say that night in the past reveals a #spider in a forest# holding #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula derrière une cabane de la forêt# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la noche revela en el pasado una #Skulltula del bosque# que otorga #[[1]]#. + + hintTextTable[RHT_KF_GS_HOUSE_OF_TWINS] = HintText(CustomMessage("They say that night in the future reveals a #spider in a forest# holding #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula sur une cabane de la forêt# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la noche revela en el futuro una #Skulltula del rancho# que otorga #[[1]]#. + + hintTextTable[RHT_LW_GS_BEAN_PATCH_NEAR_BRIDGE] = HintText(CustomMessage("They say that a #spider buried deep in a forest maze# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula enterrée dans les bois# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula enterrada en un laberinto forestal# otorga #[[1]]#. + + hintTextTable[RHT_LW_GS_BEAN_PATCH_NEAR_THEATER] = HintText(CustomMessage("They say that a #spider buried deep in a forest maze# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula enterrée dans les bois# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula enterrada en un laberinto forestal# otorga #[[1]]#. + + hintTextTable[RHT_LW_GS_ABOVE_THEATER] = HintText(CustomMessage("They say that night reveals a #spider deep in a forest maze# holding #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula haut perchée dans les bois# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la noche revela una #Skulltula del laberinto forestal# que otorga #[[1]]#. + + hintTextTable[RHT_SFM_GS] = HintText(CustomMessage("They say that night reveals a #spider in a forest meadow# holding #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula dans le sanctuaire des bois# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la noche revela una #Skulltula de la pradera del bosque# que otorga #[[1]]#. + + hintTextTable[RHT_OGC_GS] = HintText(CustomMessage("They say that a #spider outside a tyrant's tower# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula parmi les ruines du château# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula a las afueras de la torre de un tirano# otorga #[[1]]#. + + hintTextTable[RHT_HC_GS_TREE] = HintText(CustomMessage("They say that a spider hiding in a #tree outside of a castle# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula dans l'arbre près du château# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una Skulltula escondida en el #árbol de las afueras de un castillo# otorga #[[1]]#. + + hintTextTable[RHT_MARKET_GS_GUARD_HOUSE] = HintText(CustomMessage("They say that a #spider in a guarded crate# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula dans une boîte en ville# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula bajo una custodiada caja# otorga #[[1]]#. + + hintTextTable[RHT_DMC_GS_BEAN_PATCH] = HintText(CustomMessage("They say that a #spider buried in a volcano# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula enterrée dans un volcan# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula enterrada en un volcán# otorga #[[1]]#. + + hintTextTable[RHT_DMT_GS_BEAN_PATCH] = HintText(CustomMessage("They say that a #spider buried outside a cavern# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula enterrée près d'une caverne# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula enterrada a la entrada de una cueva# otorga #[[1]]#. + + hintTextTable[RHT_DMT_GS_NEAR_KAK] = HintText(CustomMessage("They say that a #spider hidden in a mountain nook# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula cachée dans le flanc d'une montagne# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula oculta en el rincón de la montaña# otorga #[[1]]#. + + hintTextTable[RHT_DMT_GS_ABOVE_DODONGOS_CAVERN] = HintText(CustomMessage("They say that the hammer reveals a #spider on a mountain# holding #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula derrière un rocher massif près d'une caverne# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el martillo revela #una Skulltula de la montaña# que otorga #[[1]]#. + + hintTextTable[RHT_DMT_GS_FALLING_ROCKS_PATH] = HintText(CustomMessage("They say that the hammer reveals a #spider on a mountain# holding #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula derrière un rocher massif près du sommet d'un volcan# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el martillo revela #una Skulltula de la montaña# que otorga #[[1]]#. + + hintTextTable[RHT_GC_GS_CENTER_PLATFORM] = HintText(CustomMessage("They say that a #suspended spider# in Goron City holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula perchée dans le village Goron# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula suspendida# en la Ciudad Goron otorga #[[1]]#. + + hintTextTable[RHT_GC_GS_BOULDER_MAZE] = HintText(CustomMessage("They say that a spider in a #Goron City crate# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula dans une boîte du village Goron# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula bajo una caja# de la Ciudad Goron otorga #[[1]]#. + + hintTextTable[RHT_KAK_GS_HOUSE_UNDER_CONSTRUCTION] = HintText(CustomMessage("They say that night in the past reveals a #spider in a town# holding #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula dans le chantier de construction# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la noche del pasado revela una #Skulltula del pueblo# que otorga #[[1]]#. + + hintTextTable[RHT_KAK_GS_SKULLTULA_HOUSE] = HintText(CustomMessage("They say that night in the past reveals a #spider in a town# holding #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula sur une maison maudite# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la noche del pasado revela una #Skulltula del pueblo# que otorga #[[1]]#. + + hintTextTable[RHT_KAK_GS_GUARDS_HOUSE] = HintText(CustomMessage("They say that night in the past reveals a #spider in a town# holding #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula sur une maison de village# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la noche del pasado revela una #Skulltula del pueblo# que otorga #[[1]]#. + + hintTextTable[RHT_KAK_GS_TREE] = HintText(CustomMessage("They say that night in the past reveals a #spider in a town# holding #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula dans un arbre de village# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la noche del pasado revela una #Skulltula del pueblo# que otorga #[[1]]#. + + hintTextTable[RHT_KAK_GS_WATCHTOWER] = HintText(CustomMessage("They say that night in the past reveals a #spider in a town# holding #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula sur une échelle dans un village# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la noche del pasado revela una #Skulltula del pueblo# que otorga #[[1]]#. + + hintTextTable[RHT_KAK_GS_ABOVE_IMPAS_HOUSE] = HintText(CustomMessage("They say that night in the future reveals a #spider in a town# holding #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula au dessus d'une grande maison# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la noche del futuro revela una #Skulltula del pueblo# que otorga #[[1]]#. + + hintTextTable[RHT_GRAVEYARD_GS_WALL] = HintText(CustomMessage("They say that night reveals a #spider in a graveyard# holding #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula sur une façade du Cimetière# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la noche revela una #Skulltula del cementerio# que otorga #[[1]]#. + + hintTextTable[RHT_GRAVEYARD_GS_BEAN_PATCH] = HintText(CustomMessage("They say that a #spider buried in a graveyard# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula enterrée dans le Cimetière# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula enterrada en el cementerio# otorga #[[1]]#. + + hintTextTable[RHT_ZR_GS_LADDER] = HintText(CustomMessage("They say that night in the past reveals a #spider in a river# holding #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula sur une échelle près d'une cascade# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la noche del pasado revela una #Skulltula del río# que otorga #[[1]]#. + + hintTextTable[RHT_ZR_GS_TREE] = HintText(CustomMessage("They say that a spider hiding in a #tree by a river# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula dans un arbre près du fleuve# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una Skulltula escondida en el #árbol de un río# otorga #[[1]]#. + + hintTextTable[RHT_ZR_GS_ABOVE_BRIDGE] = HintText(CustomMessage("They say that night in the future reveals a #spider in a river# holding #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula sur une façade près d'une cascade# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la noche del futuro revela una #Skulltula del río# que otorga #[[1]]#. + + hintTextTable[RHT_ZR_GS_NEAR_RAISED_GROTTOS] = HintText(CustomMessage("They say that night in the future reveals a #spider in a river# holding #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula sur une façade près d'une grotte du fleuve# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la noche del futuro revela una #Skulltula del río# que otorga #[[1]]#. + + hintTextTable[RHT_ZD_GS_FROZEN_WATERFALL] = HintText(CustomMessage("They say that night reveals a #spider by a frozen waterfall# holding #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula près d'une cascade gelée# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la noche revela una #Skulltula junto a una congelada cascada# que otorga #[[1]]#. + + hintTextTable[RHT_ZF_GS_ABOVE_THE_LOG] = HintText(CustomMessage("They say that night reveals a #spider near a deity# holding #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula près du gardien aquatique# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la noche revela una #Skulltula junto a cierta deidad# que otorga #[[1]]#. + + hintTextTable[RHT_ZF_GS_TREE] = HintText(CustomMessage("They say that a spider hiding in a #tree near a deity# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula dans un arbre dans un réservoir# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una Skulltula escondida en el #árbol junto a cierta deidad# otorga #[[1]]#. + + hintTextTable[RHT_LH_GS_BEAN_PATCH] = HintText(CustomMessage("They say that a #spider buried by a lake# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula enterrée près d'un lac# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula enterrada junto a un lago# otorga #[[1]]#. + + hintTextTable[RHT_LH_GS_SMALL_ISLAND] = HintText(CustomMessage("They say that night reveals a #spider by a lake# holding #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula sur un îlot du lac# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la noche revela una #Skulltula junto a un lago# que otorga #[[1]]#. + + hintTextTable[RHT_LH_GS_LAB_WALL] = HintText(CustomMessage("They say that night reveals a #spider by a lake# holding #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula sur le mur d'un centre de recherche# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la noche revela una #Skulltula junto a un lago# que otorga #[[1]]#. + + hintTextTable[RHT_LH_GS_LAB_CRATE] = HintText(CustomMessage("They say that a spider deed underwater in a #lab crate# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula dans une boîte au fond d'une cuve d'eau# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula bajo la sumergida caja de un laboratorio# otorga #[[1]]#. + + hintTextTable[RHT_LH_GS_TREE] = HintText(CustomMessage("They say that night reveals a #spider by a lake high in a tree# holding #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula dans un grand arbre du lac# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la noche revela #una Skulltula del lago sobre un árbol# que otorga #[[1]]#. + + hintTextTable[RHT_GV_GS_BEAN_PATCH] = HintText(CustomMessage("They say that a #spider buried in a valley# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula enterré dans une vallée# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula enterrada en un valle# otorga #[[1]]#. + + hintTextTable[RHT_GV_GS_SMALL_BRIDGE] = HintText(CustomMessage("They say that night in the past reveals a #spider in a valley# holding #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula au dessus d'une petite cascade# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la noche del pasado revela una #Skulltula del valle# que otorga #[[1]]#. + + hintTextTable[RHT_GV_GS_PILLAR] = HintText(CustomMessage("They say that night in the future reveals a #spider in a valley# holding #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula sur une arche de pierre dans une vallée# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la noche del futuro revela una #Skulltula del valle# que otorga #[[1]]#. + + hintTextTable[RHT_GV_GS_BEHIND_TENT] = HintText(CustomMessage("They say that night in the future reveals a #spider in a valley# holding #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula derrière une tente# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la noche del futuro revela una #Skulltula del valle# que otorga #[[1]]#. + + hintTextTable[RHT_GF_GS_ARCHERY_RANGE] = HintText(CustomMessage("They say that night reveals a #spider in a fortress# holding #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula sur une cible de tir# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la noche revela una #Skulltula de una fortaleza# que otorga #[[1]]#. + + hintTextTable[RHT_GF_GS_TOP_FLOOR] = HintText(CustomMessage("They say that night reveals a #spider in a fortress# holding #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula au sommet d'une forteresse# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la noche revela una #Skulltula de una fortaleza# que otorga #[[1]]#. + + hintTextTable[RHT_COLOSSUS_GS_BEAN_PATCH] = HintText(CustomMessage("They say that a #spider buried in the desert# holds #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula enterrée au pied du colosse# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula enterrada en el desierto# otorga #[[1]]#. + + hintTextTable[RHT_COLOSSUS_GS_HILL] = HintText(CustomMessage("They say that night reveals a #spider deep in the desert# holding #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula sur une colline dans le désert# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la noche revela una #Skulltula en las profundidades del desierto# que otorga #[[1]]#. + + hintTextTable[RHT_COLOSSUS_GS_TREE] = HintText(CustomMessage("They say that night reveals a #spider deep in the desert# holding #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #Skulltula dans un arbre du désert# a #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, la noche revela una #Skulltula en las profundidades del desierto# que otorga #[[1]]#. + + hintTextTable[RHT_KF_SHOP_ITEM_1] = HintText(CustomMessage("They say that a #child shopkeeper# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #boutique Kokiri# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #joven dependiente# vende #[[1]]#. + + hintTextTable[RHT_KF_SHOP_ITEM_2] = HintText(CustomMessage("They say that a #child shopkeeper# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #boutique Kokiri# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #joven dependiente# vende #[[1]]#. + + hintTextTable[RHT_KF_SHOP_ITEM_3] = HintText(CustomMessage("They say that a #child shopkeeper# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #boutique Kokiri# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #joven dependiente# vende #[[1]]#. + + hintTextTable[RHT_KF_SHOP_ITEM_4] = HintText(CustomMessage("They say that a #child shopkeeper# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #boutique Kokiri# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #joven dependiente# vende #[[1]]#. + + hintTextTable[RHT_KF_SHOP_ITEM_5] = HintText(CustomMessage("They say that a #child shopkeeper# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #boutique Kokiri# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #joven dependiente# vende #[[1]]#. + + hintTextTable[RHT_KF_SHOP_ITEM_6] = HintText(CustomMessage("They say that a #child shopkeeper# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #boutique Kokiri# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #joven dependiente# vende #[[1]]#. + + hintTextTable[RHT_KF_SHOP_ITEM_7] = HintText(CustomMessage("They say that a #child shopkeeper# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #boutique Kokiri# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #joven dependiente# vende #[[1]]#. + + hintTextTable[RHT_KF_SHOP_ITEM_8] = HintText(CustomMessage("They say that a #child shopkeeper# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #boutique Kokiri# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #joven dependiente# vende #[[1]]#. + + hintTextTable[RHT_KAK_POTION_SHOP_ITEM_1] = HintText(CustomMessage("They say that the #Kakariko Potion Shop# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#apothicaire de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, la #tienda de pociones de Kakariko# ofrece #[[1]]#. + {}, { + CustomMessage("They say that a #potion seller# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. + + hintTextTable[RHT_KAK_POTION_SHOP_ITEM_2] = HintText(CustomMessage("They say that the #Kakariko Potion Shop# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#apothicaire de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, la #tienda de pociones de Kakariko# ofrece #[[1]]#. + {}, { + CustomMessage("They say that a #potion seller# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. + + hintTextTable[RHT_KAK_POTION_SHOP_ITEM_3] = HintText(CustomMessage("They say that the #Kakariko Potion Shop# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#apothicaire de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, la #tienda de pociones de Kakariko# ofrece #[[1]]#. + {}, { + CustomMessage("They say that a #potion seller# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. + + hintTextTable[RHT_KAK_POTION_SHOP_ITEM_4] = HintText(CustomMessage("They say that the #Kakariko Potion Shop# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#apothicaire de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, la #tienda de pociones de Kakariko# ofrece #[[1]]#. + {}, { + CustomMessage("They say that a #potion seller# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. + + hintTextTable[RHT_KAK_POTION_SHOP_ITEM_5] = HintText(CustomMessage("They say that the #Kakariko Potion Shop# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#apothicaire de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, la #tienda de pociones de Kakariko# ofrece #[[1]]#. + {}, { + CustomMessage("They say that a #potion seller# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. + + hintTextTable[RHT_KAK_POTION_SHOP_ITEM_6] = HintText(CustomMessage("They say that the #Kakariko Potion Shop# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#apothicaire de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, la #tienda de pociones de Kakariko# ofrece #[[1]]#. + {}, { + CustomMessage("They say that a #potion seller# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. + + hintTextTable[RHT_KAK_POTION_SHOP_ITEM_7] = HintText(CustomMessage("They say that the #Kakariko Potion Shop# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#apothicaire de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, la #tienda de pociones de Kakariko# ofrece #[[1]]#. + {}, { + CustomMessage("They say that a #potion seller# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. + + hintTextTable[RHT_KAK_POTION_SHOP_ITEM_8] = HintText(CustomMessage("They say that the #Kakariko Potion Shop# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#apothicaire de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, la #tienda de pociones de Kakariko# ofrece #[[1]]#. + {}, { + CustomMessage("They say that a #potion seller# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. + + hintTextTable[RHT_MARKET_BOMBCHU_SHOP_ITEM_1] = HintText(CustomMessage("They say that a #Bombchu merchant# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #marchand de Missiles# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #mercader de bombchus# vende #[[1]]#. + + hintTextTable[RHT_MARKET_BOMBCHU_SHOP_ITEM_2] = HintText(CustomMessage("They say that a #Bombchu merchant# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #marchand de Missiles# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #mercader de bombchus# vende #[[1]]#. + + hintTextTable[RHT_MARKET_BOMBCHU_SHOP_ITEM_3] = HintText(CustomMessage("They say that a #Bombchu merchant# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #marchand de Missiles# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #mercader de bombchus# vende #[[1]]#. + + hintTextTable[RHT_MARKET_BOMBCHU_SHOP_ITEM_4] = HintText(CustomMessage("They say that a #Bombchu merchant# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #marchand de Missiles# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #mercader de bombchus# vende #[[1]]#. + + hintTextTable[RHT_MARKET_BOMBCHU_SHOP_ITEM_5] = HintText(CustomMessage("They say that a #Bombchu merchant# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #marchand de Missiles# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #mercader de bombchus# vende #[[1]]#. + + hintTextTable[RHT_MARKET_BOMBCHU_SHOP_ITEM_6] = HintText(CustomMessage("They say that a #Bombchu merchant# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #marchand de Missiles# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #mercader de bombchus# vende #[[1]]#. + + hintTextTable[RHT_MARKET_BOMBCHU_SHOP_ITEM_7] = HintText(CustomMessage("They say that a #Bombchu merchant# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #marchand de Missiles# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #mercader de bombchus# vende #[[1]]#. + + hintTextTable[RHT_MARKET_BOMBCHU_SHOP_ITEM_8] = HintText(CustomMessage("They say that a #Bombchu merchant# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #marchand de Missiles# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #mercader de bombchus# vende #[[1]]#. + + hintTextTable[RHT_MARKET_POTION_SHOP_ITEM_1] = HintText(CustomMessage("They say that the #Market Potion Shop# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#apothicaire dans la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, la #tienda de pociones del mercado# ofrece #[[1]]#. + {}, { + CustomMessage("They say that a #potion seller# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. + + hintTextTable[RHT_MARKET_POTION_SHOP_ITEM_2] = HintText(CustomMessage("They say that the #Market Potion Shop# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#apothicaire dans la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, la #tienda de pociones del mercado# ofrece #[[1]]#. + {}, { + CustomMessage("They say that a #potion seller# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. + + hintTextTable[RHT_MARKET_POTION_SHOP_ITEM_3] = HintText(CustomMessage("They say that the #Market Potion Shop# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#apothicaire dans la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, la #tienda de pociones del mercado# ofrece #[[1]]#. + {}, { + CustomMessage("They say that a #potion seller# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. + + hintTextTable[RHT_MARKET_POTION_SHOP_ITEM_4] = HintText(CustomMessage("They say that the #Market Potion Shop# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#apothicaire dans la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, la #tienda de pociones del mercado# ofrece #[[1]]#. + {}, { + CustomMessage("They say that a #potion seller# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. + + hintTextTable[RHT_MARKET_POTION_SHOP_ITEM_5] = HintText(CustomMessage("They say that the #Market Potion Shop# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#apothicaire dans la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, la #tienda de pociones del mercado# ofrece #[[1]]#. + {}, { + CustomMessage("They say that a #potion seller# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. + + hintTextTable[RHT_MARKET_POTION_SHOP_ITEM_6] = HintText(CustomMessage("They say that the #Market Potion Shop# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#apothicaire dans la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, la #tienda de pociones del mercado# ofrece #[[1]]#. + {}, { + CustomMessage("They say that a #potion seller# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. + + hintTextTable[RHT_MARKET_POTION_SHOP_ITEM_7] = HintText(CustomMessage("They say that the #Market Potion Shop# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#apothicaire dans la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, la #tienda de pociones del mercado# ofrece #[[1]]#. + {}, { + CustomMessage("They say that a #potion seller# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. + + hintTextTable[RHT_MARKET_POTION_SHOP_ITEM_8] = HintText(CustomMessage("They say that the #Market Potion Shop# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#apothicaire dans la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN}), + // /*spanish*/ Según dicen, la #tienda de pociones del mercado# ofrece #[[1]]#. + {}, { + CustomMessage("They say that a #potion seller# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); + // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. + + hintTextTable[RHT_MARKET_BAZAAR_ITEM_1] = HintText(CustomMessage("They say that the #Market Bazaar# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #bazar de la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #bazar del mercado# ofrece #[[1]]#. + + hintTextTable[RHT_MARKET_BAZAAR_ITEM_2] = HintText(CustomMessage("They say that the #Market Bazaar# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #bazar de la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #bazar del mercado# ofrece #[[1]]#. + + hintTextTable[RHT_MARKET_BAZAAR_ITEM_3] = HintText(CustomMessage("They say that the #Market Bazaar# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #bazar de la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #bazar del mercado# ofrece #[[1]]#. + + hintTextTable[RHT_MARKET_BAZAAR_ITEM_4] = HintText(CustomMessage("They say that the #Market Bazaar# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #bazar de la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #bazar del mercado# ofrece #[[1]]#. + + hintTextTable[RHT_MARKET_BAZAAR_ITEM_5] = HintText(CustomMessage("They say that the #Market Bazaar# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #bazar de la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #bazar del mercado# ofrece #[[1]]#. + + hintTextTable[RHT_MARKET_BAZAAR_ITEM_6] = HintText(CustomMessage("They say that the #Market Bazaar# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #bazar de la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #bazar del mercado# ofrece #[[1]]#. + + hintTextTable[RHT_MARKET_BAZAAR_ITEM_7] = HintText(CustomMessage("They say that the #Market Bazaar# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #bazar de la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #bazar del mercado# ofrece #[[1]]#. + + hintTextTable[RHT_MARKET_BAZAAR_ITEM_8] = HintText(CustomMessage("They say that the #Market Bazaar# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #bazar de la Place du Marché# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #bazar del mercado# ofrece #[[1]]#. + + hintTextTable[RHT_KAK_BAZAAR_ITEM_1] = HintText(CustomMessage("They say that the #Kakariko Bazaar# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #bazar de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #bazar de Kakariko# ofrece #[[1]]#. + + hintTextTable[RHT_KAK_BAZAAR_ITEM_2] = HintText(CustomMessage("They say that the #Kakariko Bazaar# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #bazar de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #bazar de Kakariko# ofrece #[[1]]#. + + hintTextTable[RHT_KAK_BAZAAR_ITEM_3] = HintText(CustomMessage("They say that the #Kakariko Bazaar# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #bazar de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #bazar de Kakariko# ofrece #[[1]]#. + + hintTextTable[RHT_KAK_BAZAAR_ITEM_4] = HintText(CustomMessage("They say that the #Kakariko Bazaar# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #bazar de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #bazar de Kakariko# ofrece #[[1]]#. + + hintTextTable[RHT_KAK_BAZAAR_ITEM_5] = HintText(CustomMessage("They say that the #Kakariko Bazaar# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #bazar de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #bazar de Kakariko# ofrece #[[1]]#. + + hintTextTable[RHT_KAK_BAZAAR_ITEM_6] = HintText(CustomMessage("They say that the #Kakariko Bazaar# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #bazar de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #bazar de Kakariko# ofrece #[[1]]#. + + hintTextTable[RHT_KAK_BAZAAR_ITEM_7] = HintText(CustomMessage("They say that the #Kakariko Bazaar# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #bazar de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #bazar de Kakariko# ofrece #[[1]]#. + + hintTextTable[RHT_KAK_BAZAAR_ITEM_8] = HintText(CustomMessage("They say that the #Kakariko Bazaar# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #bazar de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #bazar de Kakariko# ofrece #[[1]]#. + + hintTextTable[RHT_ZD_SHOP_ITEM_1] = HintText(CustomMessage("They say that a #Zora shopkeeper# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #boutique Zora# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #dependiente Zora# vende #[[1]]#. + + hintTextTable[RHT_ZD_SHOP_ITEM_2] = HintText(CustomMessage("They say that a #Zora shopkeeper# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #boutique Zora# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #dependiente Zora# vende #[[1]]#. + + hintTextTable[RHT_ZD_SHOP_ITEM_3] = HintText(CustomMessage("They say that a #Zora shopkeeper# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #boutique Zora# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #dependiente Zora# vende #[[1]]#. + + hintTextTable[RHT_ZD_SHOP_ITEM_4] = HintText(CustomMessage("They say that a #Zora shopkeeper# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #boutique Zora# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #dependiente Zora# vende #[[1]]#. + + hintTextTable[RHT_ZD_SHOP_ITEM_5] = HintText(CustomMessage("They say that a #Zora shopkeeper# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #boutique Zora# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #dependiente Zora# vende #[[1]]#. + + hintTextTable[RHT_ZD_SHOP_ITEM_6] = HintText(CustomMessage("They say that a #Zora shopkeeper# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #boutique Zora# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #dependiente Zora# vende #[[1]]#. + + hintTextTable[RHT_ZD_SHOP_ITEM_7] = HintText(CustomMessage("They say that a #Zora shopkeeper# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #boutique Zora# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #dependiente Zora# vende #[[1]]#. + + hintTextTable[RHT_ZD_SHOP_ITEM_8] = HintText(CustomMessage("They say that a #Zora shopkeeper# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #boutique Zora# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #dependiente Zora# vende #[[1]]#. + + hintTextTable[RHT_GC_SHOP_ITEM_1] = HintText(CustomMessage("They say that a #Goron shopkeeper# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #boutique Goron# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #dependiente Goron# vende #[[1]]#. + + hintTextTable[RHT_GC_SHOP_ITEM_2] = HintText(CustomMessage("They say that a #Goron shopkeeper# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #boutique Goron# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #dependiente Goron# vende #[[1]]#. + + hintTextTable[RHT_GC_SHOP_ITEM_3] = HintText(CustomMessage("They say that a #Goron shopkeeper# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #boutique Goron# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #dependiente Goron# vende #[[1]]#. + + hintTextTable[RHT_GC_SHOP_ITEM_4] = HintText(CustomMessage("They say that a #Goron shopkeeper# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #boutique Goron# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #dependiente Goron# vende #[[1]]#. + + hintTextTable[RHT_GC_SHOP_ITEM_5] = HintText(CustomMessage("They say that a #Goron shopkeeper# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #boutique Goron# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #dependiente Goron# vende #[[1]]#. + + hintTextTable[RHT_GC_SHOP_ITEM_6] = HintText(CustomMessage("They say that a #Goron shopkeeper# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #boutique Goron# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #dependiente Goron# vende #[[1]]#. + + hintTextTable[RHT_GC_SHOP_ITEM_7] = HintText(CustomMessage("They say that a #Goron shopkeeper# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #boutique Goron# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #dependiente Goron# vende #[[1]]#. + + hintTextTable[RHT_GC_SHOP_ITEM_8] = HintText(CustomMessage("They say that a #Goron shopkeeper# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #boutique Goron# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, el #dependiente Goron# vende #[[1]]#. + + hintTextTable[RHT_HF_DEKU_SCRUB_GROTTO] = HintText(CustomMessage("They say that a lonely #scrub in a hole# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #peste Mojo dans une grotte de la plaine# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #singular deku bajo un hoyo# de la llanura vende #[[1]]#. + + hintTextTable[RHT_LLR_DEKU_SCRUB_GROTTO_LEFT] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #trio de peste Mojo à la ferme# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #trío de dekus# de una granja venden #[[1]]#. + + hintTextTable[RHT_LLR_DEKU_SCRUB_GROTTO_RIGHT] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #trio de peste Mojo à la ferme# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #trío de dekus# de una granja venden #[[1]]#. + + hintTextTable[RHT_LLR_DEKU_SCRUB_GROTTO_CENTER] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #trio de peste Mojo à la ferme# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #trío de dekus# de una granja venden #[[1]]#. + + hintTextTable[RHT_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT] = HintText(CustomMessage("They say that a pair of #scrubs in the woods# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #duo de peste Mojo près du théâtre# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un par de #dekus del bosque# venden #[[1]]#. + + hintTextTable[RHT_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT] = HintText(CustomMessage("They say that a pair of #scrubs in the woods# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #duo de peste Mojo près du théâtre# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un par de #dekus del bosque# venden #[[1]]#. + + hintTextTable[RHT_LW_DEKU_SCRUB_NEAR_BRIDGE] = HintText(CustomMessage("They say that a #scrub by a bridge# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #peste Mojo près du pont dans les bois# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #deku bajo un puente# del bosque venden #[[1]]#. + + hintTextTable[RHT_LW_DEKU_SCRUB_GROTTO_REAR] = HintText(CustomMessage("They say that a #scrub underground duo# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #duo de peste Mojo dans les sous-bois# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #par de dekus subterráneos# del bosque venden #[[1]]#. + + hintTextTable[RHT_LW_DEKU_SCRUB_GROTTO_FRONT] = HintText(CustomMessage("They say that a #scrub underground duo# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #duo de peste Mojo dans les sous-bois# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #par de dekus subterráneos# del bosque venden #[[1]]#. + + hintTextTable[RHT_SFM_DEKU_SCRUB_GROTTO_REAR] = HintText(CustomMessage("They say that a #scrub underground duo# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #duo de peste Mojo au cœur du sanctuaire sylvestre# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #par de dekus subterráneos# de la pradera sagrada venden #[[1]]#. + + hintTextTable[RHT_SFM_DEKU_SCRUB_GROTTO_FRONT] = HintText(CustomMessage("They say that a #scrub underground duo# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #duo de peste Mojo au cœur du sanctuaire sylvestre# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #par de dekus subterráneos# de la pradera sagrada venden #[[1]]#. + + hintTextTable[RHT_GC_DEKU_SCRUB_GROTTO_LEFT] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #trio de peste Mojo dans le village Goron# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #trío de dekus# de la Ciudad Goron venden #[[1]]#. + + hintTextTable[RHT_GC_DEKU_SCRUB_GROTTO_RIGHT] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #trio de peste Mojo dans le village Goron# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #trío de dekus# de la Ciudad Goron venden #[[1]]#. + + hintTextTable[RHT_GC_DEKU_SCRUB_GROTTO_CENTER] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #trio de peste Mojo dans le village Goron# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #trío de dekus# de la Ciudad Goron venden #[[1]]#. + + hintTextTable[RHT_DMC_DEKU_SCRUB_GROTTO_LEFT] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #trio de peste Mojo dans le volcan# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #trío de dekus# del volcán venden #[[1]]#. + + hintTextTable[RHT_DMC_DEKU_SCRUB_GROTTO_RIGHT] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #trio de peste Mojo dans le volcan# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #trío de dekus# del volcán venden #[[1]]#. + + hintTextTable[RHT_DMC_DEKU_SCRUB_GROTTO_CENTER] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #trio de peste Mojo dans le volcan# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #trío de dekus# del volcán venden #[[1]]#. + + hintTextTable[RHT_ZR_DEKU_SCRUB_GROTTO_REAR] = HintText(CustomMessage("They say that a #scrub underground duo# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #duo de peste Mojo près du fleuve# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #par de dekus subterráneos# del río venden #[[1]]#. + + hintTextTable[RHT_ZR_DEKU_SCRUB_GROTTO_FRONT] = HintText(CustomMessage("They say that a #scrub underground duo# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #duo de peste Mojo près du fleuve# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #par de dekus subterráneos# del río venden #[[1]]#. + + hintTextTable[RHT_LH_DEKU_SCRUB_GROTTO_LEFT] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #trio de peste Mojo près du lac# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #trío de dekus# del lago venden #[[1]]#. + + hintTextTable[RHT_LH_DEKU_SCRUB_GROTTO_RIGHT] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #trio de peste Mojo près du lac# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #trío de dekus# del lago venden #[[1]]#. + + hintTextTable[RHT_LH_DEKU_SCRUB_GROTTO_CENTER] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #trio de peste Mojo près du lac# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #trío de dekus# del lago venden #[[1]]#. + + hintTextTable[RHT_GV_DEKU_SCRUB_GROTTO_REAR] = HintText(CustomMessage("They say that a #scrub underground duo# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #duo de peste Mojo près de la vallée# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #par de dekus subterráneos# del valle venden #[[1]]#. + + hintTextTable[RHT_GV_DEKU_SCRUB_GROTTO_FRONT] = HintText(CustomMessage("They say that a #scrub underground duo# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #duo de peste Mojo près de la vallée# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #par de dekus subterráneos# del valle venden #[[1]]#. + + hintTextTable[RHT_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT] = HintText(CustomMessage("They say that a #scrub underground duo# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #duo de peste Mojo dans le désert# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #par de dekus subterráneos# del desierto venden #[[1]]#. + + hintTextTable[RHT_COLOSSUS_DEKU_SCRUB_GROTTO_REAR] = HintText(CustomMessage("They say that a #scrub underground duo# sells #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, le #duo de peste Mojo dans le désert# vend #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, un #par de dekus subterráneos# del desierto venden #[[1]]#. + + hintTextTable[RHT_LLR_STABLES_LEFT_COW] = HintText(CustomMessage("They say that a #cow in a stable# gifts #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #vache dans l'étable# donne #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #vaca del establo# brinda #[[1]]#. + + hintTextTable[RHT_LLR_STABLES_RIGHT_COW] = HintText(CustomMessage("They say that a #cow in a stable# gifts #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #vache dans l'étable# donne #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #vaca del establo# brinda #[[1]]#. + + hintTextTable[RHT_LLR_TOWER_RIGHT_COW] = HintText(CustomMessage("They say that a #cow in a ranch silo# gifts #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #vache dans le silo de la ferme# donne #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #vaca del granero# brinda #[[1]]#. + + hintTextTable[RHT_LLR_TOWER_LEFT_COW] = HintText(CustomMessage("They say that a #cow in a ranch silo# gifts #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #vache dans le silo de la ferme# donne #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #vaca del granero# brinda #[[1]]#. + + hintTextTable[RHT_KAK_IMPAS_HOUSE_COW] = HintText(CustomMessage("They say that a #cow imprisoned in a house# protects #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #vache en cage# donne #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #vaca enjaulada de una casa# brinda #[[1]]#. + + hintTextTable[RHT_DMT_COW_GROTTO_COW] = HintText(CustomMessage("They say that a #cow in a luxurious hole# offers #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, la #vache dans une grotte luxueuse# donne #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #vaca de un lujoso hoyo# brinda #[[1]]#. + + hintTextTable[RHT_BEEHIVE_CHEST_GROTTO] = HintText(CustomMessage("They say that a #beehive above a chest# hides #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #colmena sobre un cofre# esconde #[[1]]#. + + hintTextTable[RHT_BEEHIVE_LONELY_SCRUB_GROTTO] = HintText(CustomMessage("They say that a #beehive above a lonely scrub# hides #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #colmena sobre un deku solitario# esconde #[[1]]#. + + hintTextTable[RHT_BEEHIVE_SCRUB_PAIR_GROTTO] = HintText(CustomMessage("They say that a #beehive above a pair of scrubs# hides #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #colmena sobre un par de dekus# esconde #[[1]]#. + + hintTextTable[RHT_BEEHIVE_SCRUB_TRIO_GROTTO] = HintText(CustomMessage("They say that a #beehive above a trio of scrubs# hides #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #colmena sobre un trío de dekus# esconde #[[1]]#. + + hintTextTable[RHT_BEEHIVE_COW_GROTTO] = HintText(CustomMessage("They say that a #beehive above a cow# hides #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #colmena sobre una vaca# esconde #[[1]]#. + + hintTextTable[RHT_BEEHIVE_IN_FRONT_OF_KING_ZORA] = HintText(CustomMessage("They say that a #beehive in front of the king of the zoras# hides #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #colmena delante del rey de los zoras# esconde #[[1]]#. + + hintTextTable[RHT_BEEHIVE_BEHIND_KING_ZORA] = HintText(CustomMessage("They say that a #beehive behind the king of the zoras# hides #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #colmena detrás del rey de los zoras# esconde #[[1]]#. +} } \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp index be20b95a3..e99b6fd71 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp @@ -1,2142 +1,2084 @@ -#include "../hint_list.hpp" - -void HintTable_Init_Item() { - hintTable[RHT_KOKIRI_SWORD] = HintText::Item({ - //obscure text - Text{"a butter knife", /*french*/"un couteau à beurre", /*spanish*/"un ágil puñal"}, - Text{"a starter slasher", /*french*/"une arme de débutant", /*spanish*/"una hoja de principiantes"}, - Text{"a switchblade", /*french*/"un canif", /*spanish*/"una navaja"}, - }, { - //ambiguous text - Text{"a sword", /*french*/"une épée", /*spanish*/"una espada"}, - }, - //clear text - Text{"the Kokiri Sword", /*french*/"l'Épée Kokiri", /*spanish*/"la Espada Kokiri"} - ); - - hintTable[RHT_MASTER_SWORD] = HintText::Item({ - //obscure text - Text{"evil's bane", /*french*/"le fléau du mal", /*spanish*/"la destructora del mal"}, - Text{"a seven year limbo", /*french*/"une stase de sept ans", /*spanish*/"unos siete años de espera"}, - }, { - //ambiguous text - Text{"a sword", /*french*/"une épée", /*spanish*/"una espada"}, - }, - //clear text - Text{"the Master Sword", /*french*/"l'Épée de Légende", /*spanish*/"la Espada Maestra"} - ); - - hintTable[RHT_GIANTS_KNIFE] = HintText::Item({ - //obscure text - Text{"a fragile blade", /*french*/"une lame fragile", /*spanish*/"una frágil hoja"}, - Text{"a breakable cleaver", /*french*/"un espadon de verre", /*spanish*/"un rompible acero"}, - }, { - //ambiguous text - Text{"a sword", /*french*/"une épée", /*spanish*/"una espada"}, - }, - //clear text - Text{"the Giant's Knife", /*french*/"la Lame des Géants", /*spanish*/"la daga gigante"} - ); - - hintTable[RHT_BIGGORON_SWORD] = HintText::Item({ - //obscure text - Text{"the biggest blade", /*french*/"une lame gigantesque", /*spanish*/"el mayor mandoble"}, - Text{"a colossal cleaver", /*french*/"un espadon colossal", /*spanish*/"un estoque colosal"}, - }, { - //ambiguous text - Text{"a sword", /*french*/"une épée", /*spanish*/"una espada"}, - }, - //clear text - Text{"the Biggoron Sword", /*french*/"l'Épée de Biggoron", /*spanish*/"la Espada de Biggoron"} - ); - - hintTable[RHT_DEKU_SHIELD] = HintText::Item({ - //obscure text - Text{"a wooden ward", /*french*/"un écu d'écorce", /*spanish*/"una protección del bosque"}, - Text{"a burnable barrier", /*french*/"une protection inflammable", /*spanish*/"una barrera quemable"}, - }, { - //ambiguous text - Text{"a shield", /*french*/"un bouclier", /*spanish*/"un escudo"}, - }, - //clear text - Text{"a Deku Shield", /*french*/"un Bouclier Mojo", /*spanish*/"un escudo deku"} - ); - - hintTable[RHT_HYLIAN_SHIELD] = HintText::Item({ - //obscure text - Text{"a steel safeguard", /*french*/"une carapace d'acier", /*spanish*/"una protección de acero"}, - Text{"Like Like's metal meal", /*french*/"un amuse-gueule de Pudding", /*spanish*/"un alimento de Like Like"}, - }, { - //ambiguous text - Text{"a shield", /*french*/"un bouclier", /*spanish*/"un escudo"}, - }, - //clear text - Text{"a Hylian Shield", /*french*/"un Bouclier Hylien", /*spanish*/"un escudo hyliano"} - ); - - hintTable[RHT_MIRROR_SHIELD] = HintText::Item({ - //obscure text - Text{"a reflective rampart", /*french*/"un capteur de lumière", /*spanish*/"una muralla reflectora"}, - Text{"Medusa's weakness", /*french*/"la faiblesse de Méduse", /*spanish*/"la debilidad de Medusa"}, - Text{"a silvered surface", /*french*/"une surface argentée", /*spanish*/"una superficie plateada"}, - }, { - //ambiguous text - Text{"a shield", /*french*/"un bouclier", /*spanish*/"un escudo"}, - }, - //clear text - Text{"the Mirror Shield", /*french*/"le Bouclier Miroir", /*spanish*/"el escudo espejo"} - ); - - hintTable[RHT_GORON_TUNIC] = HintText::Item({ - //obscure text - Text{"ruby robes", /*french*/"un pigment rouge", /*spanish*/"una vestimenta rubí"}, - Text{"fireproof fabric", /*french*/"un trésor anti-flamme", /*spanish*/"una ignífuga prenda"}, - Text{"cooking clothes", /*french*/"une tenue de cuisine", /*spanish*/"unos abrasantes ropajes"}, - }, { - //ambiguous text - Text{"a tunic", /*french*/"une tunique", /*spanish*/"un sayo"}, - }, - //clear text - Text{"a Goron Tunic", /*french*/"une Tunique Goron", /*spanish*/"un sayo goron"} - ); - - hintTable[RHT_ZORA_TUNIC] = HintText::Item({ - //obscure text - Text{"a sapphire suit", /*french*/"un pigment bleuté", /*spanish*/"una vestidura zafiro"}, - Text{"scuba gear", /*french*/"un habit de plongée", /*spanish*/"un traje impermeable"}, - Text{"a swimsuit", /*french*/"un costume de baignade", /*spanish*/"unos ropajes sumergibles"}, - }, { - //ambiguous text - Text{"a tunic", /*french*/"une tunique", /*spanish*/"un sayo"}, - Text{"something expensive", /*french*/"une chose dispendieuse", /*spanish*/"algo caro"}, - }, - //clear text - Text{"a Zora Tunic", /*french*/"une Tunique Zora", /*spanish*/"un sayo zora"} - ); - - hintTable[RHT_IRON_BOOTS] = HintText::Item({ - //obscure text - Text{"sink shoes", /*french*/"un boulet de fer", /*spanish*/"un calzado de las profundidades"}, - Text{"clank cleats", /*french*/"une paire de talons bruyants", /*spanish*/"unas suelas férreas"}, - }, { - //ambiguous text - Text{"some boots", /*french*/"une paire de bottes", /*spanish*/"un par de botas"}, - Text{"a feature of the Water Temple", /*french*/"une particularité du Temple de l'Eau", /*spanish*/"algo particular del Templo del Agua"}, - Text{"something heavy", /*french*/"une chose pesante", /*spanish*/"algo de lo más pesado"}, - }, - //clear text - Text{"the Iron Boots", /*french*/"une paire de Bottes de plomb", /*spanish*/"las botas de hierro"} - ); - - hintTable[RHT_HOVER_BOOTS] = HintText::Item({ - //obscure text - Text{"butter boots", /*french*/"une paire de patins de beurre", /*spanish*/"unas suelas resvaladizas"}, - Text{"sacred slippers", /*french*/"une paire de pantoufles sacrées", /*spanish*/"unos escurridizos botines"}, - Text{"spacewalkers", /*french*/"une paire de bottes spatiales", /*spanish*/"un calzado antigravitatorio"}, - }, { - //ambiguous text - Text{"some boots", /*french*/"une paire de bottes", /*spanish*/"un par de botas"}, - }, - //clear text - Text{"the Hover Boots", /*french*/"une paire de Bottes des airs", /*spanish*/"las botas voladoras"} - ); - - - hintTable[RHT_ZELDAS_LETTER] = HintText::Item({ - //obscure text - Text{"an autograph", /*french*/"un autographe", /*spanish*/"un autógrafo"}, - Text{"royal stationery", /*french*/"du papier royal", /*spanish*/"un escrito real"}, - Text{"royal snail mail", /*french*/"une enveloppe royale", /*spanish*/"correo de la realeza"}, - }, {}, - //clear text - Text{"Zelda's Letter", /*french*/"la Lettre de Zelda", /*spanish*/"la carta de Zelda"} - ); - - hintTable[RHT_WEIRD_EGG] = HintText::Item({ - //obscure text - Text{"a chicken dilemma", /*french*/"un drôle d'ovale", /*spanish*/"el dilema de la gallina"}, - }, { - //ambiguous text - Text{"an egg", /*french*/"un oeuf", /*spanish*/"un huevo"}, - }, - //clear text - Text{"the Weird Egg", /*french*/"l'Oeuf Curieux", /*spanish*/"el huevo extraño"} - ); - - hintTable[RHT_BOOMERANG] = HintText::Item({ - //obscure text - Text{"a banana", /*french*/"une banane", /*spanish*/"un plátano"}, - Text{"a stun stick", /*french*/"un bâton étourdissant", /*spanish*/"un palo aturdidor"}, - Text{"a yellow angle", /*french*/"un angle jaune", /*spanish*/"un ángulo amarillo"}, - }, { - //ambiguous text - Text{"something that can grab things", /*french*/"une chose qui peut attraper", /*spanish*/"algo que pueda agarrar cosas"}, - Text{"something that can stun", /*french*/"une chose qui peut paralyser", /*spanish*/"algo que pueda paralizar"}, - }, - //clear text - Text{"the Boomerang", /*french*/"le Boomerang", /*spanish*/"el bumerán"} - ); - - hintTable[RHT_LENS_OF_TRUTH] = HintText::Item({ - //obscure text - Text{"a lie detector", /*french*/"un détecteur de mensonges", /*spanish*/"el detector de ilusiones"}, - Text{"a ghost tracker", /*french*/"un trouve-fantôme", /*spanish*/"el rastreador paranormal"}, - Text{"true sight", /*french*/"le troisième œil", /*spanish*/"el ojo que todo ve"}, - Text{"a detective's tool", /*french*/"un trésor Sheikah", /*spanish*/"la revelación verdadera"}, - }, { - //ambiguous text - Text{"a secret-finding tool", /*french*/"un cherche-secrets", /*spanish*/"un instrumento para hallar objetos"}, - }, - //clear text - Text{"the Lens of Truth", /*french*/"le Monocle de Vérité", /*spanish*/"la Lupa de la Verdad"} - ); - - hintTable[RHT_MEGATON_HAMMER] = HintText::Item({ - //obscure text - Text{"the dragon smasher", /*french*/"le tueur de dragons", /*spanish*/"un destructor de dragones"}, - Text{"the metal mallet", /*french*/"un outil de construction", /*spanish*/"un mazo de metal"}, - Text{"the heavy hitter", /*french*/"un poids lourd", /*spanish*/"un machacador"}, - }, { - //ambiguous text - Text{"something that can remove boulders", /*french*/"une chose qui enlève les rochers", /*spanish*/"algo que pueda quitar rocas"}, - }, - //clear text - Text{"the Megaton Hammer", /*french*/"la Masse des Titans", /*spanish*/"el martillo Megatón"} - ); - - hintTable[RHT_STONE_OF_AGONY] = HintText::Item({ - //obscure text - Text{"the shake stone", /*french*/"le fragment vibrant", /*spanish*/"el fragmento tintineante"}, - Text{"a gray alarm", /*french*/"une alerte bleue", /*spanish*/"una azul alarma"}, - }, { - //ambiguous text - Text{"a prize of the House of Skulltulas", /*french*/"un prix de la maison des Skulltulas", /*spanish*/"un obsequio de la Casa Skulltula"}, - Text{"a secret-finding tool", /*french*/"un cherche-secrets", /*spanish*/"un instrumento para hallar objetos"}, - }, - //clear text - Text{"the Stone of Agony", /*french*/"la Pierre de Souffrance", /*spanish*/"la Piedra de la Agonía"} - ); - - hintTable[RHT_DINS_FIRE] = HintText::Item({ - //obscure text - Text{"an inferno", /*french*/"un brasier", /*spanish*/"un incendio"}, - Text{"a heat wave", /*french*/"une vague de chaleur", /*spanish*/"una onda de calor"}, - Text{"a red ball", /*french*/"une explosion de flammes", /*spanish*/"una roja esfera"}, - }, { - //ambiguous text - Text{"a Great Fairy's power", /*french*/"le pouvoir d'une grande fée", /*spanish*/"el poder de una Gran Hada"}, - }, - //clear text - Text{"Din's Fire", /*french*/"le Feu de Din", /*spanish*/"el Fuego de Din"} - ); - - hintTable[RHT_FARORES_WIND] = HintText::Item({ - //obscure text - Text{"teleportation", /*french*/"la téléportation", /*spanish*/"un teletransportador"}, - Text{"a relocation rune", /*french*/"une rune de relocation", /*spanish*/"una runa de transporte"}, - Text{"a green ball", /*french*/"une boule verte", /*spanish*/"una verde esfera"}, - }, { - //ambiguous text - Text{"a Great Fairy's power", /*french*/"le pouvoir d'une grande fée", /*spanish*/"el poder de una Gran Hada"}, - }, - //clear text - Text{"Farore's Wind", /*french*/"le Vent de Farore", /*spanish*/"el Viento de Farore"} - ); - - hintTable[RHT_NAYRUS_LOVE] = HintText::Item({ - //obscure text - Text{"a safe space", /*french*/"une bulle de cristal", /*spanish*/"una seguridad temporal"}, - Text{"an impregnable aura", /*french*/"un aura impénétrable", /*spanish*/"un aura impenetrable"}, - Text{"a blue barrier", /*french*/"une toison bleu", /*spanish*/"una barrera azul"}, - }, { - //ambiguous text - Text{"a Great Fairy's power", /*french*/"le pouvoir d'une grande fée", /*spanish*/"el poder de una Gran Hada"}, - }, - //clear text - Text{"Nayru's Love", /*french*/"l'Amour de Nayru", /*spanish*/"el Amor de Nayru"} - ); - - hintTable[RHT_FIRE_ARROWS] = HintText::Item({ - //obscure text - Text{"the furnace firearm" , /*french*/"une fusée solaire", /*spanish*/"el ardiente aguijón"}, - Text{"the burning bolts", /*french*/"un obus enflammé", /*spanish*/"las puntas ígneas"}, - Text{"a magma missile", /*french*/"un missile volcanique", /*spanish*/"el misil abrasador"}, - }, { - //ambiguous text - Text{"a magic arrow", /*french*/"une flèche magique", /*spanish*/"una flecha mágica"}, - }, - //clear text - Text{"the Fire Arrows", /*french*/"les Flèches de Feu", /*spanish*/"la flecha de fuego"} - ); - - hintTable[RHT_ICE_ARROWS] = HintText::Item({ - //obscure text - Text{"the refrigerator rocket", /*french*/"un missile pétrifiant", /*spanish*/"el misil congelador"}, - Text{"the frostbite bolts", /*french*/"un froid mordant", /*spanish*/"las puntas gélidas"}, - Text{"an iceberg maker", /*french*/"une aiguille glaciale", /*spanish*/"el control de escarcha"}, - }, { - //ambiguous text - Text{"a magic arrow", /*french*/"une flèche magique", /*spanish*/"una flecha mágica"}, - Text{"something that can stun", /*french*/"une chose qui peut paralyser", /*spanish*/"algo que pueda paralizar"}, - }, - //clear text - Text{"the Ice Arrows", /*french*/"les Flèches de Glace", /*spanish*/"la flecha de hielo"} - ); - - hintTable[RHT_LIGHT_ARROWS] = HintText::Item({ - //obscure text - Text{"the shining shot", /*french*/"l'arme brillante", /*spanish*/"el haz de luz"}, - Text{"the luminous launcher", /*french*/"un jet de lumière", /*spanish*/"el disparo luminoso"}, - Text{"Ganondorf's bane", /*french*/"le fléau de Ganondorf", /*spanish*/"la perdición de Ganondorf"}, - Text{"the lighting bolts", /*french*/"l'éclair sacré", /*spanish*/"las puntas resplandecientes"}, - }, { - //ambiguous text - Text{"a magic arrow", /*french*/"une flèche magique", /*spanish*/"una flecha mágica"}, - }, - //clear text - Text{"the Light Arrows", /*french*/"les Flèches de Lumière", /*spanish*/"la flecha de luz"} - ); - - hintTable[RHT_GERUDO_MEMBERSHIP_CARD] = HintText::Item({ - //obscure text - Text{"a girl club membership", /*french*/"une carte de membre", /*spanish*/"una fémina membresía"}, - Text{"a desert tribe's pass", /*french*/"un laissez-passer", /*spanish*/"el vale del desierto"}, - }, { - Text{"a token of recognition", /*french*/"une preuve de reconnaissance", /*spanish*/"una prueba de reconocimiento"}, - }, - //clear text - Text{"the Gerudo Membership Card", /*french*/"la Carte Gerudo", /*spanish*/"el pase de socio gerudo"} - ); - - hintTable[RHT_MAGIC_BEAN] = HintText::Item({ - //obscure text - Text{"a wizardly legume", /*french*/"un légume ensorcelé", /*spanish*/"una legumbre hechizada"}, - }, { - //ambiguous text - Text{"something sometimes buried", /*french*/"une chose parfois enterrée", /*spanish*/"algo a veces enterrado"}, - }, - //clear text - Text{"a Magic Bean", /*french*/"un Haricot Magique", /*spanish*/"una judía mágica"} - ); - - hintTable[RHT_MAGIC_BEAN_PACK] = HintText::Item({ - //obscure text - Text{"wizardly legumes", /*french*/"un paquet de légumes ensorcelés", /*spanish*/"unas legumbres hechizadas"}, - }, { - //ambiguous text - Text{"something sometimes buried", /*french*/"une chose parfois enterrée", /*spanish*/"algo a veces enterrado"}, - }, - //clear text - Text{"Magic Beans", /*french*/"un Paquet de Haricots Magiques", /*spanish*/"unas judías mágicas"} - ); - - hintTable[RHT_DOUBLE_DEFENSE] = HintText::Item({ - //obscure text - Text{"a white outline", /*french*/"un rebord blanc", /*spanish*/"un contorno blanco"}, - Text{"damage decrease", /*french*/"une protection supplémentaire", /*spanish*/"una reducción de daño"}, - Text{"strengthened love", /*french*/"un amour coriace", /*spanish*/"un amor fortalecido"}, - }, { - //ambiguous text - Text{"a Great Fairy's power", /*french*/"le pouvoir d'une grande fée", /*spanish*/"el poder de una Gran Hada"}, - Text{"something heart-shaped", /*french*/"une chose en forme de coeur", /*spanish*/"algo con forma de corazón"}, - }, - //clear text - Text{"Double Defense", /*french*/"la Double Défence", /*spanish*/"la doble defensa"} - ); - - hintTable[RHT_GOLD_SKULLTULA_TOKEN] = HintText::Item({ - //obscure text - Text{"proof of destruction", /*french*/"un certificat d'élimination", /*spanish*/"una prueba de la destrucción"}, - Text{"an arachnid chip", /*french*/"un symbole cranien", /*spanish*/"una figura arácnida"}, - Text{"spider remains", /*french*/"une dépouille dorée", /*spanish*/"unos restos dorados"}, - Text{"one percent of a curse", /*french*/"un centième de malédiction", /*spanish*/"una centésima de una maldición"}, - }, { - //ambiguous text - Text{"a token of recognition", /*french*/"une preuve de reconnaissance", /*spanish*/"una prueba de reconocimiento"}, - Text{"something sometimes buried", /*french*/"une chose parfois enterrée", /*spanish*/"algo a veces enterrado"}, - }, - //clear text - Text{"a Gold Skulltula Token", /*french*/"un Symbole de Skulltula d'or", /*spanish*/"un símbolo de skulltula dorada"} - ); - - hintTable[RHT_POCKET_EGG] = HintText::Item({ - //obscure text - Text{"a Cucco container", /*french*/"un réservoir à Cocotte", /*spanish*/"cuco contenido"}, - Text{"a Cucco, eventually", /*french*/"un poussin éventuel", /*spanish*/"un futuro cuco"}, - Text{"a fowl youth", /*french*/"une omelette crue", /*spanish*/"una dulce juventud"}, - }, { - //ambiguous text - Text{"a trade quest item", /*french*/"un objet de quête d'échanges", /*spanish*/"un objeto de una misión secundaria"}, - Text{"an egg", /*french*/"un oeuf", /*spanish*/"un huevo"}, - }, - //clear text - Text{"the Pocket Egg", /*french*/"l'Oeuf de Poche", /*spanish*/"el huevo de bolsillo"} - ); - - hintTable[RHT_POCKET_CUCCO] = HintText::Item({ - //obscure text - Text{"a little clucker", /*french*/"un petit glousseur", /*spanish*/"un pollito chiquito"}, - }, { - //ambiguous text - Text{"a trade quest item", /*french*/"un objet de quête d'échanges", /*spanish*/"un objeto de una misión secundaria"}, - }, - //clear text - Text{"the Pocket Cucco", /*french*/"la Cocotte de Poche", /*spanish*/"el cuco de bolsillo"} - ); - - hintTable[RHT_COJIRO] = HintText::Item({ - //obscure text - Text{"a cerulean capon", /*french*/"un paon azur", /*spanish*/"un cerúleo capón"}, - }, { - //ambiguous text - Text{"a trade quest item", /*french*/"un objet de quête d'échanges", /*spanish*/"un objeto de una misión secundaria"}, - }, - //clear text - Text{"Cojiro", /*french*/"le p'tit poulet", /*spanish*/"a Cojiro"} - ); - - hintTable[RHT_ODD_MUSHROOM] = HintText::Item({ - //obscure text - Text{"a powder ingredient", /*french*/"un ingrédient à poudre", /*spanish*/"un oloroso ingrediente"}, - }, { - //ambiguous text - Text{"a trade quest item", /*french*/"un objet de quête d'échanges", /*spanish*/"un objeto de una misión secundaria"}, - }, - //clear text - Text{"an Odd Mushroom", /*french*/"un Champignon Suspect", /*spanish*/"un champiñón extraño"} - ); - - hintTable[RHT_ODD_POTION] = HintText::Item({ - //obscure text - Text{"Granny's goodies", /*french*/"la confiserie de mamie", /*spanish*/"la especialidad de la abuela"}, - }, { - //ambiguous text - Text{"something that contains medicine", /*french*/"une chose médicamenteuse", /*spanish*/"algo que contenga medicina"}, - Text{"something with a strange smell", /*french*/"une chose qui sent bizarre", /*spanish*/"algo con un olor extraño"}, - Text{"a trade quest item", /*french*/"un objet de quête d'échanges", /*spanish*/"un objeto de una misión secundaria"}, - }, - //clear text - Text{"an Odd Potion", /*french*/"une Mixture Suspecte", /*spanish*/"una medicina rara"} - ); - - hintTable[RHT_POACHERS_SAW] = HintText::Item({ - //obscure text - Text{"a tree killer", /*french*/"un coupeur d'arbres", /*spanish*/"un destructor de árboles"}, - }, { - //ambiguous text - Text{"a trade quest item", /*french*/"un objet de quête d'échanges", /*spanish*/"un objeto de una misión secundaria"}, - }, - //clear text - Text{"the Poacher's Saw", /*french*/"la Scie du Chasseur", /*spanish*/"la sierra del furtivo"} - ); - - hintTable[RHT_BROKEN_SWORD] = HintText::Item({ - //obscure text - Text{"a shattered slicer", /*french*/"une arme cassée", /*spanish*/"una rebanadora rota"}, - }, { - //ambiguous text - Text{"a trade quest item", /*french*/"un objet de quête d'échanges", /*spanish*/"un objeto de una misión secundaria"}, - Text{"a sword", /*french*/"une épée", /*spanish*/"una espada"}, - }, - //clear text - Text{"the Broken Goron's Sword", /*french*/"l'Épée Brisée de Goron", /*spanish*/"la espada goron rota"} - ); - - hintTable[RHT_PRESCRIPTION] = HintText::Item({ - //obscure text - Text{"a pill pamphlet", /*french*/"un document urgent", /*spanish*/"un instructivo medicinal"}, - Text{"a doctor's note", /*french*/"un papier médical", /*spanish*/"unas notas del doctor"}, - }, { - //ambiguous text - Text{"a trade quest item", /*french*/"un objet de quête d'échanges", /*spanish*/"un objeto de una misión secundaria"}, - }, - //clear text - Text{"the Prescription", /*french*/"une Ordonnance", /*spanish*/"la receta"} - ); - - hintTable[RHT_EYEBALL_FROG] = HintText::Item({ - //obscure text - Text{"a perceiving polliwog", /*french*/"un amphibien", /*spanish*/"un variopinto batracio"}, - }, { - //ambiguous text - Text{"a trade quest item", /*french*/"un objet de quête d'échanges", /*spanish*/"un objeto de una misión secundaria"}, - }, - //clear text - Text{"the Eyeball Frog", /*french*/"le Crapaud-qui-louche", /*spanish*/"la rana de ojos saltones"} - ); - - hintTable[RHT_EYEDROPS] = HintText::Item({ - //obscure text - Text{"a vision vial", /*french*/"une solution oculaire", /*spanish*/"un remedio para la vista"}, - }, { - //ambiguous text - Text{"a trade quest item", /*french*/"un objet de quête d'échanges", /*spanish*/"un objeto de una misión secundaria"}, - }, - //clear text - Text{"the Eyedrops", /*french*/"une phiole de Super-Gouttes", /*spanish*/"las supergotas oculares"} - ); - - hintTable[RHT_CLAIM_CHECK] = HintText::Item({ - //obscure text - Text{"a three day wait", /*french*/"un rendez-vous dans trois jours", /*spanish*/"unos tres días de espera"}, - }, { - //ambiguous text - Text{"a trade quest item", /*french*/"un objet de quête d'échanges", /*spanish*/"un objeto de una misión secundaria"}, - }, - //clear text - Text{"the Claim Check", /*french*/"un Certificat", /*spanish*/"el recibo"} - ); - - hintTable[RHT_PROGRESSIVE_HOOKSHOT] = HintText::Item({ - //obscure text - Text{"Dampé's keepsake", /*french*/"l'héritage d'Igor", /*spanish*/"un recuerdo de Dampé"}, - Text{"the Grapple Beam", /*french*/"le rayon grippeur", /*spanish*/"una garra metálica"}, - Text{"the RHT_BOING! chain", /*french*/"la chaîne de RHT_BOING!", /*spanish*/"una cadena retráctil"}, - }, { - //ambiguous text - Text{"something that can grab things", /*french*/"une chose qui peut attraper", /*spanish*/"algo que pueda agarrar cosas"}, - Text{"something that can stun", /*french*/"une chose qui peut paralyser", /*spanish*/"algo que pueda paralizar"}, - }, - //clear text - Text{"a Hookshot", /*french*/"un Grappin", /*spanish*/"un gancho"} - ); - - hintTable[RHT_PROGRESSIVE_STRENGTH] = HintText::Item({ - //obscure text - Text{"power gloves", /*french*/"une paire de gants de travail", /*spanish*/"unos poderosos guanteletes"}, - Text{"metal mittens", /*french*/"une paire de mitaines", /*spanish*/"unas manoplas metálicas"}, - Text{"the heavy lifty", /*french*/"la puissance de dix hommes", /*spanish*/"un levantamiento pesado"}, - }, { - //ambiguous text - Text{"something that can remove boulders", /*french*/"une chose qui enlève les rochers", /*spanish*/"algo que pueda quitar rocas"}, - }, - //clear text - Text{"a Strength Upgrade", /*french*/"une Amélioration de Force", /*spanish*/"un aumento de fuerza"} - ); - - hintTable[RHT_PROGRESSIVE_BOMB_BAG] = HintText::Item({ - //obscure text - Text{"an explosive container", /*french*/"un porte-grenade", /*spanish*/"un recipiente explosivo"}, - Text{"a blast bag", /*french*/"un estomac de Dodongo", /*spanish*/"un zurrón de estallidos"}, - }, { - //ambiguous text - Text{"explosives", /*french*/"un paquet d'explosifs", /*spanish*/"un montón de explosivos"}, - Text{"something that can remove boulders", /*french*/"une chose qui enlève les rochers", /*spanish*/"algo que pueda quitar rocas"}, - }, - //clear text - Text{"a Bomb Bag", /*french*/"un Sac de Bombes", /*spanish*/"un saco de bombas"} - ); - - hintTable[RHT_PROGRESSIVE_BOW] = HintText::Item({ - //obscure text - Text{"an archery enabler", /*french*/"un facilitateur de tir", /*spanish*/"un tiro al blanco"}, - Text{"a danger dart launcher", /*french*/"un tire-fléchette", /*spanish*/"un peligroso lanzadardos"}, - }, { - //ambiguous text - Text{"a projectile shooter", /*french*/"un tire-projectile", /*spanish*/"un arma de proyectil"}, - }, - //clear text - Text{"a Bow", /*french*/"l'Arc des Fées", /*spanish*/"un arco de las hadas"} - ); - - hintTable[RHT_PROGRESSIVE_SLINGSHOT] = HintText::Item({ - //obscure text - Text{"a seed shooter", /*french*/"un lance-noix", /*spanish*/"un lanzasemillas"}, - Text{"a rubberband", /*french*/"un élastique", /*spanish*/"un tirachinas"}, - Text{"a child's catapult", /*french*/"un jouet d'enfant", /*spanish*/"una catapulta infantil"}, - }, { - //ambiguous text - Text{"a projectile shooter", /*french*/"un tire-projectile", /*spanish*/"un arma de proyectil"}, - }, - //clear text - Text{"a Slingshot", /*french*/"un Lance-Pierre", /*spanish*/"una resortera de las hadas"} - ); - - hintTable[RHT_PROGRESSIVE_WALLET] = HintText::Item({ - //obscure text - Text{"a mo' money holder", /*french*/"un sac à sous", /*spanish*/"una cartera de dinero"}, - Text{"a gem purse", /*french*/"une sacoche", /*spanish*/"un zurrón de gemas"}, - Text{"a portable bank", /*french*/"une petite banque", /*spanish*/"un banco portable"}, - }, { - //ambiguous text - Text{"a prize of the House of Skulltulas", /*french*/"un prix de la maison des Skulltulas", /*spanish*/"un obsequio de la Casa Skulltula"}, - }, - //clear text - Text{"a Wallet", /*french*/"une Bourse", /*spanish*/"una bolsa de rupias"} - ); - - hintTable[RHT_PROGRESSIVE_SCALE] = HintText::Item({ - //obscure text - Text{"a deeper dive", /*french*/"une bulle de plongée", /*spanish*/"un profundo buceo"}, - Text{"a piece of Zora", /*french*/"un morceau de Zora", /*spanish*/"un fragmento de Zora"}, - }, { - //ambiguous text - Text{"a diving tool", /*french*/"un outil de plongée", /*spanish*/"un instrumento de buceo"}, - }, - //clear text - Text{"a Zora Scale", /*french*/"une Écaille Zora", /*spanish*/"una escama Zora"} - ); - - hintTable[RHT_PROGRESSIVE_NUT_UPGRADE] = HintText::Item({ - //obscure text - Text{"more nuts", /*french*/"ecnore plus de noix", /*spanish*/"más semillas de nogal"}, - Text{"flashbang storage", /*french*/"un sac à noix", /*spanish*/"más frutos aturdidores"}, - }, { - //ambiguous text - Text{"some Deku munitions", /*french*/"un paquet de munitions Mojo", /*spanish*/"un montón de municiones Deku"}, - Text{"something that can stun", /*french*/"une chose qui peut paralyser", /*spanish*/"algo que pueda paralizar"}, - }, - //clear text - Text{"Deku Nut Capacity", /*french*/"une Augmentation de Noix Mojo", /*spanish*/"un aumento de nueces deku"} - ); - - hintTable[RHT_PROGRESSIVE_STICK_UPGRADE] = HintText::Item({ - //obscure text - Text{"a lumber rack", /*french*/"un paquet de bois", /*spanish*/"más bastones"}, - Text{"more flammable twigs", /*french*/"beaucoup de branches", /*spanish*/"más varas"}, - }, { - //ambiguous text - Text{"some Deku munitions", /*french*/"un paquet de munitions Mojo", /*spanish*/"un montón de municiones Deku"}, - }, - //clear text - Text{"Deku Stick Capacity", /*french*/"une augmentation de bâtons Mojo", /*spanish*/"un aumento de palos deku"} - ); - - hintTable[RHT_PROGRESSIVE_MAGIC_METER] = HintText::Item({ - //obscure text - Text{"mystic training", /*french*/"un potentiel magique", /*spanish*/"una maestría mística"}, - Text{"pixie dust", /*french*/"de la poudre de fée", /*spanish*/"un polvo de hada"}, - Text{"a green rectangle", /*french*/"un rectangle vert", /*spanish*/"una verduzca barra"}, - }, { - //ambiguous text - Text{"a Great Fairy's power", /*french*/"le pouvoir d'une grande fée", /*spanish*/"el poder de una Gran Hada"}, - }, - //clear text - Text{"a Magic Meter", /*french*/"une Jauge de Magie", /*spanish*/"un aumento de poder mágico"} - ); - - hintTable[RHT_PROGRESSIVE_OCARINA] = HintText::Item({ - //obscure text - Text{"a flute", /*french*/"un bec musical", /*spanish*/"un utensilio musical"}, - Text{"a music maker", /*french*/"un porteur de chansons", /*spanish*/"un instrumento"}, - }, { - //ambiguous text - Text{"something given by Saria", /*french*/"un cadeau de Saria", /*spanish*/"un obsequio de Saria"}, - Text{"something kept by the royal family", /*french*/"une chose qui paralyse", /*spanish*/"algo guardado por la familia real"}, - }, - //clear text - Text{"an Ocarina", /*french*/"un ocarina", /*spanish*/"una ocarina"} - ); - - hintTable[RHT_PROGRESSIVE_BOMBCHUS] = HintText::Item({ - //obscure text - Text{"mice bombs", /*french*/"un adorable explosif", /*spanish*/"unas bombas roedoras"}, - Text{"proximity mice", /*french*/"une mine anti-rongeur", /*spanish*/"unos explosivos ratoncitos"}, - Text{"wall crawlers", /*french*/"un rapide grimpeur", /*spanish*/"unos trepaparedes"}, - Text{"trail blazers", /*french*/"un zigzag éclatant", /*spanish*/"unas ratas propulsadas"}, - }, { - //ambiguous text - Text{"a prize of the House of Skulltulas", /*french*/"un prix de la maison des Skulltulas", /*spanish*/"un obsequio de la Casa Skulltula"}, - Text{"explosives", /*french*/"un paquet d'explosifs", /*spanish*/"un montón de explosivos"}, - }, - //clear text - Text{"Bombchus", /*french*/"un paquet de Missiles", /*spanish*/"unos bombchus"} - ); - - hintTable[RHT_PROGRESSIVE_GORONSWORD] = HintText::Item({ - //obscure text - Text{"a long blade", /*french*/"une longue lame", /*spanish*/"una gran hoja"}, - Text{"a Goron weapon", /*french*/"une arme Goron", /*spanish*/"un arma goron"}, - }, { - //ambiguous text - Text{"a sword", /*french*/"une épée", /*spanish*/"una espada"}, - }, - //clear text - Text{"a Goron Sword", /*french*/"une épée Goron", /*spanish*/"una espada goron"} - ); - - hintTable[RHT_EMPTY_BOTTLE] = HintText::Item({ - //obscure text - Text{"a glass container", /*french*/"un cylindre de cristal", /*spanish*/"un recipiente de cristal"}, - Text{"an empty jar", /*french*/"une jarre incassable", /*spanish*/"un frasco vacío"}, - Text{"encased air", /*french*/"un bocal d'air", /*spanish*/"aire a presión"}, - }, { - //ambiguous text - Text{"a bottle", /*french*/"un flacon", /*spanish*/"una botella"}, - }, - //clear text - Text{"a Bottle", /*french*/"un flacon vide", /*spanish*/"una botella"} - ); - - hintTable[RHT_BOTTLE_WITH_MILK] = HintText::Item({ - //obscure text - Text{"cow juice", /*french*/"une source de calcium", /*spanish*/"una fuente de calcio"}, - Text{"a white liquid", /*french*/"un liquide blanc", /*spanish*/"una bebida nutritiva"}, - Text{"a baby's breakfast", /*french*/"du jus pour bébé", /*spanish*/"un trago para bebés"}, - }, { - //ambiguous text - Text{"a bottle", /*french*/"un flacon", /*spanish*/"una botella"}, - }, - //clear text - Text{"a Milk Bottle", /*french*/"un flacon de lait", /*spanish*/"una botella de leche"} - ); - - hintTable[RHT_BOTTLE_WITH_RED_POTION] = HintText::Item({ - //obscure text - Text{"a vitality vial", /*french*/"un mélange de vitalité", /*spanish*/"una pócima vitalicia"}, - Text{"a red liquid", /*french*/"un liquide rouge", /*spanish*/"un remedio rojizo"}, - }, { - //ambiguous text - Text{"a bottle", /*french*/"un flacon", /*spanish*/"una botella"}, - }, - //clear text - Text{"a Red Potion Bottle", /*french*/"un flacon de potion rouge", /*spanish*/"una botella de poción roja"} - ); - - hintTable[RHT_BOTTLE_WITH_GREEN_POTION] = HintText::Item({ - //obscure text - Text{"a magic mixture", /*french*/"une réserve magique", /*spanish*/"un potingue mágico"}, - Text{"a green liquid", /*french*/"un liquide vert", /*spanish*/"un remedio verduzco"}, - }, { - //ambiguous text - Text{"a bottle", /*french*/"un flacon", /*spanish*/"una botella"}, - }, - //clear text - Text{"a Green Potion Bottle", /*french*/"un flacon de potion verte", /*spanish*/"una botella de poción verde"} - ); - - hintTable[RHT_BOTTLE_WITH_BLUE_POTION] = HintText::Item({ - //obscure text - Text{"an ailment antidote", /*french*/"l'élixir ultime", /*spanish*/"un antídoto para el dolor"}, - Text{"a blue liquid", /*french*/"un liquide bleu", /*spanish*/"un remedio índigo"}, - }, { - //ambiguous text - Text{"a bottle", /*french*/"un flacon", /*spanish*/"una botella"}, - }, - //clear text - Text{"a Blue Potion Bottle", /*french*/"un flacon de potion bleue", /*spanish*/"una botella de poción azul"} - ); - - hintTable[RHT_BOTTLE_WITH_FAIRY] = HintText::Item({ - //obscure text - Text{"an imprisoned fairy", /*french*/"une fée emprisonnée", /*spanish*/"un hada atrapada"}, - Text{"an extra life", /*french*/"une vie de rechange", /*spanish*/"una oportunidad más"}, - Text{"Navi's cousin", /*french*/"le cousin de Navi", /*spanish*/"una prima de Navi"}, - }, { - //ambiguous text - Text{"a bottle", /*french*/"un flacon", /*spanish*/"una botella"}, - }, - //clear text - Text{"a Fairy Bottle", /*french*/"une fée en flacon", /*spanish*/"un hada en una botella"} - ); - - hintTable[RHT_BOTTLE_WITH_FISH] = HintText::Item({ - //obscure text - Text{"an aquarium", /*french*/"un aquarium", /*spanish*/"un escamado ser"}, - Text{"a deity's snack", /*french*/"le repas d'un dieu marin", /*spanish*/"un tentempié de cierta deidad"}, - }, { - //ambiguous text - Text{"a bottle", /*french*/"un flacon", /*spanish*/"una botella"}, - }, - //clear text - Text{"a Fish Bottle", /*french*/"un poisson en flacon", /*spanish*/"un pez en una botella"} - ); - - hintTable[RHT_BOTTLE_WITH_BLUE_FIRE] = HintText::Item({ - //obscure text - Text{"a conflagration canteen", /*french*/"une mystérieuse flamme", /*spanish*/"un incendio retenido"}, - Text{"an icemelt jar", /*french*/"un brasier glacial", /*spanish*/"unas brasas enfrascadas"}, - }, { - //ambiguous text - Text{"a bottle", /*french*/"un flacon", /*spanish*/"una botella"}, - }, - //clear text - Text{"a Blue Fire Bottle", /*french*/"une flamme bleue en flacon", /*spanish*/"una botella de fuego azul"} - ); - - hintTable[RHT_BOTTLE_WITH_BUGS] = HintText::Item({ - //obscure text - Text{"an insectarium", /*french*/"un insectarium", /*spanish*/"unos invertebrados seres"}, - Text{"Skulltula finders", /*french*/"une poignée de trouve-Skulltula", /*spanish*/"unos rastreadores de skulltulas"}, - }, { - //ambiguous text - Text{"a bottle", /*french*/"un flacon", /*spanish*/"una botella"}, - }, - //clear text - Text{"a Bug Bottle", /*french*/"un insecte en flacon", /*spanish*/"unos insectos en una botella"} - ); - - hintTable[RHT_BOTTLE_WITH_POE] = HintText::Item({ - //obscure text - Text{"a spooky ghost", /*french*/"un effroyable fantôme", /*spanish*/"un espantoso espectro"}, - Text{"a face in the jar", /*french*/"un visage dans un bocal", /*spanish*/"una expresión enfrascada"}, - }, { - //ambiguous text - Text{"a bottle", /*french*/"un flacon", /*spanish*/"una botella"}, - }, - //clear text - Text{"a Poe Bottle", /*french*/"un Esprit en flacon", /*spanish*/"un Poe en una botella"} - ); - - hintTable[RHT_BOTTLE_WITH_BIG_POE] = HintText::Item({ - //obscure text - Text{"the spookiest ghost", /*french*/"un épouvantable spectre", /*spanish*/"el espectro más espeluznante"}, - Text{"a sidequest spirit", /*french*/"un précieux esprit", /*spanish*/"un buen valorado espíritu"}, - }, { - //ambiguous text - Text{"a bottle", /*french*/"un flacon", /*spanish*/"una botella"}, - }, - //clear text - Text{"a Big Poe Bottle", /*french*/"une Ame en flacon", /*spanish*/"un Gran Poe en una botella"} - ); - - hintTable[RHT_RUTOS_LETTER] = HintText::Item({ - //obscure text - Text{"a call for help", /*french*/"un appel au secours", /*spanish*/"una llamada de auxilio"}, - Text{"the note that Mweeps", /*french*/"un message qui fait mwip", /*spanish*/"un escrito mweep"}, - Text{"an RHT_SOS call", /*french*/"un signal RHT_SOS", /*spanish*/"una nota de socorro"}, - Text{"a fishy stationery", /*french*/"un papier mouillé", /*spanish*/"un mensaje de ayuda"}, - }, { - //ambiguous text - Text{"a bottle", /*french*/"un flacon", /*spanish*/"una botella"}, - }, - //clear text - Text{"Ruto's Letter", /*french*/"la lettre de Ruto", /*spanish*/"la carta de Ruto"} - ); - - hintTable[RHT_ZELDAS_LULLABY] = HintText::Item({ - //obscure text - Text{"a song of royal slumber", /*french*/"une chanson royale", /*spanish*/"la canción real"}, - Text{"a triforce tune", /*french*/"la musique sacrée", /*spanish*/"la melodía de la trifuerza"}, - }, { - //ambiguous text - Text{"a regular song", /*french*/"une chanson normale", /*spanish*/"una cancion normal"}, - Text{"something kept by the royal family", /*french*/"une chose qui paralyse", /*spanish*/"algo guardado por la familia real"}, - }, - //clear text - Text{"Zelda's Lullaby", /*french*/"la berceuse de Zelda", /*spanish*/"la Nana de Zelda"} - ); - - hintTable[RHT_EPONAS_SONG] = HintText::Item({ - //obscure text - Text{"an equestrian etude", /*french*/"une hymne équestre", /*spanish*/"una copla ecuestre"}, - Text{"Malon's melody", /*french*/"la mélodie des vaches", /*spanish*/"la sonata de Malon"}, - Text{"a ranch song", /*french*/"le chant des champs", /*spanish*/"un canto rupestre"}, - }, { - //ambiguous text - Text{"a regular song", /*french*/"une chanson normale", /*spanish*/"una cancion normal"}, - }, - //clear text - Text{"Epona's Song", /*french*/"le chant d'Epona", /*spanish*/"la Canción de Epona"} - ); - - hintTable[RHT_SARIAS_SONG] = HintText::Item({ - //obscure text - Text{"a song of dancing Gorons", /*french*/"une chanson danceuse", /*spanish*/"un pegadizo tono goron"}, - Text{"Saria's phone number", /*french*/"le téléphone d'une amie", /*spanish*/"una consulta de asistencia"}, - }, { - //ambiguous text - Text{"a regular song", /*french*/"une chanson normale", /*spanish*/"una cancion normal"}, - Text{"something given by Saria", /*french*/"un cadeau de Saria", /*spanish*/"un obsequio de Saria"}, - }, - //clear text - Text{"Saria's Song", /*french*/"le chant de Saria", /*spanish*/"la Canción de Saria"} - ); - - hintTable[RHT_SUNS_SONG] = HintText::Item({ - //obscure text - Text{"Sunny Day", /*french*/"Zénith", /*spanish*/"un día soleado"}, - Text{"the ReDead's bane", /*french*/"le fléau des Éffrois", /*spanish*/"la destructora de Redeads"}, - Text{"the Gibdo's bane", /*french*/"le fléau des Gibdo", /*spanish*/"la destructora de Gibdos"}, - }, { - //ambiguous text - Text{"a regular song", /*french*/"une chanson normale", /*spanish*/"una cancion normal"}, - Text{"something that can stun", /*french*/"une chose qui peut paralyser", /*spanish*/"algo que pueda paralizar"}, - }, - //clear text - Text{"the Sun's Song", /*french*/"le chant du soleil", /*spanish*/"la Canción del Sol"} - ); - - hintTable[RHT_SONG_OF_TIME] = HintText::Item({ - //obscure text - Text{"a song 7 years long", /*french*/"le flot du temps", /*spanish*/"la setenada canción"}, - Text{"the tune of ages", /*french*/"le Chant des Âges", /*spanish*/"la melodía eónica"}, - }, { - //ambiguous text - Text{"a regular song", /*french*/"une chanson normale", /*spanish*/"una cancion normal"}, - }, - //clear text - Text{"the Song of Time", /*french*/"le chant du temps", /*spanish*/"la Canción del tiempo"} - ); - - hintTable[RHT_SONG_OF_STORMS] = HintText::Item({ - //obscure text - Text{"Rain Dance", /*french*/"Danse Pluie", /*spanish*/"la danza de la lluvia"}, - Text{"a thunderstorm tune", /*french*/"une hymne foudroyante", /*spanish*/"una sonata tormentosa"}, - Text{"windmill acceleration", /*french*/"l'accélérateur de moulins", /*spanish*/"el arranque de molinos"}, - }, { - //ambiguous text - Text{"a regular song", /*french*/"une chanson normale", /*spanish*/"una cancion normal"}, - }, - //clear text - Text{"the Song of Storms", /*french*/"le chant des tempêtes", /*spanish*/"la Canción de la Tormenta"} - ); - - hintTable[RHT_MINUET_OF_FOREST] = HintText::Item({ - //obscure text - Text{"the song of tall trees", /*french*/"le bruit des arbres", /*spanish*/"la canción de las copas"}, - Text{"an arboreal anthem", /*french*/"l'hymne sylvestre", /*spanish*/"el himno forestal"}, - Text{"a green spark trail", /*french*/"une comète verte", /*spanish*/"el sendero esmeralda"}, - }, { - //ambiguous text - Text{"a warp song", /*french*/"une chanson de téléportation", /*spanish*/"una canción de teletransportación"}, - }, - //clear text - Text{"the Minuet of Forest", /*french*/"le menuet de la forêt", /*spanish*/"el Minueto del bosque"} - ); - - hintTable[RHT_BOLERO_OF_FIRE] = HintText::Item({ - //obscure text - Text{"a song of lethal lava", /*french*/"une musique enflammée", /*spanish*/"la canción de la lava"}, - Text{"a red spark trail", /*french*/"une comète rouge", /*spanish*/"el sendero rubí"}, - Text{"a volcanic verse", /*french*/"le souffle du volcan", /*spanish*/"el verso volcánico"}, - }, { - //ambiguous text - Text{"a warp song", /*french*/"une chanson de téléportation", /*spanish*/"una canción de teletransportación"}, - }, - //clear text - Text{"the Bolero of Fire", /*french*/"le boléro du feu", /*spanish*/"el Bolero del fuego"} - ); - - hintTable[RHT_SERENADE_OF_WATER] = HintText::Item({ - //obscure text - Text{"a song of a damp ditch", /*french*/"le calme de l'eau", /*spanish*/"la canción del estanque"}, - Text{"a blue spark trail", /*french*/"une comète bleue", /*spanish*/"el sendero zafiro"}, - Text{"the lake's lyric", /*french*/"la voix du lac", /*spanish*/"la letra del lago"}, - }, { - //ambiguous text - Text{"a warp song", /*french*/"une chanson de téléportation", /*spanish*/"una canción de teletransportación"}, - }, - //clear text - Text{"the Serenade of Water", /*french*/"la sérénade de l'eau", /*spanish*/"la Serenata del agua"} - ); - - hintTable[RHT_REQUIEM_OF_SPIRIT] = HintText::Item({ - //obscure text - Text{"a song of sandy statues", /*french*/"la mélodie d'une grande statue", /*spanish*/"la canción de la gran estatua"}, - Text{"an orange spark trail", /*french*/"une comète orange", /*spanish*/"el sendero ámbar"}, - Text{"the desert ditty", /*french*/"le vent du désert", /*spanish*/"la estrofa del desierto"}, - }, { - //ambiguous text - Text{"a warp song", /*french*/"une chanson de téléportation", /*spanish*/"una canción de teletransportación"}, - }, - //clear text - Text{"the Requiem of Spirit", /*french*/"le requiem des esprits", /*spanish*/"el Réquiem del espíritu"} - ); - - hintTable[RHT_NOCTURNE_OF_SHADOW] = HintText::Item({ - //obscure text - Text{"a song of spooky spirits", /*french*/"une hymne de chair de poule", /*spanish*/"la canción de los espectros"}, - Text{"a graveyard boogie", /*french*/"un boogie de fantômes", /*spanish*/"una honra fúnebre"}, - Text{"a haunted hymn", /*french*/"une chanson lugubre", /*spanish*/"una estrofa encantada"}, - Text{"a purple spark trail", /*french*/"une comète mauve", /*spanish*/"el sendero malva"}, - }, { - //ambiguous text - Text{"a warp song", /*french*/"une chanson de téléportation", /*spanish*/"una canción de teletransportación"}, - }, - //clear text - Text{"the Nocturne of Shadow", /*french*/"le nocturne de l'ombre", /*spanish*/"el Nocturno de la sombra"} - ); - - hintTable[RHT_PRELUDE_OF_LIGHT] = HintText::Item({ - //obscure text - Text{"a luminous prologue melody", /*french*/"une matine illuminée", /*spanish*/"la melodía refulgente"}, - Text{"a yellow spark trail", /*french*/"une comète jaune", /*spanish*/"el sendero resplandeciente"}, - Text{"the temple traveler", /*french*/"un chant de sanctuaire", /*spanish*/"la ruta del templo"}, - }, { - //ambiguous text - Text{"a warp song", /*french*/"une chanson de téléportation", /*spanish*/"una canción de teletransportación"}, - }, - //clear text - Text{"the Prelude of Light", /*french*/"le prélude de la lumière", /*spanish*/"el Preludio de la luz"} - ); - hintTable[RHT_DEKU_TREE_MAP] = HintText::Item({ - //obscure text - Text{"a mossy atlas", /*french*/"un atlas boisé", /*spanish*/"un atlas musgoso"}, - Text{"some mossy blueprints", /*french*/"un plan boisé", /*spanish*/"unos planos musgosos"}, - }, { - //ambiguous text - Text{"a dungeon map", /*french*/"une carte", /*spanish*/"un mapa"}, - }, - //clear text - Text{"the Deku Tree Map", /*french*/"la carte de l'Arbre Mojo", /*spanish*/"el mapa del Gran Árbol Deku"} - ); - hintTable[RHT_DODONGOS_CAVERN_MAP] = HintText::Item({ - //obscure text - Text{"a rocky atlas", /*french*/"un atlas rocheux", /*spanish*/"un atlas rocoso"}, - Text{"some rocky blueprints", /*french*/"un plan rocheux", /*spanish*/"unos planos rocosos"}, - }, { - //ambiguous text - Text{"a dungeon map", /*french*/"une carte", /*spanish*/"un mapa"}, - }, - //clear text - Text{"the Dodongo's Cavern Map", /*french*/"la carte de la Caverne Dodongo", /*spanish*/"el mapa de la Cueva de los Dodongos"} - ); - hintTable[RHT_JABU_JABUS_BELLY_MAP] = HintText::Item({ - //obscure text - Text{"a fishy atlas", /*french*/"un atlas digéré", /*spanish*/"un atlas digesto"}, - Text{"some fishy blueprints", /*french*/"un plan digéré", /*spanish*/"unos planos digestos"}, - }, { - //ambiguous text - Text{"a dungeon map", /*french*/"une carte", /*spanish*/"un mapa"}, - }, - //clear text - Text{"the Jabu-Jabu's Belly Map", /*french*/"la carte de Jabu-Jabu", /*spanish*/"el mapa de la Tripa de Jabu-Jabu"} - ); - hintTable[RHT_FOREST_TEMPLE_MAP] = HintText::Item({ - //obscure text - Text{"a sylvan atlas", /*french*/"un atlas sylvestre", /*spanish*/"un atlas enselvado"}, - Text{"some sylvan blueprints", /*french*/"un plan sylvestre", /*spanish*/"unos planos enselvados"}, - }, { - //ambiguous text - Text{"a dungeon map", /*french*/"une carte", /*spanish*/"un mapa"}, - }, - //clear text - Text{"the Forest Temple Map", /*french*/"la carte du Temple de la Forêt", /*spanish*/"el mapa del Templo del Bosque"} - ); - hintTable[RHT_FIRE_TEMPLE_MAP] = HintText::Item({ - //obscure text - Text{"a molten atlas", /*french*/"un atlas fondu", /*spanish*/"un atlas fundido"}, - Text{"some molten blueprints", /*french*/"un plan fondu", /*spanish*/"unos planos fundidos"}, - }, { - //ambiguous text - Text{"a dungeon map", /*french*/"une carte", /*spanish*/"un mapa"}, - }, - //clear text - Text{"the Fire Temple Map", /*french*/"la carte du Temple du Feu", /*spanish*/"el mapa del Templo del Fuego"} - ); - hintTable[RHT_WATER_TEMPLE_MAP] = HintText::Item({ - //obscure text - Text{"a wet atlas", /*french*/"un atlas humide", /*spanish*/"un atlas mojado"}, - Text{"some wet blueprints", /*french*/"un plan humide", /*spanish*/"unos planos mojados"}, - }, { - //ambiguous text - Text{"a dungeon map", /*french*/"une carte", /*spanish*/"un mapa"}, - }, - //clear text - Text{"the Water Temple Map", /*french*/"la carte du Temple de l'Eau", /*spanish*/"el mapa del Templo del Agua"} - ); - hintTable[RHT_SPIRIT_TEMPLE_MAP] = HintText::Item({ - //obscure text - Text{"a sandy atlas", /*french*/"un atlas sableux", /*spanish*/"un atlas arenoso"}, - Text{"some sandy blueprints", /*french*/"un plan sableux", /*spanish*/"unos planos arenosos"}, - }, { - //ambiguous text - Text{"a dungeon map", /*french*/"une carte", /*spanish*/"un mapa"}, - }, - //clear text - Text{"the Spirit Temple Map", /*french*/"la carte du Temple de l'Esprit", /*spanish*/"el mapa del Templo del Espíritu"} - ); - hintTable[RHT_SHADOW_TEMPLE_MAP] = HintText::Item({ - //obscure text - Text{"a creepy atlas", /*french*/"un atlas sinistre", /*spanish*/"un atlas siniestra"}, - Text{"some creepy blueprints", /*french*/"un plan sinistre", /*spanish*/"unos planos siniestras"}, - }, { - //ambiguous text - Text{"a dungeon map", /*french*/"une carte", /*spanish*/"un mapa"}, - }, - //clear text - Text{"the Shadow Temple Map", /*french*/"la carte du Temple de l'Ombre", /*spanish*/"el mapa del Templo de las Sombras"} - ); - hintTable[RHT_BOTTOM_OF_THE_WELL_MAP] = HintText::Item({ - //obscure text - Text{"a moldy atlas", /*french*/"un atlas moisi", /*spanish*/"un atlas mohoso"}, - Text{"some moldy blueprints", /*french*/"un plan moisi", /*spanish*/"unos planos mohosos"}, - }, { - //ambiguous text - Text{"a dungeon map", /*french*/"une carte", /*spanish*/"un mapa"}, - }, - //clear text - Text{"the Bottom of the Well Map", /*french*/"la carte du fond du Puits", /*spanish*/"el mapa del Fondo del pozo"} - ); - hintTable[RHT_ICE_CAVERN_MAP] = HintText::Item({ - //obscure text - Text{"a polar atlas", /*french*/"un atlas polaire", /*spanish*/"un atlas polar"}, - Text{"some polar blueprints", /*french*/"un plan polaire", /*spanish*/"unos planos polars"}, - }, { - //ambiguous text - Text{"a dungeon map", /*french*/"une carte", /*spanish*/"un mapa"}, - }, - //clear text - Text{"the Ice Cavern Map", /*french*/"la carte de la Caverne Polaire", /*spanish*/"el mapa de la Caverna de hielo"} - ); - hintTable[RHT_DEKU_TREE_COMPASS] = HintText::Item({ - //obscure text - Text{"a mossy treasure tracker", /*french*/"un cherche-trésor boisé", /*spanish*/"un zahorí musgoso"}, - Text{"a mossy magnetic needle", /*french*/"une aimant boisée", /*spanish*/"un imán musgoso"}, - }, { - //ambiguous text - Text{"a compass", /*french*/"une boussole", /*spanish*/"una brújula"}, - }, - //clear text - Text{"the Deku Tree Compass", /*french*/"la boussole de l'Arbre Mojo", /*spanish*/"la brújula del Gran Árbol Deku"} - ); - hintTable[RHT_DODONGOS_CAVERN_COMPASS] = HintText::Item({ - //obscure text - Text{"a rocky treasure tracker", /*french*/"un cherche-trésor rocheux", /*spanish*/"un zahorí rocoso"}, - Text{"a rocky magnetic needle", /*french*/"une aimant rocheux", /*spanish*/"un imán rocoso"}, - }, { - //ambiguous text - Text{"a compass", /*french*/"une boussole", /*spanish*/"una brújula"}, - }, - //clear text - Text{"the Dodongo's Cavern Compass", /*french*/"la boussole de la Caverne Dodongo", /*spanish*/"la brújula de la Cueva de los Dodongos"} - ); - hintTable[RHT_JABU_JABUS_BELLY_COMPASS] = HintText::Item({ - //obscure text - Text{"a fishy treasure tracker", /*french*/"un cherche-trésor digéré", /*spanish*/"un zahorí digesto"}, - Text{"a fishy magnetic needle", /*french*/"une aimant digéré", /*spanish*/"un imán digesto"}, - }, { - //ambiguous text - Text{"a compass", /*french*/"une boussole", /*spanish*/"una brújula"}, - }, - //clear text - Text{"the Jabu-Jabu's Belly Compass", /*french*/"la boussole de Jabu-Jabu", /*spanish*/"la brújula de la Tripa de Jabu-Jabu"} - ); - hintTable[RHT_FOREST_TEMPLE_COMPASS] = HintText::Item({ - //obscure text - Text{"a sylvan treasure tracker", /*french*/"un cherche-trésor sylvestre", /*spanish*/"un zahorí enselvado"}, - Text{"a sylvan magnetic needle", /*french*/"une aimant sylvestre", /*spanish*/"un imán enselvado"}, - }, { - //ambiguous text - Text{"a compass", /*french*/"une boussole", /*spanish*/"una brújula"}, - }, - //clear text - Text{"the Forest Temple Compass", /*french*/"la boussole du Temple de la Forêt", /*spanish*/"la brújula del Templo del Bosque"} - ); - hintTable[RHT_FIRE_TEMPLE_COMPASS] = HintText::Item({ - //obscure text - Text{"a molten treasure tracker", /*french*/"un cherche-trésor fondu", /*spanish*/"un zahorí fundido"}, - Text{"a molten magnetic needle", /*french*/"une aimant fondu", /*spanish*/"un imán fundido"}, - }, { - //ambiguous text - Text{"a compass", /*french*/"une boussole", /*spanish*/"una brújula"}, - }, - //clear text - Text{"the Fire Temple Compass", /*french*/"la boussole du Temple du Feu", /*spanish*/"la brújula del Templo del Fuego"} - ); - hintTable[RHT_WATER_TEMPLE_COMPASS] = HintText::Item({ - //obscure text - Text{"a wet treasure tracker", /*french*/"un cherche-trésor humide", /*spanish*/"un zahorí mojado"}, - Text{"a wet magnetic needle", /*french*/"une aimant humide", /*spanish*/"un imán mojado"}, - }, { - //ambiguous text - Text{"a compass", /*french*/"une boussole", /*spanish*/"una brújula"}, - }, - //clear text - Text{"the Water Temple Compass", /*french*/"la boussole du Temple de l'Eau", /*spanish*/"la brújula del Templo del Agua"} - ); - hintTable[RHT_SPIRIT_TEMPLE_COMPASS] = HintText::Item({ - //obscure text - Text{"a sandy treasure tracker", /*french*/"un cherche-trésor sableux", /*spanish*/"un zahorí arenoso"}, - Text{"a sandy magnetic needle", /*french*/"une aimant sableux", /*spanish*/"un imán arenoso"}, - }, { - //ambiguous text - Text{"a compass", /*french*/"une boussole", /*spanish*/"una brújula"}, - }, - //clear text - Text{"the Spirit Temple Compass", /*french*/"la boussole du Temple de l'Esprit", /*spanish*/"la brújula del Templo del Espíritu"} - ); - hintTable[RHT_SHADOW_TEMPLE_COMPASS] = HintText::Item({ - //obscure text - Text{"a creepy treasure tracker", /*french*/"un cherche-trésor sinistre", /*spanish*/"un zahorí siniestra"}, - Text{"a creepy magnetic needle", /*french*/"une aimant sinistre", /*spanish*/"un imán siniestra"}, - }, { - //ambiguous text - Text{"a compass", /*french*/"une boussole", /*spanish*/"una brújula"}, - }, - //clear text - Text{"the Shadow Temple Compass", /*french*/"la boussole du Temple de l'Ombre", /*spanish*/"la brújula del Templo de las Sombras"} - ); - hintTable[RHT_BOTTOM_OF_THE_WELL_COMPASS] = HintText::Item({ - //obscure text - Text{"a dank treasure tracker", /*french*/"un cherche-trésor moisi", /*spanish*/"un zahorí mohoso"}, - Text{"a dank magnetic needle", /*french*/"une aimant moisi", /*spanish*/"un imán mohoso"}, - }, { - //ambiguous text - Text{"a compass", /*french*/"une boussole", /*spanish*/"una brújula"}, - }, - //clear text - Text{"the Bottom of the Well Compass", /*french*/"la boussole du fond du Puits", /*spanish*/"la brújula del Fondo del pozo"} - ); - hintTable[RHT_ICE_CAVERN_COMPASS] = HintText::Item({ - //obscure text - Text{"a polar treasure tracker", /*french*/"un cherche-trésor polaire", /*spanish*/"un zahorí polar"}, - Text{"a polar magnetic needle", /*french*/"une aimant polaire", /*spanish*/"un imán polar"}, - }, { - //ambiguous text - Text{"a compass", /*french*/"une boussole", /*spanish*/"una brújula"}, - }, - //clear text - Text{"the Ice Cavern Compass", /*french*/"la Boussole de la Caverne Polaire", /*spanish*/"la brújula de la Caverna de hielo"} - ); - hintTable[RHT_FOREST_TEMPLE_BOSS_KEY] = HintText::Item({ - //obscure text - Text{"a sylvan master of unlocking", /*french*/"un anti-grosse porte sylvestre", /*spanish*/"la clave enselvada de un jefe"}, - Text{"a sylvan dungeon's master pass", /*french*/"une clé maléfique sylvestree", /*spanish*/"el pase maestro enselvado"}, - }, { - //ambiguous text - Text{"a boss key", /*french*/"une Clé d'Or", /*spanish*/"una gran llave"}, - }, - //clear text - Text{"the Forest Temple Boss Key", /*french*/"la Clé d'Or du Temple de la Forêt", /*spanish*/"la gran llave del Templo del Bosque"} - ); - hintTable[RHT_FIRE_TEMPLE_BOSS_KEY] = HintText::Item({ - //obscure text - Text{"a molten master of unlocking", /*french*/"un anti-grosse porte fondu", /*spanish*/"la clave fundido de un jefe"}, - Text{"a molten dungeon's master pass", /*french*/"une clé maléfique fondu", /*spanish*/"el pase maestro fundido"}, - }, { - //ambiguous text - Text{"a boss key", /*french*/"une Clé d'Or", /*spanish*/"una gran llave"}, - }, - //clear text - Text{"the Fire Temple Boss Key", /*french*/"la Clé d'Or du Temple du Feu", /*spanish*/"la gran llave del Templo del Fuego"} - ); - hintTable[RHT_WATER_TEMPLE_BOSS_KEY] = HintText::Item({ - //obscure text - Text{"a wet master of unlocking", /*french*/"un anti-grosse porte humide", /*spanish*/"la clave mojado de un jefe"}, - Text{"a wet dungeon's master pass", /*french*/"une clé maléfique humide", /*spanish*/"el pase maestro mojado"}, - }, { - //ambiguous text - Text{"a boss key", /*french*/"une Clé d'Or", /*spanish*/"una gran llave"}, - }, - //clear text - Text{"the Water Temple Boss Key", /*french*/"la Clé d'Or du Temple de l'Eau", /*spanish*/"la gran llave del Templo del Agua"} - ); - hintTable[RHT_SPIRIT_TEMPLE_BOSS_KEY] = HintText::Item({ - //obscure text - Text{"a sandy master of unlocking", /*french*/"un anti-grosse porte sableux", /*spanish*/"la clave arenoso de un jefe"}, - Text{"a sandy dungeon's master pass", /*french*/"une clé maléfique sableux", /*spanish*/"el pase maestro arenoso"}, - }, { - //ambiguous text - Text{"a boss key", /*french*/"une Clé d'Or", /*spanish*/"una gran llave"}, - }, - //clear text - Text{"the Spirit Temple Boss Key", /*french*/"la Clé d'Or du Temple de l'Esprit", /*spanish*/"la gran llave del Templo del Espíritu"} - ); - hintTable[RHT_SHADOW_TEMPLE_BOSS_KEY] = HintText::Item({ - //obscure text - Text{"a creepy master of unlocking", /*french*/"un anti-grosse porte sinistre", /*spanish*/"la clave siniestra de un jefe"}, - Text{"a creepy dungeon's master pass", /*french*/"une clé maléfique sinistre", /*spanish*/"el pase maestro siniestra"}, - }, { - //ambiguous text - Text{"a boss key", /*french*/"une Clé d'Or", /*spanish*/"una gran llave"}, - }, - //clear text - Text{"the Shadow Temple Boss Key", /*french*/"la Clé d'Or du Temple de l'Ombre", /*spanish*/"la gran llave del Templo de las Sombras"} - ); - hintTable[RHT_GANONS_CASTLE_BOSS_KEY] = HintText::Item({ - //obscure text - Text{"a final master of unlocking", /*french*/"un anti-grosse porte final", /*spanish*/"la clave final de un jefe"}, - Text{"a final dungeon's master pass", /*french*/"une clé maléfique final", /*spanish*/"el pase maestro final"}, - }, { - //ambiguous text - Text{"a boss key", /*french*/"une Clé d'Or", /*spanish*/"una gran llave"}, - }, - //clear text - Text{"the Ganon's Castle Boss Key", /*french*/"la Clé d'Or du Château de Ganon", /*spanish*/"la gran llave del Castillo de Ganon"} - ); - hintTable[RHT_FOREST_TEMPLE_SMALL_KEY] = HintText::Item({ - //obscure text - Text{"a sylvan tool for unlocking", /*french*/"un anti-porte sylvestre", /*spanish*/"una clave de una entrada enselvada"}, - Text{"a sylvan dungeon pass", /*french*/"le rêve sylvestre d'un prisonnier", /*spanish*/"un pase de una mazmorra enselvada"}, - Text{"a sylvan lock remover", /*french*/"un efface-serrure sylvestre", /*spanish*/"un destructor de cerraduras enselvada"}, - Text{"a sylvan lockpick", /*french*/"un crochet à porte sylvestre", /*spanish*/"una apertura portentosa enselvada"}, - }, { - //ambiguous text - Text{"a small key", /*french*/"une petite clé", /*spanish*/"una llave pequeña"}, - }, - //clear text - Text{"a Forest Temple Small Key", /*french*/"une petite clé du Temple de la Forêt", /*spanish*/"una llave pequeña del Templo del Bosque"} - ); - hintTable[RHT_FIRE_TEMPLE_SMALL_KEY] = HintText::Item({ - //obscure text - Text{"a molten tool for unlocking", /*french*/"un anti-porte fondu", /*spanish*/"una clave de una entrada fundida"}, - Text{"a molten dungeon pass", /*french*/"le rêve fondu d'un prisonnier", /*spanish*/"un pase de una mazmorra fundida"}, - Text{"a molten lock remover", /*french*/"un efface-serrure fondu", /*spanish*/"un destructor de cerraduras fundida"}, - Text{"a molten lockpick", /*french*/"un crochet à porte fondu", /*spanish*/"una apertura portentosa fundida"}, - }, { - //ambiguous text - Text{"a small key", /*french*/"une petite clé", /*spanish*/"una llave pequeña"}, - }, - //clear text - Text{"a Fire Temple Small Key", /*french*/"une petite clé du Temple du Feu", /*spanish*/"una llave pequeña del Templo del Fuego"} - ); - hintTable[RHT_WATER_TEMPLE_SMALL_KEY] = HintText::Item({ - //obscure text - Text{"a wet tool for unlocking", /*french*/"un anti-porte humide", /*spanish*/"una clave de una entrada mojada"}, - Text{"a wet dungeon pass", /*french*/"le rêve humide d'un prisonnier", /*spanish*/"un pase de una mazmorra mojada"}, - Text{"a wet lock remover", /*french*/"un efface-serrure humide", /*spanish*/"un destructor de cerraduras mojada"}, - Text{"a wet lockpick", /*french*/"un crochet à porte humide", /*spanish*/"una apertura portentosa mojada"}, - }, { - //ambiguous text - Text{"a small key", /*french*/"une petite clé", /*spanish*/"una llave pequeña"}, - }, - //clear text - Text{"a Water Temple Small Key", /*french*/"une petite clé du Temple de l'Eau", /*spanish*/"una llave pequeña del Templo del Agua"} - ); - hintTable[RHT_SPIRIT_TEMPLE_SMALL_KEY] = HintText::Item({ - //obscure text - Text{"a sandy tool for unlocking", /*french*/"un anti-porte sableux", /*spanish*/"una clave de una entrada arenosa"}, - Text{"a sandy dungeon pass", /*french*/"le rêve sableux d'un prisonnier", /*spanish*/"un pase de una mazmorra arenosa"}, - Text{"a sandy lock remover", /*french*/"un efface-serrure sableux", /*spanish*/"un destructor de cerraduras arenosa"}, - Text{"a sandy lockpick", /*french*/"un crochet à porte sableux", /*spanish*/"una apertura portentosa arenosa"}, - }, { - //ambiguous text - Text{"a small key", /*french*/"une petite clé", /*spanish*/"una llave pequeña"}, - }, - //clear text - Text{"a Spirit Temple Small Key", /*french*/"une petite clé du Temple de l'Esprit", /*spanish*/"una llave pequeña del Templo del Espíritu"} - ); - hintTable[RHT_SHADOW_TEMPLE_SMALL_KEY] = HintText::Item({ - //obscure text - Text{"a creepy tool for unlocking", /*french*/"un anti-porte sinistre", /*spanish*/"una clave de una entrada siniestra:a"}, - Text{"a creepy dungeon pass", /*french*/"le rêve sinistre d'un prisonnier", /*spanish*/"un pase de una mazmorra siniestra:a"}, - Text{"a creepy lock remover", /*french*/"un efface-serrure sinistre", /*spanish*/"un destructor de cerraduras siniestra:a"}, - Text{"a creepy lockpick", /*french*/"un crochet à porte sinistre", /*spanish*/"una apertura portentosa siniestra:a"}, - }, { - //ambiguous text - Text{"a small key", /*french*/"une petite clé", /*spanish*/"una llave pequeña"}, - }, - //clear text - Text{"a Shadow Temple Small Key", /*french*/"une petite clé du Temple de l'Ombre", /*spanish*/"una llave pequeña del Templo de las Sombras"} - ); - hintTable[RHT_GERUDO_TRAINING_GROUNDS_SMALL_KEY] = HintText::Item({ - //obscure text - Text{"a labyrinthian tool for unlocking", /*french*/"un anti-porte labyrinthique", /*spanish*/"una clave de una entrada laberíntica"}, - Text{"a labyrinthian dungeon pass", /*french*/"le rêve labyrinthique d'un prisonnier", /*spanish*/"un pase de una mazmorra laberíntica"}, - Text{"a labyrinthian lock remover", /*french*/"un efface-serrure labyrinthique", /*spanish*/"un destructor de cerraduras laberíntica"}, - Text{"a labyrinthian lockpick", /*french*/"un crochet à porte labyrinthique", /*spanish*/"una apertura portentosa laberíntica"}, - }, { - //ambiguous text - Text{"a small key", /*french*/"une petite clé", /*spanish*/"una llave pequeña"}, - }, - //clear text - Text{"a Gerudo Training Ground Small Key", /*french*/"une petite clé du Gymnase Gerudo", /*spanish*/"una llave pequeña del Centro de Instrucción Gerudo"} - ); - hintTable[RHT_GERUDO_FORTRESS_SMALL_KEY] = HintText::Item({ - //obscure text - Text{"an imprisoned tool for unlocking", /*french*/"un anti-porte emprisonné", /*spanish*/"una clave de una entrada encarcelada"}, - Text{"an imprisoned dungeon pass", /*french*/"le rêve emprisonné d'un prisonnier", /*spanish*/"un pase de una mazmorra encarcelada"}, - Text{"an imprisoned lock remover", /*french*/"un efface-serrure emprisonné", /*spanish*/"un destructor de cerraduras encarcelada"}, - Text{"an imprisoned lockpick", /*french*/"un crochet à porte emprisonné", /*spanish*/"una apertura portentosa encarcelada"}, - }, { - //ambiguous text - Text{"a small key", /*french*/"une petite clé", /*spanish*/"una llave pequeña"}, - }, - //clear text - Text{"a Gerudo Fortress Small Key", /*french*/"une petite clé de la Repaire des Voleurs", /*spanish*/"una llave pequeña de la Fortaleza Gerudo"} - ); - hintTable[RHT_BOTTOM_OF_THE_WELL_SMALL_KEY] = HintText::Item({ - //obscure text - Text{"a moldy tool for unlocking", /*french*/"un anti-porte moisi", /*spanish*/"una clave de una entrada mohosa"}, - Text{"a moldy dungeon pass", /*french*/"le rêve moisi d'un prisonnier", /*spanish*/"un pase de una mazmorra mohosa"}, - Text{"a moldy lock remover", /*french*/"un efface-serrure moisi", /*spanish*/"un destructor de cerraduras mohosa"}, - Text{"a moldy lockpick", /*french*/"un crochet à porte moisi", /*spanish*/"una apertura portentosa mohosa"}, - }, { - //ambiguous text - Text{"a small key", /*french*/"une petite clé", /*spanish*/"una llave pequeña"}, - }, - //clear text - Text{"a Bottom of the Well Small Key", /*french*/"une petite clé du fond du Puits", /*spanish*/"una llave pequeña del Fondo del pozo"} - ); - hintTable[RHT_GANONS_CASTLE_SMALL_KEY] = HintText::Item({ - //obscure text - Text{"a final tool for unlocking", /*french*/"un anti-porte final", /*spanish*/"una clave de una entrada final"}, - Text{"a final dungeon pass", /*french*/"le rêve final d'un prisonnier", /*spanish*/"un pase de una mazmorra final"}, - Text{"a final lock remover", /*french*/"un efface-serrure final", /*spanish*/"un destructor de cerraduras final"}, - Text{"a final lockpick", /*french*/"un crochet à porte final", /*spanish*/"una apertura portentosa final"}, - }, { - //ambiguous text - Text{"a small key", /*french*/"une petite clé", /*spanish*/"una llave pequeña"}, - }, - //clear text - Text{"a Ganon's Castle Small Key", /*french*/"une petite clé du Château de Ganon", /*spanish*/"una llave pequeña del Castillo de Ganon"} - ); - hintTable[RHT_FOREST_TEMPLE_KEY_RING] = HintText::Item({ - //obscure text - Text{"a sylvan toolbox for unlocking", /*french*/"des anti-portes sylvestres", /*spanish*/"un conjunto silvestre de cerrajero"}, - Text{"a sylvan dungeon season pass", /*french*/"les rêves sylvestres d'un prisonnier", /*spanish*/"un pase vip de mazmorras silvestre"}, - Text{"a sylvan jingling ring", /*french*/"des efface-serrures sylvestres", /*spanish*/"una cadena multiusos silvestre"}, - Text{"a sylvan skeleton key", /*french*/"des crochets à porte sylvestres", /*spanish*/"un anillo silvestre contra cerrojos"}, - }, { - //ambiguous text - Text{"a key ring", /*french*/"un trousseau de clés", /*spanish*/"un llavero"}, - }, - //clear text - Text{"a Forest Temple Key Ring", /*french*/"un trousseau de clés du Temple de la Forêt", /*spanish*/"un llavero del Templo del Bosque"} - ); - hintTable[RHT_FIRE_TEMPLE_KEY_RING] = HintText::Item({ - //obscure text - Text{"a molten toolbox for unlocking", /*french*/"des anti-portes fondus", /*spanish*/"un conjunto fundido de cerrajero"}, - Text{"a molten dungeon season pass", /*french*/"les rêves fondus d'un prisonnier", /*spanish*/"un pase vip de mazmorras fundido"}, - Text{"a molten jingling ring", /*french*/"des efface-serrures fondus", /*spanish*/"una cadena multiusos fundida"}, - Text{"a molten skeleton key", /*french*/"des crochets à porte fondus", /*spanish*/"un anillo fundido contra cerrojos"}, - }, { - //ambiguous text - Text{"a key ring", /*french*/"un trousseau de clés", /*spanish*/"un llavero"}, - }, - //clear text - Text{"a Fire Temple Key Ring", /*french*/"un trousseau de clés du Temple du Feu", /*spanish*/"un llavero del Templo del Fuego"} - ); - hintTable[RHT_WATER_TEMPLE_KEY_RING] = HintText::Item({ - //obscure text - Text{"a wet toolbox for unlocking", /*french*/"des anti-portes humides", /*spanish*/"un conjunto abisal de cerrajero"}, - Text{"a wet dungeon season pass", /*french*/"les rêves humides d'un prisonnier", /*spanish*/"un pase vip de mazmorras abisal"}, - Text{"a wet jingling ring", /*french*/"des efface-serrures humides", /*spanish*/"una cadena multiusos abisal"}, - Text{"a wet skeleton key", /*french*/"des crochets à porte humides", /*spanish*/"un anillo abisal contra cerrojos"}, - }, { - //ambiguous text - Text{"a key ring", /*french*/"un trousseau de clés", /*spanish*/"un llavero"}, - }, - //clear text - Text{"a Water Temple Key Ring", /*french*/"un trousseau de clés du Temple de l'Eau", /*spanish*/"un llavero del Templo del Agua"} - ); - hintTable[RHT_SPIRIT_TEMPLE_KEY_RING] = HintText::Item({ - //obscure text - Text{"a sandy toolbox for unlocking", /*french*/"des anti-portes sableux", /*spanish*/"un conjunto arenoso de cerrajero"}, - Text{"a sandy dungeon season pass", /*french*/"les rêves sableux d'un prisonnier", /*spanish*/"un pase vip de mazmorras arenoso"}, - Text{"a sandy jingling ring", /*french*/"des efface-serrures sableux", /*spanish*/"una cadena multiusos arenosa"}, - Text{"a sandy skeleton key", /*french*/"des crochets à porte sableux", /*spanish*/"un anillo arenoso contra cerrojos"}, - }, { - //ambiguous text - Text{"a key ring", /*french*/"un trousseau de clés", /*spanish*/"un llavero"}, - }, - //clear text - Text{"a Spirit Temple Key Ring", /*french*/"un trousseau de clés du Temple de l'Esprit", /*spanish*/"un llavero del Templo del Espíritu"} - ); - hintTable[RHT_SHADOW_TEMPLE_KEY_RING] = HintText::Item({ - //obscure text - Text{"a creepy toolbox for unlocking", /*french*/"des anti-portes sinistres", /*spanish*/"un conjunto tenebroso de cerrajero"}, - Text{"a creepy dungeon season pass", /*french*/"les rêves sinistres d'un prisonnier", /*spanish*/"un pase vip de mazmorras tenebroso"}, - Text{"a creepy jingling ring", /*french*/"des efface-serrures sinistres", /*spanish*/"una cadena multiusos tenebrosa"}, - Text{"a creepy skeleton key", /*french*/"des crochets à porte sinistres", /*spanish*/"un anillo tenebroso contra cerrojos"}, - }, { - //ambiguous text - Text{"a key ring", /*french*/"un trousseau de clés", /*spanish*/"un llavero"}, - }, - //clear text - Text{"a Shadow Temple Key Ring", /*french*/"un trousseau de clés du Temple de l'Ombre", /*spanish*/"un llavero del Templo de las Sombras"} - ); - hintTable[RHT_GERUDO_TRAINING_GROUNDS_KEY_RING] = HintText::Item({ - //obscure text - Text{"a labyrinthian toolbox for unlocking", /*french*/"des anti-portes labyrinthiques", /*spanish*/"un conjunto laberíntico de cerrajero"}, - Text{"a labyrinthian dungeon season pass", /*french*/"les rêves labyrinthiques d'un prisonnier", /*spanish*/"un pase vip de mazmorras laberíntico"}, - Text{"a labyrinthian jingling ring", /*french*/"des efface-serrures labyrinthiques", /*spanish*/"una cadena multiusos laberíntica"}, - Text{"a labyrinthian skeleton key", /*french*/"des crochets à porte labyrinthiques", /*spanish*/"un anillo laberíntico contra cerrojos"}, - }, { - //ambiguous text - Text{"a key ring", /*french*/"un trousseau de clés", /*spanish*/"un llavero"}, - }, - //clear text - Text{"a Gerudo Training Ground Key Ring", /*french*/"un trousseau de clés du Gymnase Gerudo", /*spanish*/"un llavero del Centro de Instrucción Gerudo"} - ); - hintTable[RHT_GERUDO_FORTRESS_KEY_RING] = HintText::Item({ - //obscure text - Text{"an imprisoned toolbox for unlocking", /*french*/"des anti-portes emprisonnés", /*spanish*/"un conjunto enjaulado de cerrajero"}, - Text{"an imprisoned dungeon season pass", /*french*/"les rêves emprisonnés d'un prisonnier", /*spanish*/"un pase vip de una mazmorra enjaulado"}, - Text{"an imprisoned jingling ring", /*french*/"des efface-serrures emprisonnés", /*spanish*/"una cadena multiusos enjaulada"}, - Text{"an imprisoned skeleton key", /*french*/"des crochets à porte emprisonnés", /*spanish*/"un anillo enjaulado contra cerrojos"}, - }, { - //ambiguous text - Text{"a key ring", /*french*/"un trousseau de clés", /*spanish*/"un llavero"}, - }, - //clear text - Text{"a Gerudo Fortress Key Ring", /*french*/"un trousseau de clés de la Repaire des Voleurs", /*spanish*/"un llavero de la Fortaleza Gerudo"} - ); - hintTable[RHT_BOTTOM_OF_THE_WELL_KEY_RING] = HintText::Item({ - //obscure text - Text{"a moldy toolbox for unlocking", /*french*/"des anti-portes moisis", /*spanish*/"un conjunto subterráneo de cerrajero"}, - Text{"a moldy dungeon season pass", /*french*/"les rêves moisis d'un prisonnier", /*spanish*/"un pase vip de una mazmorra subterráneo"}, - Text{"a moldy jingling ring", /*french*/"des efface-serrures moisis", /*spanish*/"una cadena multiusos subterránea"}, - Text{"a moldy skeleton key", /*french*/"des crochets à porte moisis", /*spanish*/"un anillo subterráneo contra cerrojos"}, - }, { - //ambiguous text - Text{"a key ring", /*french*/"un trousseau de clés", /*spanish*/"un llavero"}, - }, - //clear text - Text{"a Bottom of the Well Key Ring", /*french*/"un trousseau de clés du fond du Puits", /*spanish*/"un llavero del Fondo del pozo"} - ); - hintTable[RHT_GANONS_CASTLE_KEY_RING] = HintText::Item({ - //obscure text - Text{"a final toolbox for unlocking", /*french*/"des anti-portes finaux", /*spanish*/"un conjunto decisivo de cerrajero"}, - Text{"a final dungeon season pass", /*french*/"les rêves finaux d'un prisonnier", /*spanish*/"un pase vip de una mazmorra decisivo"}, - Text{"a final jingling ring", /*french*/"des efface-serrures finaux", /*spanish*/"una cadena multiusos decisiva"}, - Text{"a final skeleton key", /*french*/"des crochets à porte finaux", /*spanish*/"un anillo decisivo multiusos"}, - }, { - //ambiguous text - Text{"a key ring", /*french*/"un trousseau de clés", /*spanish*/"un llavero"}, - }, - //clear text - Text{"a Ganon's Castle Key Ring", /*french*/"un trousseau de clés du Château de Ganon", /*spanish*/"un llavero del Castillo de Ganon"} - ); - - hintTable[RHT_TREASURE_GAME_SMALL_KEY] = HintText::Item({ - //obscure text - Text{"a gambler's tool for unlocking", /*french*/"un anti-porte de parieur", /*spanish*/"una clave de un juego de azar"}, - Text{"a gambler's dungeon pass", /*french*/"le rêve d'un prisonnier parieur", /*spanish*/"un pase de un juego de azar"}, - Text{"a gambler's lock remover", /*french*/"un efface-serrure de parieur", /*spanish*/"un destructor de cerraduras del juego de azar"}, - Text{"a gambler's lockpick", /*french*/"un crochet à serrure de parieur", /*spanish*/"una apertura portentosa del juego de azar"}, - }, { - //ambiguous text - Text{"a small key", /*french*/"une petite clé", /*spanish*/"una llave pequeña"}, - }, - //clear text - Text{"a Treasure Chest Shop Small Key", /*french*/"une petite clé de la chasse aux trésors", /*spanish*/"una llave pequeña del Cofre del Tesoro"} - ); - - hintTable[RHT_KOKIRI_EMERALD] = HintText::Item({ - //obscure text - Text{"a green stone", /*french*/"une pierre verte", /*spanish*/"una piedra verde"}, - Text{"a gift before death", /*french*/"le dernier souffle d'un arbre", /*spanish*/"un obsequio testamentario"}, - }, { - //ambiguous text - Text{"a spiritual stone", /*french*/"une Pierre Ancestrale", /*spanish*/"una piedra espiritual"}, - }, - //clear text - Text{"the Kokiri Emerald", /*french*/"l'Émeraude Kokiri", /*spanish*/"la Esmeralda de los Kokiri"} - ); - - hintTable[RHT_GORON_RUBY] = HintText::Item({ - //obscure text - Text{"a red stone", /*french*/"une pierre rouge", /*spanish*/"una piedra carmín"}, - Text{"sworn brotherhood", /*french*/"un serment de fraternité", /*spanish*/"el juramento de hermanos de sangre"}, - }, { - //ambiguous text - Text{"a spiritual stone", /*french*/"une Pierre Ancestrale", /*spanish*/"una piedra espiritual"}, - }, - //clear text - Text{"the Goron Ruby", /*french*/"le Rubis Goron", /*spanish*/"el Rubí de los Goron"} - ); - - hintTable[RHT_ZORA_SAPPHIRE] = HintText::Item({ - //obscure text - Text{"a blue stone", /*french*/"une pierre bleue", /*spanish*/"una piedra celeste"}, - Text{"an engagement gift", /*french*/"un cadeau de mariage", /*spanish*/"un regalo de compromiso"}, - }, { - //ambiguous text - Text{"a spiritual stone", /*french*/"une Pierre Ancestrale", /*spanish*/"una piedra espiritual"}, - }, - //clear text - Text{"the Zora Sapphire", /*french*/"le Saphir Zora", /*spanish*/"el Zafiro de los Zora"} - ); - - hintTable[RHT_FOREST_MEDALLION] = HintText::Item({ - //obscure text - Text{"a green coin", /*french*/"une pièce verte", /*spanish*/"una moneda esmeralda"}, - Text{"Saria's friendship", /*french*/"l'amitié de Saria", /*spanish*/"la amistad de Saria"}, - }, { - //ambiguous text - Text{"a medallion", /*french*/"un médaillon", /*spanish*/"un medallón"}, - }, - //clear text - Text{"the Forest Medallion", /*french*/"le Médaillon de la Forêt", /*spanish*/"el Medallón del Bosque"} - ); - - hintTable[RHT_FIRE_MEDALLION] = HintText::Item({ - //obscure text - Text{"a red coin", /*french*/"une pièce rouge", /*spanish*/"una moneda rubí"}, - Text{"Darunia's power", /*french*/"la fraternité de Darunia", /*spanish*/"la fraternidad de Darunia"}, - }, { - //ambiguous text - Text{"a medallion", /*french*/"un médaillon", /*spanish*/"un medallón"}, - }, - //clear text - Text{"the Fire Medallion", /*french*/"le Médaillon du Feu", /*spanish*/"el Medallón del Fuego"} - ); - - hintTable[RHT_WATER_MEDALLION] = HintText::Item({ - //obscure text - Text{"a blue coin", /*french*/"une pièce bleue", /*spanish*/"una moneda zafiro"}, - Text{"Ruto's power", /*french*/"l'amour de Ruto", /*spanish*/"el amor de Ruto"}, - }, { - //ambiguous text - Text{"a medallion", /*french*/"un médaillon", /*spanish*/"un medallón"}, - }, - //clear text - Text{"the Water Medallion", /*french*/"le Médaillon de l'Eau", /*spanish*/"el Medallón del Agua"} - ); - - hintTable[RHT_SPIRIT_MEDALLION] = HintText::Item({ - //obscure text - Text{"an orange coin", /*french*/"une pièce orange", /*spanish*/"una moneda ámbar"}, - Text{"Nabooru's power", /*french*/"le respect de Nabooru", /*spanish*/"el respeto de Nabooru"}, - }, { - //ambiguous text - Text{"a medallion", /*french*/"un médaillon", /*spanish*/"un medallón"}, - }, - //clear text - Text{"the Spirit Medallion", /*french*/"le Médaillon de l'Esprit", /*spanish*/"el Medallón del Espíritu"} - ); - - hintTable[RHT_SHADOW_MEDALLION] = HintText::Item({ - //obscure text - Text{"a purple coin", /*french*/"une pièce pourpre", /*spanish*/"una moneda malva"}, - Text{"Impa's power", /*french*/"la confiance d'Impa", /*spanish*/"la confianza de Impa"}, - }, { - //ambiguous text - Text{"a medallion", /*french*/"un médaillon", /*spanish*/"un medallón"}, - }, - //clear text - Text{"the Shadow Medallion", /*french*/"le Médaillon de l'Ombre", /*spanish*/"el Medallón de la Sombra"} - ); - - hintTable[RHT_LIGHT_MEDALLION] = HintText::Item({ - //obscure text - Text{"a yellow coin", /*french*/"une pièce jaune", /*spanish*/"una moneda resplandeciente"}, - Text{"Rauru's power", /*french*/"la foi de Rauru", /*spanish*/"la fe de Rauru"}, - }, { - //ambiguous text - Text{"a medallion", /*french*/"un médaillon", /*spanish*/"un medallón"}, - }, - //clear text - Text{"the Light Medallion", /*french*/"le Médaillon de la Lumière", /*spanish*/"el Medallón de la Luz"} - ); - - hintTable[RHT_RECOVERY_HEART] = HintText::Item({ - //obscure text - Text{"a free heal", /*french*/"un bec-au-bobo", /*spanish*/"una cura de regalo"}, - Text{"a hearty meal", /*french*/"un petit amour", /*spanish*/"una sanación romántica"}, - Text{"a Band-Aid", /*french*/"un diachylon", /*spanish*/"un corazoncito sanador"}, - }, { - //ambiguous text - Text{"something heart-shaped", /*french*/"une chose en forme de coeur", /*spanish*/"algo con forma de corazón"}, - }, - //clear text - Text{"a Recovery Heart", /*french*/"un coeur de vie", /*spanish*/"un corazón"} - ); - - hintTable[RHT_GREEN_RUPEE] = HintText::Item({ - //obscure text - Text{"a unique coin", /*french*/"un rubis bien mérité", /*spanish*/"una singular moneda"}, - Text{"a penny", /*french*/"un sou", /*spanish*/"un peso hyliano"}, - Text{"a green gem", /*french*/"un joyau vert", /*spanish*/"una gema verde"}, - }, { - //ambiguous text - Text{"some rupees", /*french*/"une quantité de rubis", /*spanish*/"una cantidad de rupias"}, - }, - //clear text - Text{"a Green Rupee", /*french*/"un rubis vert", /*spanish*/"una rupia verde"} - ); - - hintTable[RHT_GREG_RUPEE] = HintText::Item({ - //obscure text - Text{"an old friend", /*french*/"Greg", /*spanish*/"Greg"}, - Text{"a glorious gem", /*french*/"Greg", /*spanish*/"Greg"}, - }, { - //ambiguous text - Text{"a Green Rupee", /*french*/"un rubis vert", /*spanish*/"una rupia verde"} - }, - //clear text - Text{"Greg", /*french*/"Greg", /*spanish*/"Greg"} - ); - - hintTable[RHT_BLUE_RUPEE] = HintText::Item({ - //obscure text - Text{"a common coin", /*french*/"quelques sous", /*spanish*/"una moneda usual"}, - Text{"a blue gem", /*french*/"un joyau bleu", /*spanish*/"una gema azul"}, - }, { - //ambiguous text - Text{"some rupees", /*french*/"une quantité de rubis", /*spanish*/"una cantidad de rupias"}, - }, - //clear text - Text{"a Blue Rupee", /*french*/"un rubis bleu", /*spanish*/"una rupia azul"} - ); - - hintTable[RHT_RED_RUPEE] = HintText::Item({ - //obscure text - Text{"couch cash", /*french*/"un peu de fric", /*spanish*/"una buena moneda"}, - Text{"a red gem", /*french*/"un joyau rouge", /*spanish*/"una gema roja"}, - }, { - //ambiguous text - Text{"some rupees", /*french*/"une quantité de rubis", /*spanish*/"una cantidad de rupias"}, - }, - //clear text - Text{"a Red Rupee", /*french*/"un rubis rouge", /*spanish*/"una rupia roja"} - ); - - hintTable[RHT_PURPLE_RUPEE] = HintText::Item({ - //obscure text - Text{"big bucks", /*french*/"plein de fric", /*spanish*/"plata de calidad"}, - Text{"a purple gem", /*french*/"un joyau mauve", /*spanish*/"una gema morada"}, - Text{"wealth", /*french*/"la richesse", /*spanish*/"una buena riqueza"}, - }, { - //ambiguous text - Text{"some rupees", /*french*/"une quantité de rubis", /*spanish*/"una cantidad de rupias"}, - }, - //clear text - Text{"a Purple Rupee", /*french*/"un rubis pourpre", /*spanish*/"una rupia morada"} - ); - - hintTable[RHT_HUGE_RUPEE] = HintText::Item({ - //obscure text - Text{"a juicy jackpot", /*french*/"le jackpot", /*spanish*/"el premio gordo"}, - Text{"a yellow gem", /*french*/"un joyau doré", /*spanish*/"una gema amarilla"}, - Text{"a giant gem", /*french*/"un gros joyau", /*spanish*/"una gema descomunal"}, - Text{"great wealth", /*french*/"l'aisance financière", /*spanish*/"dinero a caudales"}, - }, { - //ambiguous text - Text{"some rupees", /*french*/"une quantité de rubis", /*spanish*/"una cantidad de rupias"}, - }, - //clear text - Text{"a Huge Rupee", /*french*/"un énorme rubis", /*spanish*/"una rupia gigante"} - ); - - hintTable[RHT_PIECE_OF_HEART] = HintText::Item({ - //obscure text - Text{"a little love", /*french*/"un peu plus d'amour", /*spanish*/"un cuarto de amor"}, - Text{"a broken heart", /*french*/"un coeur brisé", /*spanish*/"un corazón roto"}, - }, { - //ambiguous text - Text{"something heart-shaped", /*french*/"une chose en forme de coeur", /*spanish*/"algo con forma de corazón"}, - }, - //clear text - Text{"a Piece of Heart", /*french*/"un Quart de Coeur", /*spanish*/"una pieza de corazón"} - ); - - hintTable[RHT_HEART_CONTAINER] = HintText::Item({ - //obscure text - Text{"a lot of love", /*french*/"le grand amour", /*spanish*/"amor por doquier"}, - Text{"a Valentine's gift", /*french*/"un cadeau de Saint-Valentin", /*spanish*/"un contenedor de afección"}, - Text{"a boss's organ", /*french*/"un organe de monstre", /*spanish*/"los órganos de un jefe"}, - }, { - //ambiguous text - Text{"something heart-shaped", /*french*/"une chose en forme de coeur", /*spanish*/"algo con forma de corazón"}, - }, - //clear text - Text{"a Heart Container", /*french*/"un Réceptacle de Coeur", /*spanish*/"un contenedor de corazón"} - ); - - hintTable[RHT_ICE_TRAP] = HintText::Item({ - //obscure text - Text{"a gift from Ganon", /*french*/"un cadeau de Ganon", /*spanish*/"un regalo de Ganon"}, - Text{"a chilling discovery", /*french*/"une frissonante découverte", /*spanish*/"un escalofriante hallazgo"}, - Text{"frosty fun", /*french*/"une engelure", /*spanish*/"una gélida diversión"}, - }, { - //ambiguous text - Text{"a Great Fairy's power", /*french*/"le pouvoir d'une grande fée", /*spanish*/"el poder de una Gran Hada"}, - Text{"a magic arrow", /*french*/"une flèche magique", /*spanish*/"una flecha mágica"}, - Text{"a medallion", /*french*/"un médaillon", /*spanish*/"un medallón"}, - Text{"a spiritual stone", /*french*/"une Pierre Ancestrale", /*spanish*/"una piedra espiritual"}, - Text{"something that can stun", /*french*/"une chose qui peut paralyser", /*spanish*/"algo que pueda paralizar"}, - }, - //clear text - Text{"an Ice Trap", /*french*/"un Piège de Glace", /*spanish*/"una trampa de hielo"} - ); - - //RHT_MILK - - hintTable[RHT_BOMBS_5] = HintText::Item({ - //obscure text - Text{"a few explosives", /*french*/"une poignée de pétards", /*spanish*/"un par de explosivos"}, - Text{"a few blast balls", /*french*/"une poignée de boules bleues", /*spanish*/"un par de estallidos"}, - }, { - //ambiguous text - Text{"explosives", /*french*/"un paquet d'explosifs", /*spanish*/"un montón de explosivos"}, - }, - //clear text - Text{"Bombs (5 pieces)", /*french*/"une demi-dizaine de bombes", /*spanish*/"unas (5) bombas"} - ); - - hintTable[RHT_BOMBS_10] = HintText::Item({ - //obscure text - Text{"some explosives", /*french*/"un paquet de pétards", /*spanish*/"unos cuantos explosivos"}, - Text{"some blast balls", /*french*/"un paquet de boules bleues", /*spanish*/"unos cuantos estallidos"}, - }, { - //ambiguous text - Text{"explosives", /*french*/"un paquet d'explosifs", /*spanish*/"un montón de explosivos"}, - }, - //clear text - Text{"Bombs (10 pieces)", /*french*/"une dizaine de bombes", /*spanish*/"unas (10) bombas"} - ); - - hintTable[RHT_BOMBS_20] = HintText::Item({ - //obscure text - Text{"lots-o-explosives", /*french*/"une abondance de pétards", /*spanish*/"un puñado de explosivos"}, - Text{"plenty of blast balls", /*french*/"une abondance de boules bleues", /*spanish*/"bastantes estallidos"}, - }, { - //ambiguous text - Text{"explosives", /*french*/"un paquet d'explosifs", /*spanish*/"un montón de explosivos"}, - }, - //clear text - Text{"Bombs (20 pieces)", /*french*/"une vingtaine de bombes", /*spanish*/"unas (20) bombas"} - ); - - hintTable[RHT_BOMBCHU_5] = HintText::Item({ - //obscure text - Text{"a few mice bombs", /*french*/"une poignée de mignons explosifs", /*spanish*/"un par de bombas roedoras"}, - Text{"a few proximity mice", /*french*/"une poignée de jouets à remonter", /*spanish*/"un par de explosivos ratoncitos"}, - Text{"a few wall crawlers", /*french*/"une poignée de rapides grimpeurs", /*spanish*/"un par de trepaparedes"}, - Text{"a few trail blazers", /*french*/"une poignée de zigzags éclatants", /*spanish*/"un par de ratas propulsadas"}, - }, { - //ambiguous text - Text{"a prize of the House of Skulltulas", /*french*/"un prix de la maison des Skulltulas", /*spanish*/"un obsequio de la Casa Skulltula"}, - Text{"explosives", /*french*/"un paquet d'explosifs", /*spanish*/"un montón de explosivos"}, - }, - //clear text - Text{"Bombchus (5 pieces)", /*french*/"une demi-dizaine de Missiles", /*spanish*/"unos (5) bombchus"} - ); - - hintTable[RHT_BOMBCHU_10] = HintText::Item({ - //obscure text - Text{"some mice bombs", /*french*/"un paquet de mignons explosifs", /*spanish*/"unas cuantas bombas roedoras"}, - Text{"some proximity mice", /*french*/"un paquet de jouets à remonter", /*spanish*/"unos cuantos explosivos ratoncitos"}, - Text{"some wall crawlers", /*french*/"un paquet de rapides grimpeurs", /*spanish*/"unos cuantos trepaparedes"}, - Text{"some trail blazers", /*french*/"un paquet de zigzags éclatants", /*spanish*/"unas cuantas ratas propulsadas"}, - }, { - //ambiguous text - Text{"a prize of the House of Skulltulas", /*french*/"un prix de la maison des Skulltulas", /*spanish*/"un obsequio de la Casa Skulltula"}, - Text{"explosives", /*french*/"un paquet d'explosifs", /*spanish*/"un montón de explosivos"}, - }, - //clear text - Text{"Bombchus (10 pieces)", /*french*/"une dizaine de Missiles", /*spanish*/"unos (10) bombchus"} - ); - - hintTable[RHT_BOMBCHU_20] = HintText::Item({ - //obscure text - Text{"plenty of mice bombs", /*french*/"une abondance de mignons explosifs", /*spanish*/"bastantes bombas roedoras"}, - Text{"plenty of proximity mice", /*french*/"une abondance de jouets à remonter", /*spanish*/"bastantes explosivos ratoncitos"}, - Text{"plenty of wall crawlers", /*french*/"une abondance de rapides grimpeurs", /*spanish*/"bastantes trepaparedes"}, - Text{"plenty of trail blazers", /*french*/"une abondance de zigzags éclatants", /*spanish*/"bastantes ratas propulsadas"}, - }, { - //ambiguous text - Text{"a prize of the House of Skulltulas", /*french*/"un prix de la maison des Skulltulas", /*spanish*/"un obsequio de la Casa Skulltula"}, - Text{"explosives", /*french*/"un paquet d'explosifs", /*spanish*/"un montón de explosivos"}, - }, - //clear text - Text{"Bombchus (20 pieces)", /*french*/"une vingtaine de Missiles", /*spanish*/"unos (20) bombchus"} - ); - - //RHT_BOMBCHU_DROP - - hintTable[RHT_ARROWS_5] = HintText::Item({ - //obscure text - Text{"a few danger darts", /*french*/"une poignée d'obus", /*spanish*/"un par de peligrosos dardos"}, - Text{"a few sharp shafts", /*french*/"une poignée de piquets", /*spanish*/"un par de puntas afiladas"}, - }, { - //ambiguous text - Text{"a projectile", /*french*/"un projectile", /*spanish*/"un proyectil"}, - }, - //clear text - Text{"Arrows (5 pieces)", /*french*/"une demi-dizaine de flèches", /*spanish*/"unas (5) flechas"} - ); - - hintTable[RHT_ARROWS_10] = HintText::Item({ - //obscure text - Text{"some danger darts", /*french*/"un paquet d'obus", /*spanish*/"unos cuantos peligrosos dardos"}, - Text{"some sharp shafts", /*french*/"un paquet de piquets", /*spanish*/"unas cuantas puntas afiladas"}, - }, { - //ambiguous text - Text{"a projectile", /*french*/"un projectile", /*spanish*/"un proyectil"}, - }, - //clear text - Text{"Arrows (10 pieces)", /*french*/"une dizaine de flèches", /*spanish*/"unas (10) flechas"} - ); - - hintTable[RHT_ARROWS_30] = HintText::Item({ - //obscure text - Text{"plenty of danger darts", /*french*/"une abondance d'obus", /*spanish*/"bastantes peligrosos dardos"}, - Text{"plenty of sharp shafts", /*french*/"une abondance de piquets", /*spanish*/"bastantes puntas afiladas"}, - }, { - //ambiguous text - Text{"a projectile", /*french*/"un projectile", /*spanish*/"un proyectil"}, - }, - //clear text - Text{"Arrows (30 pieces)", /*french*/"une trentaine de flèches", /*spanish*/"unas (30) flechas"} - ); - - hintTable[RHT_DEKU_NUTS_5] = HintText::Item({ - //obscure text - Text{"some nuts", /*french*/"une poignée de noisettes", /*spanish*/"un par de nueces"}, - Text{"some flashbangs", /*french*/"une poignée d'éclats", /*spanish*/"un par de semillas aturdidoras"}, - Text{"some scrub spit", /*french*/"une poignée de crachats Mojo", /*spanish*/"un par de escupitajos deku"}, - }, { - //ambiguous text - Text{"some Deku munitions", /*french*/"un paquet de munitions Mojo", /*spanish*/"un montón de municiones Deku"}, - Text{"something that can stun", /*french*/"une chose qui peut paralyser", /*spanish*/"algo que pueda paralizar"}, - }, - //clear text - Text{"Deku Nuts (5 pieces)", /*french*/"une demi-dizaine de noix Mojo", /*spanish*/"unas (5) nueces deku"} - ); - - hintTable[RHT_DEKU_NUTS_10] = HintText::Item({ - //obscure text - Text{"lots-o-nuts", /*french*/"un paquet de noisettes", /*spanish*/"un puñado de nueces"}, - Text{"plenty of flashbangs", /*french*/"un paquet d'éclats", /*spanish*/"unas cuantas semillas aturdidoras"}, - Text{"plenty of scrub spit", /*french*/"un paquet de crachats Mojo", /*spanish*/"unos cuantos escupitajos deku"}, - }, { - //ambiguous text - Text{"some Deku munitions", /*french*/"un paquet de munitions Mojo", /*spanish*/"un montón de municiones Deku"}, - Text{"something that can stun", /*french*/"une chose qui peut paralyser", /*spanish*/"algo que pueda paralizar"}, - }, - //clear text - Text{"Deku Nuts (10 pieces)", /*french*/"une dizaine de noix Mojo", /*spanish*/"unas (10) nueces deku"} - ); - - hintTable[RHT_DEKU_SEEDS_30] = HintText::Item({ - //obscure text - Text{"catapult ammo", /*french*/"un paquet de délicieuses munitions", /*spanish*/"un par de munición infantil"}, - Text{"lots-o-seeds", /*french*/"un paquet de germes séchés", /*spanish*/"un puñado de semillas"}, - }, { - //ambiguous text - Text{"a projectile", /*french*/"un projectile", /*spanish*/"un proyectil"}, - Text{"some Deku munitions", /*french*/"un paquet de munitions Mojo", /*spanish*/"un montón de municiones Deku"}, - }, - //clear text - Text{"Deku Seeds (30 pieces)", /*french*/"une trentaine de graines Mojo", /*spanish*/"unas (30) semillas deku"} - ); - - hintTable[RHT_DEKU_STICK_1] = HintText::Item({ - //obscure text - Text{"a breakable branch", /*french*/"un bout de bois", /*spanish*/"un pequeño báculo"}, - }, { - //ambiguous text - Text{"some Deku munitions", /*french*/"un paquet de munitions Mojo", /*spanish*/"un montón de municiones Deku"}, - }, - //clear text - Text{"a Deku Stick", /*french*/"un bâton Mojo", /*spanish*/"un palo deku"} - ); - - hintTable[RHT_TREASURE_GAME_HEART] = HintText::Item({ - //obscure text - Text{"a victory valentine", /*french*/"un amour gagnant", /*spanish*/"el amor victorioso"}, - }, { - //ambiguous text - Text{"something heart-shaped", /*french*/"une chose en forme de coeur", /*spanish*/"algo con forma de corazón"}, - }, - //clear text - Text{"a Piece of Heart", /*french*/"un Quart de Coeur", /*spanish*/"el amor de la victoria"} - ); - - hintTable[RHT_TREASURE_GAME_GREEN_RUPEE] = HintText::Item({ - //obscure text - Text{"the dollar of defeat", /*french*/"le rubis de la défaite", /*spanish*/"el peso de la derrota"}, - }, { - //ambiguous text - Text{"some rupees", /*french*/"une quantité de rubis", /*spanish*/"una cantidad de rupias"}, - }, - //clear text - Text{"a Green Rupee", /*french*/"un rubis vert", /*spanish*/"una rupia verde"} - ); - - hintTable[RHT_TRIFORCE_PIECE] = HintText::Item({ - //obscure text - Text{"a triumph fork", /*french*/"la Tribosse", /*spanish*/"un trígono del triunfo"}, - Text{"cheese", /*french*/"du fromage", /*spanish*/"un porción de queso"}, - Text{"a gold fragment", /*french*/"un fragment d'or", /*spanish*/"un fragmento dorado"}, - }, {}, - //clear text - Text{"a Piece of the Triforce", /*french*/"un fragment de la Triforce", /*spanish*/"un fragmento de la Trifuerza"} - ); - - hintTable[RHT_GOHMA_SOUL] = HintText::Item({ - //obscure text - Text{"an invasive soul", "", ""}, - Text{"some spider essence", "", ""}, - }, { - //ambiguous text - Text{"something webbed", "", ""} - }, { - //clear text - Text{"the soul of Gohma", "", ""}} - ); - - hintTable[RHT_KING_DODONGO_SOUL] = HintText::Item({ - //obscure text - Text{"a royal soul", "", ""}, - Text{"some reptile essence", "", ""}, - }, { - //ambiguous text - Text{"something explosive", "", ""} - }, { - //clear text - Text{"the soul of King Dodongo", "", ""}} - ); - - hintTable[RHT_BARINADE_SOUL] = HintText::Item({ - //obscure text - Text{"an infectuous soul", "", ""}, - Text{"some parasitic essence", "", ""}, - }, { - //ambiguous text - Text{"something fishy", "", ""} - }, { - //clear text - Text("the soul of Barinade", "", "")} - ); - - hintTable[RHT_PHANTOM_GANON_SOUL] = HintText::Item({ - //obscure text - Text{"a duplicate soul", "", ""}, - Text{"some illusionary essence", "", ""}, - }, { - //ambiguous text - Text{"something spectral", "", ""} - }, { - //clear text - Text{"the soul of Phantom Ganon", "", ""}} - ); - - hintTable[RHT_VOLVAGIA_SOUL] = HintText::Item({ - //obscure text - Text{"a draconic soul", "", ""}, - Text{"some magmatic essence", "", ""}, - }, { - //ambiguous text - Text{"something hot", "", ""} - }, { - //clear text - Text{"the soul of Volvagia", "", ""}} - ); - - hintTable[RHT_MORPHA_SOUL] = HintText::Item({ - //obscure text - Text{"an aquatic soul", "", ""}, - Text{"some liquid essence", "", ""}, - }, { - //ambiguous text - Text{"something wet", "", ""} - }, { - //clear text - Text{"the soul of Barinade", "", ""}} - ); - - hintTable[RHT_BONGO_BONGO_SOUL] = HintText::Item({ - //obscure text - Text{"a shadowy soul", "", ""}, - Text{"some handy essence", "", ""}, - }, { - //ambiguous text - Text{"something dark", "", ""} - }, { - //clear text - Text{"the soul of Bongo Bongo", "", ""}} - ); - - hintTable[RHT_TWINROVA_SOUL] = HintText::Item({ - //obscure text - Text{"old souls", "", ""}, - Text{"twin essences", "", ""}, - }, { - //ambiguous text - Text{"something spiritual", "", ""} - }, { - //clear text - Text{"the soul of Twinrova", "", ""}} - ); - - hintTable[RHT_GANON_SOUL] = HintText::Item({ - //obscure text - Text{"an evil soul", "", ""}, - Text{"some powerful essence", "", ""}, - }, { - //ambiguous text - Text{"something strong", "", ""} - }, { - //clear text - Text{"the soul of Ganon", "", ""}} - ); - - hintTable[RHT_OCARINA_A_BUTTON] = HintText::Item({ - //obscure text - Text{"a musical letter", /*french*/"une lettre musicale", /*spanish*/"una letra musical"}, - }, { - //ambiguous text - Text{"something melodic", /*french*/"quelque chose de mélodieux", /*spanish*/"algo melódico"} - }, { - //clear text - Text{"an Ocarina A Button", /*french*/"la Touche A de l'Ocarina", /*spanish*/"un botón A de Ocarina"}} - ); - - hintTable[RHT_OCARINA_C_UP_BUTTON] = HintText::Item({ - //obscure text - Text{"a high tone", /*french*/"une tonalité élevée", /*spanish*/"un tono alto"}, - }, { - //ambiguous text - Text{"something melodic", /*french*/"quelque chose de mélodieux", /*spanish*/"algo melódico"} - }, { - //clear text - Text{"an Ocarina C Up Button", /*french*/"la Touche C-Haut de l'Ocarina", /*spanish*/"un botón C superior de Ocarina"}} - ); - - hintTable[RHT_OCARINA_C_DOWN_BUTTON] = HintText::Item({ - //obscure text - Text{"a low tone", /*french*/"une tonalité basse", /*spanish*/"un tono bajo"}, - }, { - //ambiguous text - Text{"something melodic", /*french*/"quelque chose de mélodieux", /*spanish*/"algo melódico"} - }, { - //clear text - Text{"an Ocarina C Down Button", /*french*/"la Touche C-Bas de l'Ocarina", /*spanish*/"un botón C inferior de Ocarina"}} - ); - - hintTable[RHT_OCARINA_C_LEFT_BUTTON] = HintText::Item({ - //obscure text - Text{"a leftward tone", /*french*/"une tonalité vers la gauche", /*spanish*/"un tono hacia la izquierda"}, - }, { - //ambiguous text - Text{"something melodic", /*french*/"quelque chose de mélodieux", /*spanish*/"algo melódico"} - }, { - //clear text - Text{"an Ocarina C Left Button", /*french*/"la Touche C-Gauche de l'Ocarina", /*spanish*/"un botón C izquierdo de Ocarina"}} - ); - - hintTable[RHT_OCARINA_C_RIGHT_BUTTON] = HintText::Item({ - //obscure text - Text{"a rightward tone", /*french*/"une tonalité vers la droite", /*spanish*/"un tono hacia la derecha"}, - }, { - //ambiguous text - Text{"something melodic", /*french*/"quelque chose de mélodieux", /*spanish*/"algo melódico"} - }, { - //clear text - Text{"an Ocarina C Right Button", /*french*/"la Touche C-Droit de l'Ocarina", /*spanish*/"un botón C derecho de Ocarina"}} - ); - - hintTable[RHT_FISHING_POLE] = HintText::Item({ - //obscure text - Text{"a fish-puller", /*french*/"(canne à pêche)", /*spanish*/"(caña de pescar)"}, - }, { - //ambiguous text - Text{"the pond owner's property", /*french*/"(canne à pêche)", /*spanish*/"(caña de pescar)"}, - }, - //clear text - Text{"a fishing pole", /*french*/"canne à pêche", /*spanish*/"caña de pescar"} - ); - - hintTable[RHT_EPONA] = HintText::Item({ - //obscure text - Text{"a horse", /*french*/"un fidèle destrier", /*spanish*/"una yegua"}, - Text{"a four legged friend", /*french*/"un puissant animal", /*spanish*/"una amiga cuadrúpeda"}, - }, { - //ambiguous text - Text{"something from Malon", /*french*/"un cadeau de Malon", /*spanish*/"un obsequio de Malon"}, - Text{"a song sung by frogs", /*french*/"une chanson aimée des grenouilles", /*spanish*/"una melodía de ranas"}, - Text{"something to cross a broken bridge", /*french*/"une chose pour traverser un pont brisé", /*spanish*/"algo para cruzar un puente roto"}, - }, - //clear text - Text{"Epona", /*french*/"Epona", /*spanish*/"a Epona"} - ); - hintTable[RHT_HINT_MYSTERIOUS] = HintText::Item({ - Text{"something mysterious", /*french*/"un sacré mystère", /*spanish*/"algo misterioso", /*german*/"etwas Unvorhergesehenes"}, - Text{"an unknown treasure", /*french*/"un trésor inconnu", /*spanish*/"un desconocido tesoro", /*german*/"ein unbekannter Schatz"}, - }); - - // [RHT_HINT_ERROR] = HintText::Item({ - // //obscure text - // Text{"something mysterious", /*french*/"un sacré mystère", /*spanish*/"algo misterioso"}, - // Text{"an unknown treasure", /*french*/"un trésor inconnu", /*spanish*/"un desconocido tesoro"}, - // }, - // //clear text - // Text{"An Error (Please Report This)", /*french*/"une erreur (signaler S.V.P.)", /*spanish*/"un error (repórtelo si es posible)"} - // ); +#include "../../static_data.h" +#include "../hints.hpp" +#include "../../../custom-message/CustomMessageManager.h" + +namespace Rando { + +void StaticData::HintTable_Init_Item() { + + hintTextTable[RHT_KOKIRI_SWORD] = HintText(CustomMessage("the Kokiri Sword", /*german*/"", /*french*/"l'Épée Kokiri"), + // /*spanish*/la Espada Kokiri + { + CustomMessage("a sword", /*german*/"", /*french*/"une épée") + // /*spanish*/una espada + }, { + CustomMessage("a butter knife", /*german*/"", /*french*/"un couteau à beurre"), + // /*spanish*/un ágil puñal + CustomMessage("a starter slasher", /*german*/"", /*french*/"une arme de débutant"), + // /*spanish*/una hoja de principiantes + CustomMessage("a switchblade", /*german*/"", /*french*/"un canif")}); + // /*spanish*/una navaja + + hintTextTable[RHT_MASTER_SWORD] = HintText(CustomMessage("the Master Sword", /*german*/"", /*french*/"l'Épée de Légende"), + // /*spanish*/la Espada Maestra + { + CustomMessage("a sword", /*german*/"", /*french*/"une épée") + // /*spanish*/una espada + }, { + CustomMessage("evil's bane", /*german*/"", /*french*/"le fléau du mal"), + // /*spanish*/la destructora del mal + CustomMessage("a seven year limbo", /*german*/"", /*french*/"une stase de sept ans")}); + // /*spanish*/unos siete años de espera + + hintTextTable[RHT_GIANTS_KNIFE] = HintText(CustomMessage("the Giant's Knife", /*german*/"", /*french*/"la Lame des Géants"), + // /*spanish*/la daga gigante + { + CustomMessage("a sword", /*german*/"", /*french*/"une épée") + // /*spanish*/una espada + }, { + CustomMessage("a fragile blade", /*german*/"", /*french*/"une lame fragile"), + // /*spanish*/una frágil hoja + CustomMessage("a breakable cleaver", /*german*/"", /*french*/"un espadon de verre")}); + // /*spanish*/un rompible acero + + hintTextTable[RHT_BIGGORON_SWORD] = HintText(CustomMessage("the Biggoron Sword", /*german*/"", /*french*/"l'Épée de Biggoron"), + // /*spanish*/la Espada de Biggoron + { + CustomMessage("a sword", /*german*/"", /*french*/"une épée") + // /*spanish*/una espada + }, { + CustomMessage("the biggest blade", /*german*/"", /*french*/"une lame gigantesque"), + // /*spanish*/el mayor mandoble + CustomMessage("a colossal cleaver", /*german*/"", /*french*/"un espadon colossal")}); + // /*spanish*/un estoque colosal + + hintTextTable[RHT_DEKU_SHIELD] = HintText(CustomMessage("a Deku Shield", /*german*/"", /*french*/"un Bouclier Mojo"), + // /*spanish*/un escudo deku + { + CustomMessage("a shield", /*german*/"", /*french*/"un bouclier") + // /*spanish*/un escudo + }, { + CustomMessage("a wooden ward", /*german*/"", /*french*/"un écu d'écorce"), + // /*spanish*/una protección del bosque + CustomMessage("a burnable barrier", /*german*/"", /*french*/"une protection inflammable")}); + // /*spanish*/una barrera quemable + + hintTextTable[RHT_HYLIAN_SHIELD] = HintText(CustomMessage("a Hylian Shield", /*german*/"", /*french*/"un Bouclier Hylien"), + // /*spanish*/un escudo hyliano + { + CustomMessage("a shield", /*german*/"", /*french*/"un bouclier") + // /*spanish*/un escudo + }, { + CustomMessage("a steel safeguard", /*german*/"", /*french*/"une carapace d'acier"), + // /*spanish*/una protección de acero + CustomMessage("Like Like's metal meal", /*german*/"", /*french*/"un amuse-gueule de Pudding")}); + // /*spanish*/un alimento de Like Like + + hintTextTable[RHT_MIRROR_SHIELD] = HintText(CustomMessage("the Mirror Shield", /*german*/"", /*french*/"le Bouclier Miroir"), + // /*spanish*/el escudo espejo + { + CustomMessage("a shield", /*german*/"", /*french*/"un bouclier") + // /*spanish*/un escudo + }, { + CustomMessage("a reflective rampart", /*german*/"", /*french*/"un capteur de lumière"), + // /*spanish*/una muralla reflectora + CustomMessage("Medusa's weakness", /*german*/"", /*french*/"la faiblesse de Méduse"), + // /*spanish*/la debilidad de Medusa + CustomMessage("a silvered surface", /*german*/"", /*french*/"une surface argentée")}); + // /*spanish*/una superficie plateada + + hintTextTable[RHT_GORON_TUNIC] = HintText(CustomMessage("a Goron Tunic", /*german*/"", /*french*/"une Tunique Goron"), + // /*spanish*/un sayo goron + { + CustomMessage("a tunic", /*german*/"", /*french*/"une tunique") + // /*spanish*/un sayo + }, { + CustomMessage("ruby robes", /*german*/"", /*french*/"un pigment rouge"), + // /*spanish*/una vestimenta rubí + CustomMessage("fireproof fabric", /*german*/"", /*french*/"un trésor anti-flamme"), + // /*spanish*/una ignífuga prenda + CustomMessage("cooking clothes", /*german*/"", /*french*/"une tenue de cuisine")}); + // /*spanish*/unos abrasantes ropajes + + hintTextTable[RHT_ZORA_TUNIC] = HintText(CustomMessage("a Zora Tunic", /*german*/"", /*french*/"une Tunique Zora"), + // /*spanish*/un sayo zora + { + CustomMessage("a tunic", /*german*/"", /*french*/"une tunique"), + // /*spanish*/un sayo + CustomMessage("something expensive", /*german*/"", /*french*/"une chose dispendieuse") + // /*spanish*/algo caro + }, { + CustomMessage("a sapphire suit", /*german*/"", /*french*/"un pigment bleuté"), + // /*spanish*/una vestidura zafiro + CustomMessage("scuba gear", /*german*/"", /*french*/"un habit de plongée"), + // /*spanish*/un traje impermeable + CustomMessage("a swimsuit", /*german*/"", /*french*/"un costume de baignade")}); + // /*spanish*/unos ropajes sumergibles + + hintTextTable[RHT_IRON_BOOTS] = HintText(CustomMessage("the Iron Boots", /*german*/"", /*french*/"une paire de Bottes de plomb"), + // /*spanish*/las botas de hierro + { + CustomMessage("some boots", /*german*/"", /*french*/"une paire de bottes"), + // /*spanish*/un par de botas + CustomMessage("a feature of the Water Temple", /*german*/"", /*french*/"une particularité du Temple de l'Eau"), + // /*spanish*/algo particular del Templo del Agua + CustomMessage("something heavy", /*german*/"", /*french*/"une chose pesante") + // /*spanish*/algo de lo más pesado + }, { + CustomMessage("sink shoes", /*german*/"", /*french*/"un boulet de fer"), + // /*spanish*/un calzado de las profundidades + CustomMessage("clank cleats", /*german*/"", /*french*/"une paire de talons bruyants")}); + // /*spanish*/unas suelas férreas + + hintTextTable[RHT_HOVER_BOOTS] = HintText(CustomMessage("the Hover Boots", /*german*/"", /*french*/"une paire de Bottes des airs"), + // /*spanish*/las botas voladoras + { + CustomMessage("some boots", /*german*/"", /*french*/"une paire de bottes") + // /*spanish*/un par de botas + }, { + CustomMessage("butter boots", /*german*/"", /*french*/"une paire de patins de beurre"), + // /*spanish*/unas suelas resvaladizas + CustomMessage("sacred slippers", /*german*/"", /*french*/"une paire de pantoufles sacrées"), + // /*spanish*/unos escurridizos botines + CustomMessage("spacewalkers", /*german*/"", /*french*/"une paire de bottes spatiales")}); + // /*spanish*/un calzado antigravitatorio + + hintTextTable[RHT_ZELDAS_LETTER] = HintText(CustomMessage("Zelda's Letter", /*german*/"", /*french*/"la Lettre de Zelda"), + // /*spanish*/la carta de Zelda + {}, { + CustomMessage("an autograph", /*german*/"", /*french*/"un autographe"), + // /*spanish*/un autógrafo + CustomMessage("royal stationery", /*german*/"", /*french*/"du papier royal"), + // /*spanish*/un escrito real + CustomMessage("royal snail mail", /*german*/"", /*french*/"une enveloppe royale")}); + // /*spanish*/correo de la realeza + + hintTextTable[RHT_WEIRD_EGG] = HintText(CustomMessage("the Weird Egg", /*german*/"", /*french*/"l'Oeuf Curieux"), + // /*spanish*/el huevo extraño + { + CustomMessage("an egg", /*german*/"", /*french*/"un oeuf") + // /*spanish*/un huevo + }, { + CustomMessage("a chicken dilemma", /*german*/"", /*french*/"un drôle d'ovale")}); + // /*spanish*/el dilema de la gallina + + hintTextTable[RHT_BOOMERANG] = HintText(CustomMessage("the Boomerang", /*german*/"", /*french*/"le Boomerang"), + // /*spanish*/el bumerán + { + CustomMessage("something that can grab things", /*german*/"", /*french*/"une chose qui peut attraper"), + // /*spanish*/algo que pueda agarrar cosas + CustomMessage("something that can stun", /*german*/"", /*french*/"une chose qui peut paralyser") + // /*spanish*/algo que pueda paralizar + }, { + CustomMessage("a banana", /*german*/"", /*french*/"une banane"), + // /*spanish*/un plátano + CustomMessage("a stun stick", /*german*/"", /*french*/"un bâton étourdissant"), + // /*spanish*/un palo aturdidor + CustomMessage("a yellow angle", /*german*/"", /*french*/"un angle jaune")}); + // /*spanish*/un ángulo amarillo + + hintTextTable[RHT_LENS_OF_TRUTH] = HintText(CustomMessage("the Lens of Truth", /*german*/"", /*french*/"le Monocle de Vérité"), + // /*spanish*/la Lupa de la Verdad + { + CustomMessage("a secret-finding tool", /*german*/"", /*french*/"un cherche-secrets") + // /*spanish*/un instrumento para hallar objetos + }, { + CustomMessage("a lie detector", /*german*/"", /*french*/"un détecteur de mensonges"), + // /*spanish*/el detector de ilusiones + CustomMessage("a ghost tracker", /*german*/"", /*french*/"un trouve-fantôme"), + // /*spanish*/el rastreador paranormal + CustomMessage("true sight", /*german*/"", /*french*/"le troisième œil"), + // /*spanish*/el ojo que todo ve + CustomMessage("a detective's tool", /*german*/"", /*french*/"un trésor Sheikah")}); + // /*spanish*/la revelación verdadera + + hintTextTable[RHT_MEGATON_HAMMER] = HintText(CustomMessage("the Megaton Hammer", /*german*/"", /*french*/"la Masse des Titans"), + // /*spanish*/el martillo Megatón + { + CustomMessage("something that can remove boulders", /*german*/"", /*french*/"une chose qui enlève les rochers") + // /*spanish*/algo que pueda quitar rocas + }, { + CustomMessage("the dragon smasher", /*german*/"", /*french*/"le tueur de dragons"), + // /*spanish*/un destructor de dragones + CustomMessage("the metal mallet", /*german*/"", /*french*/"un outil de construction"), + // /*spanish*/un mazo de metal + CustomMessage("the heavy hitter", /*german*/"", /*french*/"un poids lourd")}); + // /*spanish*/un machacador + + hintTextTable[RHT_STONE_OF_AGONY] = HintText(CustomMessage("the Stone of Agony", /*german*/"", /*french*/"la Pierre de Souffrance"), + // /*spanish*/la Piedra de la Agonía + { + CustomMessage("a prize of the House of Skulltulas", /*german*/"", /*french*/"un prix de la maison des Skulltulas"), + // /*spanish*/un obsequio de la Casa Skulltula + CustomMessage("a secret-finding tool", /*german*/"", /*french*/"un cherche-secrets") + // /*spanish*/un instrumento para hallar objetos + }, { + CustomMessage("the shake stone", /*german*/"", /*french*/"le fragment vibrant"), + // /*spanish*/el fragmento tintineante + CustomMessage("a gray alarm", /*german*/"", /*french*/"une alerte bleue")}); + // /*spanish*/una azul alarma + + hintTextTable[RHT_DINS_FIRE] = HintText(CustomMessage("Din's Fire", /*german*/"", /*french*/"le Feu de Din"), + // /*spanish*/el Fuego de Din + { + CustomMessage("a Great Fairy's power", /*german*/"", /*french*/"le pouvoir d'une grande fée") + // /*spanish*/el poder de una Gran Hada + }, { + CustomMessage("an inferno", /*german*/"", /*french*/"un brasier"), + // /*spanish*/un incendio + CustomMessage("a heat wave", /*german*/"", /*french*/"une vague de chaleur"), + // /*spanish*/una onda de calor + CustomMessage("a red ball", /*german*/"", /*french*/"une explosion de flammes")}); + // /*spanish*/una roja esfera + + hintTextTable[RHT_FARORES_WIND] = HintText(CustomMessage("Farore's Wind", /*german*/"", /*french*/"le Vent de Farore"), + // /*spanish*/el Viento de Farore + { + CustomMessage("a Great Fairy's power", /*german*/"", /*french*/"le pouvoir d'une grande fée") + // /*spanish*/el poder de una Gran Hada + }, { + CustomMessage("teleportation", /*german*/"", /*french*/"la téléportation"), + // /*spanish*/un teletransportador + CustomMessage("a relocation rune", /*german*/"", /*french*/"une rune de relocation"), + // /*spanish*/una runa de transporte + CustomMessage("a green ball", /*german*/"", /*french*/"une boule verte")}); + // /*spanish*/una verde esfera + + hintTextTable[RHT_NAYRUS_LOVE] = HintText(CustomMessage("Nayru's Love", /*german*/"", /*french*/"l'Amour de Nayru"), + // /*spanish*/el Amor de Nayru + { + CustomMessage("a Great Fairy's power", /*german*/"", /*french*/"le pouvoir d'une grande fée") + // /*spanish*/el poder de una Gran Hada + }, { + CustomMessage("a safe space", /*german*/"", /*french*/"une bulle de cristal"), + // /*spanish*/una seguridad temporal + CustomMessage("an impregnable aura", /*german*/"", /*french*/"un aura impénétrable"), + // /*spanish*/un aura impenetrable + CustomMessage("a blue barrier", /*german*/"", /*french*/"une toison bleu")}); + // /*spanish*/una barrera azul + + hintTextTable[RHT_FIRE_ARROWS] = HintText(CustomMessage("the Fire Arrows", /*german*/"", /*french*/"les Flèches de Feu"), + // /*spanish*/la flecha de fuego + { + CustomMessage("a magic arrow", /*german*/"", /*french*/"une flèche magique") + // /*spanish*/una flecha mágica + }, { + CustomMessage("the furnace firearm", /*german*/"", /*french*/"une fusée solaire"), + // /*spanish*/el ardiente aguijón + CustomMessage("the burning bolts", /*german*/"", /*french*/"un obus enflammé"), + // /*spanish*/las puntas ígneas + CustomMessage("a magma missile", /*german*/"", /*french*/"un missile volcanique")}); + // /*spanish*/el misil abrasador + + hintTextTable[RHT_ICE_ARROWS] = HintText(CustomMessage("the Ice Arrows", /*german*/"", /*french*/"les Flèches de Glace"), + // /*spanish*/la flecha de hielo + { + CustomMessage("a magic arrow", /*german*/"", /*french*/"une flèche magique"), + // /*spanish*/una flecha mágica + CustomMessage("something that can stun", /*german*/"", /*french*/"une chose qui peut paralyser") + // /*spanish*/algo que pueda paralizar + }, { + CustomMessage("the refrigerator rocket", /*german*/"", /*french*/"un missile pétrifiant"), + // /*spanish*/el misil congelador + CustomMessage("the frostbite bolts", /*german*/"", /*french*/"un froid mordant"), + // /*spanish*/las puntas gélidas + CustomMessage("an iceberg maker", /*german*/"", /*french*/"une aiguille glaciale")}); + // /*spanish*/el control de escarcha + + hintTextTable[RHT_LIGHT_ARROWS] = HintText(CustomMessage("the Light Arrows", /*german*/"", /*french*/"les Flèches de Lumière"), + // /*spanish*/la flecha de luz + { + CustomMessage("a magic arrow", /*german*/"", /*french*/"une flèche magique") + // /*spanish*/una flecha mágica + }, { + CustomMessage("the shining shot", /*german*/"", /*french*/"l'arme brillante"), + // /*spanish*/el haz de luz + CustomMessage("the luminous launcher", /*german*/"", /*french*/"un jet de lumière"), + // /*spanish*/el disparo luminoso + CustomMessage("Ganondorf's bane", /*german*/"", /*french*/"le fléau de Ganondorf"), + // /*spanish*/la perdición de Ganondorf + CustomMessage("the lighting bolts", /*german*/"", /*french*/"l'éclair sacré")}); + // /*spanish*/las puntas resplandecientes + + hintTextTable[RHT_GERUDO_MEMBERSHIP_CARD] = HintText(CustomMessage("the Gerudo Membership Card", /*german*/"", /*french*/"la Carte Gerudo"), + // /*spanish*/el pase de socio gerudo + { + CustomMessage("a token of recognition", /*german*/"", /*french*/"une preuve de reconnaissance") + // /*spanish*/una prueba de reconocimiento + }, { + CustomMessage("a girl club membership", /*german*/"", /*french*/"une carte de membre"), + // /*spanish*/una fémina membresía + CustomMessage("a desert tribe's pass", /*german*/"", /*french*/"un laissez-passer")}); + // /*spanish*/el vale del desierto + + hintTextTable[RHT_MAGIC_BEAN] = HintText(CustomMessage("a Magic Bean", /*german*/"", /*french*/"un Haricot Magique"), + // /*spanish*/una judía mágica + { + CustomMessage("something sometimes buried", /*german*/"", /*french*/"une chose parfois enterrée") + // /*spanish*/algo a veces enterrado + }, { + CustomMessage("a wizardly legume", /*german*/"", /*french*/"un légume ensorcelé")}); + // /*spanish*/una legumbre hechizada + + hintTextTable[RHT_MAGIC_BEAN_PACK] = HintText(CustomMessage("Magic Beans", /*german*/"", /*french*/"un Paquet de Haricots Magiques"), + // /*spanish*/unas judías mágicas + { + CustomMessage("something sometimes buried", /*german*/"", /*french*/"une chose parfois enterrée") + // /*spanish*/algo a veces enterrado + }, { + CustomMessage("wizardly legumes", /*german*/"", /*french*/"un paquet de légumes ensorcelés")}); + // /*spanish*/unas legumbres hechizadas + + hintTextTable[RHT_DOUBLE_DEFENSE] = HintText(CustomMessage("Double Defense", /*german*/"", /*french*/"la Double Défence"), + // /*spanish*/la doble defensa + { + CustomMessage("a Great Fairy's power", /*german*/"", /*french*/"le pouvoir d'une grande fée"), + // /*spanish*/el poder de una Gran Hada + CustomMessage("something heart-shaped", /*german*/"", /*french*/"une chose en forme de coeur") + // /*spanish*/algo con forma de corazón + }, { + CustomMessage("a white outline", /*german*/"", /*french*/"un rebord blanc"), + // /*spanish*/un contorno blanco + CustomMessage("damage decrease", /*german*/"", /*french*/"une protection supplémentaire"), + // /*spanish*/una reducción de daño + CustomMessage("strengthened love", /*german*/"", /*french*/"un amour coriace")}); + // /*spanish*/un amor fortalecido + + hintTextTable[RHT_GOLD_SKULLTULA_TOKEN] = HintText(CustomMessage("a Gold Skulltula Token", /*german*/"", /*french*/"un Symbole de Skulltula d'or"), + // /*spanish*/un símbolo de skulltula dorada + { + CustomMessage("a token of recognition", /*german*/"", /*french*/"une preuve de reconnaissance"), + // /*spanish*/una prueba de reconocimiento + CustomMessage("something sometimes buried", /*german*/"", /*french*/"une chose parfois enterrée") + // /*spanish*/algo a veces enterrado + }, { + CustomMessage("proof of destruction", /*german*/"", /*french*/"un certificat d'élimination"), + // /*spanish*/una prueba de la destrucción + CustomMessage("an arachnid chip", /*german*/"", /*french*/"un symbole cranien"), + // /*spanish*/una figura arácnida + CustomMessage("spider remains", /*german*/"", /*french*/"une dépouille dorée"), + // /*spanish*/unos restos dorados + CustomMessage("one percent of a curse", /*german*/"", /*french*/"un centième de malédiction")}); + // /*spanish*/una centésima de una maldición + + hintTextTable[RHT_POCKET_EGG] = HintText(CustomMessage("the Pocket Egg", /*german*/"", /*french*/"l'Oeuf de Poche"), + // /*spanish*/el huevo de bolsillo + { + CustomMessage("a trade quest item", /*german*/"", /*french*/"un objet de quête d'échanges"), + // /*spanish*/un objeto de una misión secundaria + CustomMessage("an egg", /*german*/"", /*french*/"un oeuf") + // /*spanish*/un huevo + }, { + CustomMessage("a Cucco container", /*german*/"", /*french*/"un réservoir à Cocotte"), + // /*spanish*/cuco contenido + CustomMessage("a Cucco, eventually", /*german*/"", /*french*/"un poussin éventuel"), + // /*spanish*/un futuro cuco + CustomMessage("a fowl youth", /*german*/"", /*french*/"une omelette crue")}); + // /*spanish*/una dulce juventud + + hintTextTable[RHT_POCKET_CUCCO] = HintText(CustomMessage("the Pocket Cucco", /*german*/"", /*french*/"la Cocotte de Poche"), + // /*spanish*/el cuco de bolsillo + { + CustomMessage("a trade quest item", /*german*/"", /*french*/"un objet de quête d'échanges") + // /*spanish*/un objeto de una misión secundaria + }, { + CustomMessage("a little clucker", /*german*/"", /*french*/"un petit glousseur")}); + // /*spanish*/un pollito chiquito + + hintTextTable[RHT_COJIRO] = HintText(CustomMessage("Cojiro", /*german*/"", /*french*/"le p'tit poulet"), + // /*spanish*/a Cojiro + { + CustomMessage("a trade quest item", /*german*/"", /*french*/"un objet de quête d'échanges") + // /*spanish*/un objeto de una misión secundaria + }, { + CustomMessage("a cerulean capon", /*german*/"", /*french*/"un paon azur")}); + // /*spanish*/un cerúleo capón + + hintTextTable[RHT_ODD_MUSHROOM] = HintText(CustomMessage("an Odd Mushroom", /*german*/"", /*french*/"un Champignon Suspect"), + // /*spanish*/un champiñón extraño + { + CustomMessage("a trade quest item", /*german*/"", /*french*/"un objet de quête d'échanges") + // /*spanish*/un objeto de una misión secundaria + }, { + CustomMessage("a powder ingredient", /*german*/"", /*french*/"un ingrédient à poudre")}); + // /*spanish*/un oloroso ingrediente + + hintTextTable[RHT_ODD_POTION] = HintText(CustomMessage("an Odd Potion", /*german*/"", /*french*/"une Mixture Suspecte"), + // /*spanish*/una medicina rara + { + CustomMessage("something that contains medicine", /*german*/"", /*french*/"une chose médicamenteuse"), + // /*spanish*/algo que contenga medicina + CustomMessage("something with a strange smell", /*german*/"", /*french*/"une chose qui sent bizarre"), + // /*spanish*/algo con un olor extraño + CustomMessage("a trade quest item", /*german*/"", /*french*/"un objet de quête d'échanges") + // /*spanish*/un objeto de una misión secundaria + }, { + CustomMessage("Granny's goodies", /*german*/"", /*french*/"la confiserie de mamie")}); + // /*spanish*/la especialidad de la abuela + + hintTextTable[RHT_POACHERS_SAW] = HintText(CustomMessage("the Poacher's Saw", /*german*/"", /*french*/"la Scie du Chasseur"), + // /*spanish*/la sierra del furtivo + { + CustomMessage("a trade quest item", /*german*/"", /*french*/"un objet de quête d'échanges") + // /*spanish*/un objeto de una misión secundaria + }, { + CustomMessage("a tree killer", /*german*/"", /*french*/"un coupeur d'arbres")}); + // /*spanish*/un destructor de árboles + + hintTextTable[RHT_BROKEN_SWORD] = HintText(CustomMessage("the Broken Goron's Sword", /*german*/"", /*french*/"l'Épée Brisée de Goron"), + // /*spanish*/la espada goron rota + { + CustomMessage("a trade quest item", /*german*/"", /*french*/"un objet de quête d'échanges"), + // /*spanish*/un objeto de una misión secundaria + CustomMessage("a sword", /*german*/"", /*french*/"une épée") + // /*spanish*/una espada + }, { + CustomMessage("a shattered slicer", /*german*/"", /*french*/"une arme cassée")}); + // /*spanish*/una rebanadora rota + + hintTextTable[RHT_PRESCRIPTION] = HintText(CustomMessage("the Prescription", /*german*/"", /*french*/"une Ordonnance"), + // /*spanish*/la receta + { + CustomMessage("a trade quest item", /*german*/"", /*french*/"un objet de quête d'échanges") + // /*spanish*/un objeto de una misión secundaria + }, { + CustomMessage("a pill pamphlet", /*german*/"", /*french*/"un document urgent"), + // /*spanish*/un instructivo medicinal + CustomMessage("a doctor's note", /*german*/"", /*french*/"un papier médical")}); + // /*spanish*/unas notas del doctor + + hintTextTable[RHT_EYEBALL_FROG] = HintText(CustomMessage("the Eyeball Frog", /*german*/"", /*french*/"le Crapaud-qui-louche"), + // /*spanish*/la rana de ojos saltones + { + CustomMessage("a trade quest item", /*german*/"", /*french*/"un objet de quête d'échanges") + // /*spanish*/un objeto de una misión secundaria + }, { + CustomMessage("a perceiving polliwog", /*german*/"", /*french*/"un amphibien")}); + // /*spanish*/un variopinto batracio + + hintTextTable[RHT_EYEDROPS] = HintText(CustomMessage("the Eyedrops", /*german*/"", /*french*/"une phiole de Super-Gouttes"), + // /*spanish*/las supergotas oculares + { + CustomMessage("a trade quest item", /*german*/"", /*french*/"un objet de quête d'échanges") + // /*spanish*/un objeto de una misión secundaria + }, { + CustomMessage("a vision vial", /*german*/"", /*french*/"une solution oculaire")}); + // /*spanish*/un remedio para la vista + + hintTextTable[RHT_CLAIM_CHECK] = HintText(CustomMessage("the Claim Check", /*german*/"", /*french*/"un Certificat"), + // /*spanish*/el recibo + { + CustomMessage("a trade quest item", /*german*/"", /*french*/"un objet de quête d'échanges") + // /*spanish*/un objeto de una misión secundaria + }, { + CustomMessage("a three day wait", /*german*/"", /*french*/"un rendez-vous dans trois jours")}); + // /*spanish*/unos tres días de espera + + hintTextTable[RHT_PROGRESSIVE_HOOKSHOT] = HintText(CustomMessage("a Hookshot", /*german*/"", /*french*/"un Grappin"), + // /*spanish*/un gancho + { + CustomMessage("something that can grab things", /*german*/"", /*french*/"une chose qui peut attraper"), + // /*spanish*/algo que pueda agarrar cosas + CustomMessage("something that can stun", /*german*/"", /*french*/"une chose qui peut paralyser") + // /*spanish*/algo que pueda paralizar + }, { + CustomMessage("Dampé's keepsake", /*german*/"", /*french*/"l'héritage d'Igor"), + // /*spanish*/un recuerdo de Dampé + CustomMessage("the Grapple Beam", /*german*/"", /*french*/"le rayon grippeur"), + // /*spanish*/una garra metálica + CustomMessage("the RHT_BOING! chain", /*german*/"", /*french*/"la chaîne de RHT_BOING!")}); + // /*spanish*/una cadena retráctil + + hintTextTable[RHT_PROGRESSIVE_STRENGTH] = HintText(CustomMessage("a Strength Upgrade", /*german*/"", /*french*/"une Amélioration de Force"), + // /*spanish*/un aumento de fuerza + { + CustomMessage("something that can remove boulders", /*german*/"", /*french*/"une chose qui enlève les rochers") + // /*spanish*/algo que pueda quitar rocas + }, { + CustomMessage("power gloves", /*german*/"", /*french*/"une paire de gants de travail"), + // /*spanish*/unos poderosos guanteletes + CustomMessage("metal mittens", /*german*/"", /*french*/"une paire de mitaines"), + // /*spanish*/unas manoplas metálicas + CustomMessage("the heavy lifty", /*german*/"", /*french*/"la puissance de dix hommes")}); + // /*spanish*/un levantamiento pesado + + hintTextTable[RHT_PROGRESSIVE_BOMB_BAG] = HintText(CustomMessage("a Bomb Bag", /*german*/"", /*french*/"un Sac de Bombes"), + // /*spanish*/un saco de bombas + { + CustomMessage("explosives", /*german*/"", /*french*/"un paquet d'explosifs"), + // /*spanish*/un montón de explosivos + CustomMessage("something that can remove boulders", /*german*/"", /*french*/"une chose qui enlève les rochers") + // /*spanish*/algo que pueda quitar rocas + }, { + CustomMessage("an explosive container", /*german*/"", /*french*/"un porte-grenade"), + // /*spanish*/un recipiente explosivo + CustomMessage("a blast bag", /*german*/"", /*french*/"un estomac de Dodongo")}); + // /*spanish*/un zurrón de estallidos + + hintTextTable[RHT_PROGRESSIVE_BOW] = HintText(CustomMessage("a Bow", /*german*/"", /*french*/"l'Arc des Fées"), + // /*spanish*/un arco de las hadas + { + CustomMessage("a projectile shooter", /*german*/"", /*french*/"un tire-projectile") + // /*spanish*/un arma de proyectil + }, { + CustomMessage("an archery enabler", /*german*/"", /*french*/"un facilitateur de tir"), + // /*spanish*/un tiro al blanco + CustomMessage("a danger dart launcher", /*german*/"", /*french*/"un tire-fléchette")}); + // /*spanish*/un peligroso lanzadardos + + hintTextTable[RHT_PROGRESSIVE_SLINGSHOT] = HintText(CustomMessage("a Slingshot", /*german*/"", /*french*/"un Lance-Pierre"), + // /*spanish*/una resortera de las hadas + { + CustomMessage("a projectile shooter", /*german*/"", /*french*/"un tire-projectile") + // /*spanish*/un arma de proyectil + }, { + CustomMessage("a seed shooter", /*german*/"", /*french*/"un lance-noix"), + // /*spanish*/un lanzasemillas + CustomMessage("a rubberband", /*german*/"", /*french*/"un élastique"), + // /*spanish*/un tirachinas + CustomMessage("a child's catapult", /*german*/"", /*french*/"un jouet d'enfant")}); + // /*spanish*/una catapulta infantil + + hintTextTable[RHT_PROGRESSIVE_WALLET] = HintText(CustomMessage("a Wallet", /*german*/"", /*french*/"une Bourse"), + // /*spanish*/una bolsa de rupias + { + CustomMessage("a prize of the House of Skulltulas", /*german*/"", /*french*/"un prix de la maison des Skulltulas") + // /*spanish*/un obsequio de la Casa Skulltula + }, { + CustomMessage("a mo' money holder", /*german*/"", /*french*/"un sac à sous"), + // /*spanish*/una cartera de dinero + CustomMessage("a gem purse", /*german*/"", /*french*/"une sacoche"), + // /*spanish*/un zurrón de gemas + CustomMessage("a portable bank", /*german*/"", /*french*/"une petite banque")}); + // /*spanish*/un banco portable + + hintTextTable[RHT_PROGRESSIVE_SCALE] = HintText(CustomMessage("a Zora Scale", /*german*/"", /*french*/"une Écaille Zora"), + // /*spanish*/una escama Zora + { + CustomMessage("a diving tool", /*german*/"", /*french*/"un outil de plongée") + // /*spanish*/un instrumento de buceo + }, { + CustomMessage("a deeper dive", /*german*/"", /*french*/"une bulle de plongée"), + // /*spanish*/un profundo buceo + CustomMessage("a piece of Zora", /*german*/"", /*french*/"un morceau de Zora")}); + // /*spanish*/un fragmento de Zora + + hintTextTable[RHT_PROGRESSIVE_NUT_UPGRADE] = HintText(CustomMessage("Deku Nut Capacity", /*german*/"", /*french*/"une Augmentation de Noix Mojo"), + // /*spanish*/un aumento de nueces deku + { + CustomMessage("some Deku munitions", /*german*/"", /*french*/"un paquet de munitions Mojo"), + // /*spanish*/un montón de municiones Deku + CustomMessage("something that can stun", /*german*/"", /*french*/"une chose qui peut paralyser") + // /*spanish*/algo que pueda paralizar + }, { + CustomMessage("more nuts", /*german*/"", /*french*/"ecnore plus de noix"), + // /*spanish*/más semillas de nogal + CustomMessage("flashbang storage", /*german*/"", /*french*/"un sac à noix")}); + // /*spanish*/más frutos aturdidores + + hintTextTable[RHT_PROGRESSIVE_STICK_UPGRADE] = HintText(CustomMessage("Deku Stick Capacity", /*german*/"", /*french*/"une augmentation de bâtons Mojo"), + // /*spanish*/un aumento de palos deku + { + CustomMessage("some Deku munitions", /*german*/"", /*french*/"un paquet de munitions Mojo") + // /*spanish*/un montón de municiones Deku + }, { + CustomMessage("a lumber rack", /*german*/"", /*french*/"un paquet de bois"), + // /*spanish*/más bastones + CustomMessage("more flammable twigs", /*german*/"", /*french*/"beaucoup de branches")}); + // /*spanish*/más varas + + hintTextTable[RHT_PROGRESSIVE_MAGIC_METER] = HintText(CustomMessage("a Magic Meter", /*german*/"", /*french*/"une Jauge de Magie"), + // /*spanish*/un aumento de poder mágico + { + CustomMessage("a Great Fairy's power", /*german*/"", /*french*/"le pouvoir d'une grande fée") + // /*spanish*/el poder de una Gran Hada + }, { + CustomMessage("mystic training", /*german*/"", /*french*/"un potentiel magique"), + // /*spanish*/una maestría mística + CustomMessage("pixie dust", /*german*/"", /*french*/"de la poudre de fée"), + // /*spanish*/un polvo de hada + CustomMessage("a green rectangle", /*german*/"", /*french*/"un rectangle vert")}); + // /*spanish*/una verduzca barra + + hintTextTable[RHT_PROGRESSIVE_OCARINA] = HintText(CustomMessage("an Ocarina", /*german*/"", /*french*/"un ocarina"), + // /*spanish*/una ocarina + { + CustomMessage("something given by Saria", /*german*/"", /*french*/"un cadeau de Saria"), + // /*spanish*/un obsequio de Saria + CustomMessage("something kept by the royal family", /*german*/"", /*french*/"une chose qui paralyse") + // /*spanish*/algo guardado por la familia real + }, { + CustomMessage("a flute", /*german*/"", /*french*/"un bec musical"), + // /*spanish*/un utensilio musical + CustomMessage("a music maker", /*german*/"", /*french*/"un porteur de chansons")}); + // /*spanish*/un instrumento + + hintTextTable[RHT_PROGRESSIVE_BOMBCHUS] = HintText(CustomMessage("Bombchus", /*german*/"", /*french*/"un paquet de Missiles"), + // /*spanish*/unos bombchus + { + CustomMessage("a prize of the House of Skulltulas", /*german*/"", /*french*/"un prix de la maison des Skulltulas"), + // /*spanish*/un obsequio de la Casa Skulltula + CustomMessage("explosives", /*german*/"", /*french*/"un paquet d'explosifs") + // /*spanish*/un montón de explosivos + }, { + CustomMessage("mice bombs", /*german*/"", /*french*/"un adorable explosif"), + // /*spanish*/unas bombas roedoras + CustomMessage("proximity mice", /*german*/"", /*french*/"une mine anti-rongeur"), + // /*spanish*/unos explosivos ratoncitos + CustomMessage("wall crawlers", /*german*/"", /*french*/"un rapide grimpeur"), + // /*spanish*/unos trepaparedes + CustomMessage("trail blazers", /*german*/"", /*french*/"un zigzag éclatant")}); + // /*spanish*/unas ratas propulsadas + + hintTextTable[RHT_PROGRESSIVE_GORONSWORD] = HintText(CustomMessage("a Goron Sword", /*german*/"", /*french*/"une épée Goron"), + // /*spanish*/una espada goron + { + CustomMessage("a sword", /*german*/"", /*french*/"une épée") + // /*spanish*/una espada + }, { + CustomMessage("a long blade", /*german*/"", /*french*/"une longue lame"), + // /*spanish*/una gran hoja + CustomMessage("a Goron weapon", /*german*/"", /*french*/"une arme Goron")}); + // /*spanish*/un arma goron + + hintTextTable[RHT_EMPTY_BOTTLE] = HintText(CustomMessage("a Bottle", /*german*/"", /*french*/"un flacon vide"), + // /*spanish*/una botella + { + CustomMessage("a bottle", /*german*/"", /*french*/"un flacon") + // /*spanish*/una botella + }, { + CustomMessage("a glass container", /*german*/"", /*french*/"un cylindre de cristal"), + // /*spanish*/un recipiente de cristal + CustomMessage("an empty jar", /*german*/"", /*french*/"une jarre incassable"), + // /*spanish*/un frasco vacío + CustomMessage("encased air", /*german*/"", /*french*/"un bocal d'air")}); + // /*spanish*/aire a presión + + hintTextTable[RHT_BOTTLE_WITH_MILK] = HintText(CustomMessage("a Milk Bottle", /*german*/"", /*french*/"un flacon de lait"), + // /*spanish*/una botella de leche + { + CustomMessage("a bottle", /*german*/"", /*french*/"un flacon") + // /*spanish*/una botella + }, { + CustomMessage("cow juice", /*german*/"", /*french*/"une source de calcium"), + // /*spanish*/una fuente de calcio + CustomMessage("a white liquid", /*german*/"", /*french*/"un liquide blanc"), + // /*spanish*/una bebida nutritiva + CustomMessage("a baby's breakfast", /*german*/"", /*french*/"du jus pour bébé")}); + // /*spanish*/un trago para bebés + + hintTextTable[RHT_BOTTLE_WITH_RED_POTION] = HintText(CustomMessage("a Red Potion Bottle", /*german*/"", /*french*/"un flacon de potion rouge"), + // /*spanish*/una botella de poción roja + { + CustomMessage("a bottle", /*german*/"", /*french*/"un flacon") + // /*spanish*/una botella + }, { + CustomMessage("a vitality vial", /*german*/"", /*french*/"un mélange de vitalité"), + // /*spanish*/una pócima vitalicia + CustomMessage("a red liquid", /*german*/"", /*french*/"un liquide rouge")}); + // /*spanish*/un remedio rojizo + + hintTextTable[RHT_BOTTLE_WITH_GREEN_POTION] = HintText(CustomMessage("a Green Potion Bottle", /*german*/"", /*french*/"un flacon de potion verte"), + // /*spanish*/una botella de poción verde + { + CustomMessage("a bottle", /*german*/"", /*french*/"un flacon") + // /*spanish*/una botella + }, { + CustomMessage("a magic mixture", /*german*/"", /*french*/"une réserve magique"), + // /*spanish*/un potingue mágico + CustomMessage("a green liquid", /*german*/"", /*french*/"un liquide vert")}); + // /*spanish*/un remedio verduzco + + hintTextTable[RHT_BOTTLE_WITH_BLUE_POTION] = HintText(CustomMessage("a Blue Potion Bottle", /*german*/"", /*french*/"un flacon de potion bleue"), + // /*spanish*/una botella de poción azul + { + CustomMessage("a bottle", /*german*/"", /*french*/"un flacon") + // /*spanish*/una botella + }, { + CustomMessage("an ailment antidote", /*german*/"", /*french*/"l'élixir ultime"), + // /*spanish*/un antídoto para el dolor + CustomMessage("a blue liquid", /*german*/"", /*french*/"un liquide bleu")}); + // /*spanish*/un remedio índigo + + hintTextTable[RHT_BOTTLE_WITH_FAIRY] = HintText(CustomMessage("a Fairy Bottle", /*german*/"", /*french*/"une fée en flacon"), + // /*spanish*/un hada en una botella + { + CustomMessage("a bottle", /*german*/"", /*french*/"un flacon") + // /*spanish*/una botella + }, { + CustomMessage("an imprisoned fairy", /*german*/"", /*french*/"une fée emprisonnée"), + // /*spanish*/un hada atrapada + CustomMessage("an extra life", /*german*/"", /*french*/"une vie de rechange"), + // /*spanish*/una oportunidad más + CustomMessage("Navi's cousin", /*german*/"", /*french*/"le cousin de Navi")}); + // /*spanish*/una prima de Navi + + hintTextTable[RHT_BOTTLE_WITH_FISH] = HintText(CustomMessage("a Fish Bottle", /*german*/"", /*french*/"un poisson en flacon"), + // /*spanish*/un pez en una botella + { + CustomMessage("a bottle", /*german*/"", /*french*/"un flacon") + // /*spanish*/una botella + }, { + CustomMessage("an aquarium", /*german*/"", /*french*/"un aquarium"), + // /*spanish*/un escamado ser + CustomMessage("a deity's snack", /*german*/"", /*french*/"le repas d'un dieu marin")}); + // /*spanish*/un tentempié de cierta deidad + + hintTextTable[RHT_BOTTLE_WITH_BLUE_FIRE] = HintText(CustomMessage("a Blue Fire Bottle", /*german*/"", /*french*/"une flamme bleue en flacon"), + // /*spanish*/una botella de fuego azul + { + CustomMessage("a bottle", /*german*/"", /*french*/"un flacon") + // /*spanish*/una botella + }, { + CustomMessage("a conflagration canteen", /*german*/"", /*french*/"une mystérieuse flamme"), + // /*spanish*/un incendio retenido + CustomMessage("an icemelt jar", /*german*/"", /*french*/"un brasier glacial")}); + // /*spanish*/unas brasas enfrascadas + + hintTextTable[RHT_BOTTLE_WITH_BUGS] = HintText(CustomMessage("a Bug Bottle", /*german*/"", /*french*/"un insecte en flacon"), + // /*spanish*/unos insectos en una botella + { + CustomMessage("a bottle", /*german*/"", /*french*/"un flacon") + // /*spanish*/una botella + }, { + CustomMessage("an insectarium", /*german*/"", /*french*/"un insectarium"), + // /*spanish*/unos invertebrados seres + CustomMessage("Skulltula finders", /*german*/"", /*french*/"une poignée de trouve-Skulltula")}); + // /*spanish*/unos rastreadores de skulltulas + + hintTextTable[RHT_BOTTLE_WITH_POE] = HintText(CustomMessage("a Poe Bottle", /*german*/"", /*french*/"un Esprit en flacon"), + // /*spanish*/un Poe en una botella + { + CustomMessage("a bottle", /*german*/"", /*french*/"un flacon") + // /*spanish*/una botella + }, { + CustomMessage("a spooky ghost", /*german*/"", /*french*/"un effroyable fantôme"), + // /*spanish*/un espantoso espectro + CustomMessage("a face in the jar", /*german*/"", /*french*/"un visage dans un bocal")}); + // /*spanish*/una expresión enfrascada + + hintTextTable[RHT_BOTTLE_WITH_BIG_POE] = HintText(CustomMessage("a Big Poe Bottle", /*german*/"", /*french*/"une Ame en flacon"), + // /*spanish*/un Gran Poe en una botella + { + CustomMessage("a bottle", /*german*/"", /*french*/"un flacon") + // /*spanish*/una botella + }, { + CustomMessage("the spookiest ghost", /*german*/"", /*french*/"un épouvantable spectre"), + // /*spanish*/el espectro más espeluznante + CustomMessage("a sidequest spirit", /*german*/"", /*french*/"un précieux esprit")}); + // /*spanish*/un buen valorado espíritu + + hintTextTable[RHT_RUTOS_LETTER] = HintText(CustomMessage("Ruto's Letter", /*german*/"", /*french*/"la lettre de Ruto"), + // /*spanish*/la carta de Ruto + { + CustomMessage("a bottle", /*german*/"", /*french*/"un flacon") + // /*spanish*/una botella + }, { + CustomMessage("a call for help", /*german*/"", /*french*/"un appel au secours"), + // /*spanish*/una llamada de auxilio + CustomMessage("the note that Mweeps", /*german*/"", /*french*/"un message qui fait mwip"), + // /*spanish*/un escrito mweep + CustomMessage("an RHT_SOS call", /*german*/"", /*french*/"un signal RHT_SOS"), + // /*spanish*/una nota de socorro + CustomMessage("a fishy stationery", /*german*/"", /*french*/"un papier mouillé")}); + // /*spanish*/un mensaje de ayuda + + hintTextTable[RHT_ZELDAS_LULLABY] = HintText(CustomMessage("Zelda's Lullaby", /*german*/"", /*french*/"la berceuse de Zelda"), + // /*spanish*/la Nana de Zelda + { + CustomMessage("a regular song", /*german*/"", /*french*/"une chanson normale"), + // /*spanish*/una cancion normal + CustomMessage("something kept by the royal family", /*german*/"", /*french*/"une chose qui paralyse") + // /*spanish*/algo guardado por la familia real + }, { + CustomMessage("a song of royal slumber", /*german*/"", /*french*/"une chanson royale"), + // /*spanish*/la canción real + CustomMessage("a triforce tune", /*german*/"", /*french*/"la musique sacrée")}); + // /*spanish*/la melodía de la trifuerza + + hintTextTable[RHT_EPONAS_SONG] = HintText(CustomMessage("Epona's Song", /*german*/"", /*french*/"le chant d'Epona"), + // /*spanish*/la Canción de Epona + { + CustomMessage("a regular song", /*german*/"", /*french*/"une chanson normale") + // /*spanish*/una cancion normal + }, { + CustomMessage("an equestrian etude", /*german*/"", /*french*/"une hymne équestre"), + // /*spanish*/una copla ecuestre + CustomMessage("Malon's melody", /*german*/"", /*french*/"la mélodie des vaches"), + // /*spanish*/la sonata de Malon + CustomMessage("a ranch song", /*german*/"", /*french*/"le chant des champs")}); + // /*spanish*/un canto rupestre + + hintTextTable[RHT_SARIAS_SONG] = HintText(CustomMessage("Saria's Song", /*german*/"", /*french*/"le chant de Saria"), + // /*spanish*/la Canción de Saria + { + CustomMessage("a regular song", /*german*/"", /*french*/"une chanson normale"), + // /*spanish*/una cancion normal + CustomMessage("something given by Saria", /*german*/"", /*french*/"un cadeau de Saria") + // /*spanish*/un obsequio de Saria + }, { + CustomMessage("a song of dancing Gorons", /*german*/"", /*french*/"une chanson danceuse"), + // /*spanish*/un pegadizo tono goron + CustomMessage("Saria's phone number", /*german*/"", /*french*/"le téléphone d'une amie")}); + // /*spanish*/una consulta de asistencia + + hintTextTable[RHT_SUNS_SONG] = HintText(CustomMessage("the Sun's Song", /*german*/"", /*french*/"le chant du soleil"), + // /*spanish*/la Canción del Sol + { + CustomMessage("a regular song", /*german*/"", /*french*/"une chanson normale"), + // /*spanish*/una cancion normal + CustomMessage("something that can stun", /*german*/"", /*french*/"une chose qui peut paralyser") + // /*spanish*/algo que pueda paralizar + }, { + CustomMessage("Sunny Day", /*german*/"", /*french*/"Zénith"), + // /*spanish*/un día soleado + CustomMessage("the ReDead's bane", /*german*/"", /*french*/"le fléau des Éffrois"), + // /*spanish*/la destructora de Redeads + CustomMessage("the Gibdo's bane", /*german*/"", /*french*/"le fléau des Gibdo")}); + // /*spanish*/la destructora de Gibdos + + hintTextTable[RHT_SONG_OF_TIME] = HintText(CustomMessage("the Song of Time", /*german*/"", /*french*/"le chant du temps"), + // /*spanish*/la Canción del tiempo + { + CustomMessage("a regular song", /*german*/"", /*french*/"une chanson normale") + // /*spanish*/una cancion normal + }, { + CustomMessage("a song 7 years long", /*german*/"", /*french*/"le flot du temps"), + // /*spanish*/la setenada canción + CustomMessage("the tune of ages", /*german*/"", /*french*/"le Chant des Âges")}); + // /*spanish*/la melodía eónica + + hintTextTable[RHT_SONG_OF_STORMS] = HintText(CustomMessage("the Song of Storms", /*german*/"", /*french*/"le chant des tempêtes"), + // /*spanish*/la Canción de la Tormenta + { + CustomMessage("a regular song", /*german*/"", /*french*/"une chanson normale") + // /*spanish*/una cancion normal + }, { + CustomMessage("Rain Dance", /*german*/"", /*french*/"Danse Pluie"), + // /*spanish*/la danza de la lluvia + CustomMessage("a thunderstorm tune", /*german*/"", /*french*/"une hymne foudroyante"), + // /*spanish*/una sonata tormentosa + CustomMessage("windmill acceleration", /*german*/"", /*french*/"l'accélérateur de moulins")}); + // /*spanish*/el arranque de molinos + + hintTextTable[RHT_MINUET_OF_FOREST] = HintText(CustomMessage("the Minuet of Forest", /*german*/"", /*french*/"le menuet de la forêt"), + // /*spanish*/el Minueto del bosque + { + CustomMessage("a warp song", /*german*/"", /*french*/"une chanson de téléportation") + // /*spanish*/una canción de teletransportación + }, { + CustomMessage("the song of tall trees", /*german*/"", /*french*/"le bruit des arbres"), + // /*spanish*/la canción de las copas + CustomMessage("an arboreal anthem", /*german*/"", /*french*/"l'hymne sylvestre"), + // /*spanish*/el himno forestal + CustomMessage("a green spark trail", /*german*/"", /*french*/"une comète verte")}); + // /*spanish*/el sendero esmeralda + + hintTextTable[RHT_BOLERO_OF_FIRE] = HintText(CustomMessage("the Bolero of Fire", /*german*/"", /*french*/"le boléro du feu"), + // /*spanish*/el Bolero del fuego + { + CustomMessage("a warp song", /*german*/"", /*french*/"une chanson de téléportation") + // /*spanish*/una canción de teletransportación + }, { + CustomMessage("a song of lethal lava", /*german*/"", /*french*/"une musique enflammée"), + // /*spanish*/la canción de la lava + CustomMessage("a red spark trail", /*german*/"", /*french*/"une comète rouge"), + // /*spanish*/el sendero rubí + CustomMessage("a volcanic verse", /*german*/"", /*french*/"le souffle du volcan")}); + // /*spanish*/el verso volcánico + + hintTextTable[RHT_SERENADE_OF_WATER] = HintText(CustomMessage("the Serenade of Water", /*german*/"", /*french*/"la sérénade de l'eau"), + // /*spanish*/la Serenata del agua + { + CustomMessage("a warp song", /*german*/"", /*french*/"une chanson de téléportation") + // /*spanish*/una canción de teletransportación + }, { + CustomMessage("a song of a damp ditch", /*german*/"", /*french*/"le calme de l'eau"), + // /*spanish*/la canción del estanque + CustomMessage("a blue spark trail", /*german*/"", /*french*/"une comète bleue"), + // /*spanish*/el sendero zafiro + CustomMessage("the lake's lyric", /*german*/"", /*french*/"la voix du lac")}); + // /*spanish*/la letra del lago + + hintTextTable[RHT_REQUIEM_OF_SPIRIT] = HintText(CustomMessage("the Requiem of Spirit", /*german*/"", /*french*/"le requiem des esprits"), + // /*spanish*/el Réquiem del espíritu + { + CustomMessage("a warp song", /*german*/"", /*french*/"une chanson de téléportation") + // /*spanish*/una canción de teletransportación + }, { + CustomMessage("a song of sandy statues", /*german*/"", /*french*/"la mélodie d'une grande statue"), + // /*spanish*/la canción de la gran estatua + CustomMessage("an orange spark trail", /*german*/"", /*french*/"une comète orange"), + // /*spanish*/el sendero ámbar + CustomMessage("the desert ditty", /*german*/"", /*french*/"le vent du désert")}); + // /*spanish*/la estrofa del desierto + + hintTextTable[RHT_NOCTURNE_OF_SHADOW] = HintText(CustomMessage("the Nocturne of Shadow", /*german*/"", /*french*/"le nocturne de l'ombre"), + // /*spanish*/el Nocturno de la sombra + { + CustomMessage("a warp song", /*german*/"", /*french*/"une chanson de téléportation") + // /*spanish*/una canción de teletransportación + }, { + CustomMessage("a song of spooky spirits", /*german*/"", /*french*/"une hymne de chair de poule"), + // /*spanish*/la canción de los espectros + CustomMessage("a graveyard boogie", /*german*/"", /*french*/"un boogie de fantômes"), + // /*spanish*/una honra fúnebre + CustomMessage("a haunted hymn", /*german*/"", /*french*/"une chanson lugubre"), + // /*spanish*/una estrofa encantada + CustomMessage("a purple spark trail", /*german*/"", /*french*/"une comète mauve")}); + // /*spanish*/el sendero malva + + hintTextTable[RHT_PRELUDE_OF_LIGHT] = HintText(CustomMessage("the Prelude of Light", /*german*/"", /*french*/"le prélude de la lumière"), + // /*spanish*/el Preludio de la luz + { + CustomMessage("a warp song", /*german*/"", /*french*/"une chanson de téléportation") + // /*spanish*/una canción de teletransportación + }, { + CustomMessage("a luminous prologue melody", /*german*/"", /*french*/"une matine illuminée"), + // /*spanish*/la melodía refulgente + CustomMessage("a yellow spark trail", /*german*/"", /*french*/"une comète jaune"), + // /*spanish*/el sendero resplandeciente + CustomMessage("the temple traveler", /*german*/"", /*french*/"un chant de sanctuaire")}); + // /*spanish*/la ruta del templo + + hintTextTable[RHT_DEKU_TREE_MAP] = HintText(CustomMessage("the Deku Tree Map", /*german*/"", /*french*/"la carte de l'Arbre Mojo"), + // /*spanish*/el mapa del Gran Árbol Deku + { + CustomMessage("a dungeon map", /*german*/"", /*french*/"une carte") + // /*spanish*/un mapa + }, { + CustomMessage("a mossy atlas", /*german*/"", /*french*/"un atlas boisé"), + // /*spanish*/un atlas musgoso + CustomMessage("some mossy blueprints", /*german*/"", /*french*/"un plan boisé")}); + // /*spanish*/unos planos musgosos + + hintTextTable[RHT_DODONGOS_CAVERN_MAP] = HintText(CustomMessage("the Dodongo's Cavern Map", /*german*/"", /*french*/"la carte de la Caverne Dodongo"), + // /*spanish*/el mapa de la Cueva de los Dodongos + { + CustomMessage("a dungeon map", /*german*/"", /*french*/"une carte") + // /*spanish*/un mapa + }, { + CustomMessage("a rocky atlas", /*german*/"", /*french*/"un atlas rocheux"), + // /*spanish*/un atlas rocoso + CustomMessage("some rocky blueprints", /*german*/"", /*french*/"un plan rocheux")}); + // /*spanish*/unos planos rocosos + + hintTextTable[RHT_JABU_JABUS_BELLY_MAP] = HintText(CustomMessage("the Jabu-Jabu's Belly Map", /*german*/"", /*french*/"la carte de Jabu-Jabu"), + // /*spanish*/el mapa de la Tripa de Jabu-Jabu + { + CustomMessage("a dungeon map", /*german*/"", /*french*/"une carte") + // /*spanish*/un mapa + }, { + CustomMessage("a fishy atlas", /*german*/"", /*french*/"un atlas digéré"), + // /*spanish*/un atlas digesto + CustomMessage("some fishy blueprints", /*german*/"", /*french*/"un plan digéré")}); + // /*spanish*/unos planos digestos + + hintTextTable[RHT_FOREST_TEMPLE_MAP] = HintText(CustomMessage("the Forest Temple Map", /*german*/"", /*french*/"la carte du Temple de la Forêt"), + // /*spanish*/el mapa del Templo del Bosque + { + CustomMessage("a dungeon map", /*german*/"", /*french*/"une carte") + // /*spanish*/un mapa + }, { + CustomMessage("a sylvan atlas", /*german*/"", /*french*/"un atlas sylvestre"), + // /*spanish*/un atlas enselvado + CustomMessage("some sylvan blueprints", /*german*/"", /*french*/"un plan sylvestre")}); + // /*spanish*/unos planos enselvados + + hintTextTable[RHT_FIRE_TEMPLE_MAP] = HintText(CustomMessage("the Fire Temple Map", /*german*/"", /*french*/"la carte du Temple du Feu"), + // /*spanish*/el mapa del Templo del Fuego + { + CustomMessage("a dungeon map", /*german*/"", /*french*/"une carte") + // /*spanish*/un mapa + }, { + CustomMessage("a molten atlas", /*german*/"", /*french*/"un atlas fondu"), + // /*spanish*/un atlas fundido + CustomMessage("some molten blueprints", /*german*/"", /*french*/"un plan fondu")}); + // /*spanish*/unos planos fundidos + + hintTextTable[RHT_WATER_TEMPLE_MAP] = HintText(CustomMessage("the Water Temple Map", /*german*/"", /*french*/"la carte du Temple de l'Eau"), + // /*spanish*/el mapa del Templo del Agua + { + CustomMessage("a dungeon map", /*german*/"", /*french*/"une carte") + // /*spanish*/un mapa + }, { + CustomMessage("a wet atlas", /*german*/"", /*french*/"un atlas humide"), + // /*spanish*/un atlas mojado + CustomMessage("some wet blueprints", /*german*/"", /*french*/"un plan humide")}); + // /*spanish*/unos planos mojados + + hintTextTable[RHT_SPIRIT_TEMPLE_MAP] = HintText(CustomMessage("the Spirit Temple Map", /*german*/"", /*french*/"la carte du Temple de l'Esprit"), + // /*spanish*/el mapa del Templo del Espíritu + { + CustomMessage("a dungeon map", /*german*/"", /*french*/"une carte") + // /*spanish*/un mapa + }, { + CustomMessage("a sandy atlas", /*german*/"", /*french*/"un atlas sableux"), + // /*spanish*/un atlas arenoso + CustomMessage("some sandy blueprints", /*german*/"", /*french*/"un plan sableux")}); + // /*spanish*/unos planos arenosos + + hintTextTable[RHT_SHADOW_TEMPLE_MAP] = HintText(CustomMessage("the Shadow Temple Map", /*german*/"", /*french*/"la carte du Temple de l'Ombre"), + // /*spanish*/el mapa del Templo de las Sombras + { + CustomMessage("a dungeon map", /*german*/"", /*french*/"une carte") + // /*spanish*/un mapa + }, { + CustomMessage("a creepy atlas", /*german*/"", /*french*/"un atlas sinistre"), + // /*spanish*/un atlas siniestra + CustomMessage("some creepy blueprints", /*german*/"", /*french*/"un plan sinistre")}); + // /*spanish*/unos planos siniestras + + hintTextTable[RHT_BOTTOM_OF_THE_WELL_MAP] = HintText(CustomMessage("the Bottom of the Well Map", /*german*/"", /*french*/"la carte du fond du Puits"), + // /*spanish*/el mapa del Fondo del pozo + { + CustomMessage("a dungeon map", /*german*/"", /*french*/"une carte") + // /*spanish*/un mapa + }, { + CustomMessage("a moldy atlas", /*german*/"", /*french*/"un atlas moisi"), + // /*spanish*/un atlas mohoso + CustomMessage("some moldy blueprints", /*german*/"", /*french*/"un plan moisi")}); + // /*spanish*/unos planos mohosos + + hintTextTable[RHT_ICE_CAVERN_MAP] = HintText(CustomMessage("the Ice Cavern Map", /*german*/"", /*french*/"la carte de la Caverne Polaire"), + // /*spanish*/el mapa de la Caverna de hielo + { + CustomMessage("a dungeon map", /*german*/"", /*french*/"une carte") + // /*spanish*/un mapa + }, { + CustomMessage("a polar atlas", /*german*/"", /*french*/"un atlas polaire"), + // /*spanish*/un atlas polar + CustomMessage("some polar blueprints", /*german*/"", /*french*/"un plan polaire")}); + // /*spanish*/unos planos polars + + hintTextTable[RHT_DEKU_TREE_COMPASS] = HintText(CustomMessage("the Deku Tree Compass", /*german*/"", /*french*/"la boussole de l'Arbre Mojo"), + // /*spanish*/la brújula del Gran Árbol Deku + { + CustomMessage("a compass", /*german*/"", /*french*/"une boussole") + // /*spanish*/una brújula + }, { + CustomMessage("a mossy treasure tracker", /*german*/"", /*french*/"un cherche-trésor boisé"), + // /*spanish*/un zahorí musgoso + CustomMessage("a mossy magnetic needle", /*german*/"", /*french*/"une aimant boisée")}); + // /*spanish*/un imán musgoso + + hintTextTable[RHT_DODONGOS_CAVERN_COMPASS] = HintText(CustomMessage("the Dodongo's Cavern Compass", /*german*/"", /*french*/"la boussole de la Caverne Dodongo"), + // /*spanish*/la brújula de la Cueva de los Dodongos + { + CustomMessage("a compass", /*german*/"", /*french*/"une boussole") + // /*spanish*/una brújula + }, { + CustomMessage("a rocky treasure tracker", /*german*/"", /*french*/"un cherche-trésor rocheux"), + // /*spanish*/un zahorí rocoso + CustomMessage("a rocky magnetic needle", /*german*/"", /*french*/"une aimant rocheux")}); + // /*spanish*/un imán rocoso + + hintTextTable[RHT_JABU_JABUS_BELLY_COMPASS] = HintText(CustomMessage("the Jabu-Jabu's Belly Compass", /*german*/"", /*french*/"la boussole de Jabu-Jabu"), + // /*spanish*/la brújula de la Tripa de Jabu-Jabu + { + CustomMessage("a compass", /*german*/"", /*french*/"une boussole") + // /*spanish*/una brújula + }, { + CustomMessage("a fishy treasure tracker", /*german*/"", /*french*/"un cherche-trésor digéré"), + // /*spanish*/un zahorí digesto + CustomMessage("a fishy magnetic needle", /*german*/"", /*french*/"une aimant digéré")}); + // /*spanish*/un imán digesto + + hintTextTable[RHT_FOREST_TEMPLE_COMPASS] = HintText(CustomMessage("the Forest Temple Compass", /*german*/"", /*french*/"la boussole du Temple de la Forêt"), + // /*spanish*/la brújula del Templo del Bosque + { + CustomMessage("a compass", /*german*/"", /*french*/"une boussole") + // /*spanish*/una brújula + }, { + CustomMessage("a sylvan treasure tracker", /*german*/"", /*french*/"un cherche-trésor sylvestre"), + // /*spanish*/un zahorí enselvado + CustomMessage("a sylvan magnetic needle", /*german*/"", /*french*/"une aimant sylvestre")}); + // /*spanish*/un imán enselvado + + hintTextTable[RHT_FIRE_TEMPLE_COMPASS] = HintText(CustomMessage("the Fire Temple Compass", /*german*/"", /*french*/"la boussole du Temple du Feu"), + // /*spanish*/la brújula del Templo del Fuego + { + CustomMessage("a compass", /*german*/"", /*french*/"une boussole") + // /*spanish*/una brújula + }, { + CustomMessage("a molten treasure tracker", /*german*/"", /*french*/"un cherche-trésor fondu"), + // /*spanish*/un zahorí fundido + CustomMessage("a molten magnetic needle", /*german*/"", /*french*/"une aimant fondu")}); + // /*spanish*/un imán fundido + + hintTextTable[RHT_WATER_TEMPLE_COMPASS] = HintText(CustomMessage("the Water Temple Compass", /*german*/"", /*french*/"la boussole du Temple de l'Eau"), + // /*spanish*/la brújula del Templo del Agua + { + CustomMessage("a compass", /*german*/"", /*french*/"une boussole") + // /*spanish*/una brújula + }, { + CustomMessage("a wet treasure tracker", /*german*/"", /*french*/"un cherche-trésor humide"), + // /*spanish*/un zahorí mojado + CustomMessage("a wet magnetic needle", /*german*/"", /*french*/"une aimant humide")}); + // /*spanish*/un imán mojado + + hintTextTable[RHT_SPIRIT_TEMPLE_COMPASS] = HintText(CustomMessage("the Spirit Temple Compass", /*german*/"", /*french*/"la boussole du Temple de l'Esprit"), + // /*spanish*/la brújula del Templo del Espíritu + { + CustomMessage("a compass", /*german*/"", /*french*/"une boussole") + // /*spanish*/una brújula + }, { + CustomMessage("a sandy treasure tracker", /*german*/"", /*french*/"un cherche-trésor sableux"), + // /*spanish*/un zahorí arenoso + CustomMessage("a sandy magnetic needle", /*german*/"", /*french*/"une aimant sableux")}); + // /*spanish*/un imán arenoso + + hintTextTable[RHT_SHADOW_TEMPLE_COMPASS] = HintText(CustomMessage("the Shadow Temple Compass", /*german*/"", /*french*/"la boussole du Temple de l'Ombre"), + // /*spanish*/la brújula del Templo de las Sombras + { + CustomMessage("a compass", /*german*/"", /*french*/"une boussole") + // /*spanish*/una brújula + }, { + CustomMessage("a creepy treasure tracker", /*german*/"", /*french*/"un cherche-trésor sinistre"), + // /*spanish*/un zahorí siniestra + CustomMessage("a creepy magnetic needle", /*german*/"", /*french*/"une aimant sinistre")}); + // /*spanish*/un imán siniestra + + hintTextTable[RHT_BOTTOM_OF_THE_WELL_COMPASS] = HintText(CustomMessage("the Bottom of the Well Compass", /*german*/"", /*french*/"la boussole du fond du Puits"), + // /*spanish*/la brújula del Fondo del pozo + { + CustomMessage("a compass", /*german*/"", /*french*/"une boussole") + // /*spanish*/una brújula + }, { + CustomMessage("a dank treasure tracker", /*german*/"", /*french*/"un cherche-trésor moisi"), + // /*spanish*/un zahorí mohoso + CustomMessage("a dank magnetic needle", /*german*/"", /*french*/"une aimant moisi")}); + // /*spanish*/un imán mohoso + + hintTextTable[RHT_ICE_CAVERN_COMPASS] = HintText(CustomMessage("the Ice Cavern Compass", /*german*/"", /*french*/"la Boussole de la Caverne Polaire"), + // /*spanish*/la brújula de la Caverna de hielo + { + CustomMessage("a compass", /*german*/"", /*french*/"une boussole") + // /*spanish*/una brújula + }, { + CustomMessage("a polar treasure tracker", /*german*/"", /*french*/"un cherche-trésor polaire"), + // /*spanish*/un zahorí polar + CustomMessage("a polar magnetic needle", /*german*/"", /*french*/"une aimant polaire")}); + // /*spanish*/un imán polar + + hintTextTable[RHT_FOREST_TEMPLE_BOSS_KEY] = HintText(CustomMessage("the Forest Temple Boss Key", /*german*/"", /*french*/"la Clé d'Or du Temple de la Forêt"), + // /*spanish*/la gran llave del Templo del Bosque + { + CustomMessage("a boss key", /*german*/"", /*french*/"une Clé d'Or") + // /*spanish*/una gran llave + }, { + CustomMessage("a sylvan master of unlocking", /*german*/"", /*french*/"un anti-grosse porte sylvestre"), + // /*spanish*/la clave enselvada de un jefe + CustomMessage("a sylvan dungeon's master pass", /*german*/"", /*french*/"une clé maléfique sylvestree")}); + // /*spanish*/el pase maestro enselvado + + hintTextTable[RHT_FIRE_TEMPLE_BOSS_KEY] = HintText(CustomMessage("the Fire Temple Boss Key", /*german*/"", /*french*/"la Clé d'Or du Temple du Feu"), + // /*spanish*/la gran llave del Templo del Fuego + { + CustomMessage("a boss key", /*german*/"", /*french*/"une Clé d'Or") + // /*spanish*/una gran llave + }, { + CustomMessage("a molten master of unlocking", /*german*/"", /*french*/"un anti-grosse porte fondu"), + // /*spanish*/la clave fundido de un jefe + CustomMessage("a molten dungeon's master pass", /*german*/"", /*french*/"une clé maléfique fondu")}); + // /*spanish*/el pase maestro fundido + + hintTextTable[RHT_WATER_TEMPLE_BOSS_KEY] = HintText(CustomMessage("the Water Temple Boss Key", /*german*/"", /*french*/"la Clé d'Or du Temple de l'Eau"), + // /*spanish*/la gran llave del Templo del Agua + { + CustomMessage("a boss key", /*german*/"", /*french*/"une Clé d'Or") + // /*spanish*/una gran llave + }, { + CustomMessage("a wet master of unlocking", /*german*/"", /*french*/"un anti-grosse porte humide"), + // /*spanish*/la clave mojado de un jefe + CustomMessage("a wet dungeon's master pass", /*german*/"", /*french*/"une clé maléfique humide")}); + // /*spanish*/el pase maestro mojado + + hintTextTable[RHT_SPIRIT_TEMPLE_BOSS_KEY] = HintText(CustomMessage("the Spirit Temple Boss Key", /*german*/"", /*french*/"la Clé d'Or du Temple de l'Esprit"), + // /*spanish*/la gran llave del Templo del Espíritu + { + CustomMessage("a boss key", /*german*/"", /*french*/"une Clé d'Or") + // /*spanish*/una gran llave + }, { + CustomMessage("a sandy master of unlocking", /*german*/"", /*french*/"un anti-grosse porte sableux"), + // /*spanish*/la clave arenoso de un jefe + CustomMessage("a sandy dungeon's master pass", /*german*/"", /*french*/"une clé maléfique sableux")}); + // /*spanish*/el pase maestro arenoso + + hintTextTable[RHT_SHADOW_TEMPLE_BOSS_KEY] = HintText(CustomMessage("the Shadow Temple Boss Key", /*german*/"", /*french*/"la Clé d'Or du Temple de l'Ombre"), + // /*spanish*/la gran llave del Templo de las Sombras + { + CustomMessage("a boss key", /*german*/"", /*french*/"une Clé d'Or") + // /*spanish*/una gran llave + }, { + CustomMessage("a creepy master of unlocking", /*german*/"", /*french*/"un anti-grosse porte sinistre"), + // /*spanish*/la clave siniestra de un jefe + CustomMessage("a creepy dungeon's master pass", /*german*/"", /*french*/"une clé maléfique sinistre")}); + // /*spanish*/el pase maestro siniestra + + hintTextTable[RHT_GANONS_CASTLE_BOSS_KEY] = HintText(CustomMessage("the Ganon's Castle Boss Key", /*german*/"", /*french*/"la Clé d'Or du Château de Ganon"), + // /*spanish*/la gran llave del Castillo de Ganon + { + CustomMessage("a boss key", /*german*/"", /*french*/"une Clé d'Or") + // /*spanish*/una gran llave + }, { + CustomMessage("a final master of unlocking", /*german*/"", /*french*/"un anti-grosse porte final"), + // /*spanish*/la clave final de un jefe + CustomMessage("a final dungeon's master pass", /*german*/"", /*french*/"une clé maléfique final")}); + // /*spanish*/el pase maestro final + + hintTextTable[RHT_FOREST_TEMPLE_SMALL_KEY] = HintText(CustomMessage("a Forest Temple Small Key", /*german*/"", /*french*/"une petite clé du Temple de la Forêt"), + // /*spanish*/una llave pequeña del Templo del Bosque + { + CustomMessage("a small key", /*german*/"", /*french*/"une petite clé") + // /*spanish*/una llave pequeña + }, { + CustomMessage("a sylvan tool for unlocking", /*german*/"", /*french*/"un anti-porte sylvestre"), + // /*spanish*/una clave de una entrada enselvada + CustomMessage("a sylvan dungeon pass", /*german*/"", /*french*/"le rêve sylvestre d'un prisonnier"), + // /*spanish*/un pase de una mazmorra enselvada + CustomMessage("a sylvan lock remover", /*german*/"", /*french*/"un efface-serrure sylvestre"), + // /*spanish*/un destructor de cerraduras enselvada + CustomMessage("a sylvan lockpick", /*german*/"", /*french*/"un crochet à porte sylvestre")}); + // /*spanish*/una apertura portentosa enselvada + + hintTextTable[RHT_FIRE_TEMPLE_SMALL_KEY] = HintText(CustomMessage("a Fire Temple Small Key", /*german*/"", /*french*/"une petite clé du Temple du Feu"), + // /*spanish*/una llave pequeña del Templo del Fuego + { + CustomMessage("a small key", /*german*/"", /*french*/"une petite clé") + // /*spanish*/una llave pequeña + }, { + CustomMessage("a molten tool for unlocking", /*german*/"", /*french*/"un anti-porte fondu"), + // /*spanish*/una clave de una entrada fundida + CustomMessage("a molten dungeon pass", /*german*/"", /*french*/"le rêve fondu d'un prisonnier"), + // /*spanish*/un pase de una mazmorra fundida + CustomMessage("a molten lock remover", /*german*/"", /*french*/"un efface-serrure fondu"), + // /*spanish*/un destructor de cerraduras fundida + CustomMessage("a molten lockpick", /*german*/"", /*french*/"un crochet à porte fondu")}); + // /*spanish*/una apertura portentosa fundida + + hintTextTable[RHT_WATER_TEMPLE_SMALL_KEY] = HintText(CustomMessage("a Water Temple Small Key", /*german*/"", /*french*/"une petite clé du Temple de l'Eau"), + // /*spanish*/una llave pequeña del Templo del Agua + { + CustomMessage("a small key", /*german*/"", /*french*/"une petite clé") + // /*spanish*/una llave pequeña + }, { + CustomMessage("a wet tool for unlocking", /*german*/"", /*french*/"un anti-porte humide"), + // /*spanish*/una clave de una entrada mojada + CustomMessage("a wet dungeon pass", /*german*/"", /*french*/"le rêve humide d'un prisonnier"), + // /*spanish*/un pase de una mazmorra mojada + CustomMessage("a wet lock remover", /*german*/"", /*french*/"un efface-serrure humide"), + // /*spanish*/un destructor de cerraduras mojada + CustomMessage("a wet lockpick", /*german*/"", /*french*/"un crochet à porte humide")}); + // /*spanish*/una apertura portentosa mojada + + hintTextTable[RHT_SPIRIT_TEMPLE_SMALL_KEY] = HintText(CustomMessage("a Spirit Temple Small Key", /*german*/"", /*french*/"une petite clé du Temple de l'Esprit"), + // /*spanish*/una llave pequeña del Templo del Espíritu + { + CustomMessage("a small key", /*german*/"", /*french*/"une petite clé") + // /*spanish*/una llave pequeña + }, { + CustomMessage("a sandy tool for unlocking", /*german*/"", /*french*/"un anti-porte sableux"), + // /*spanish*/una clave de una entrada arenosa + CustomMessage("a sandy dungeon pass", /*german*/"", /*french*/"le rêve sableux d'un prisonnier"), + // /*spanish*/un pase de una mazmorra arenosa + CustomMessage("a sandy lock remover", /*german*/"", /*french*/"un efface-serrure sableux"), + // /*spanish*/un destructor de cerraduras arenosa + CustomMessage("a sandy lockpick", /*german*/"", /*french*/"un crochet à porte sableux")}); + // /*spanish*/una apertura portentosa arenosa + + hintTextTable[RHT_SHADOW_TEMPLE_SMALL_KEY] = HintText(CustomMessage("a Shadow Temple Small Key", /*german*/"", /*french*/"une petite clé du Temple de l'Ombre"), + // /*spanish*/una llave pequeña del Templo de las Sombras + { + CustomMessage("a small key", /*german*/"", /*french*/"une petite clé") + // /*spanish*/una llave pequeña + }, { + CustomMessage("a creepy tool for unlocking", /*german*/"", /*french*/"un anti-porte sinistre"), + // /*spanish*/una clave de una entrada siniestra:a + CustomMessage("a creepy dungeon pass", /*german*/"", /*french*/"le rêve sinistre d'un prisonnier"), + // /*spanish*/un pase de una mazmorra siniestra:a + CustomMessage("a creepy lock remover", /*german*/"", /*french*/"un efface-serrure sinistre"), + // /*spanish*/un destructor de cerraduras siniestra:a + CustomMessage("a creepy lockpick", /*german*/"", /*french*/"un crochet à porte sinistre")}); + // /*spanish*/una apertura portentosa siniestra:a + + hintTextTable[RHT_GERUDO_TRAINING_GROUNDS_SMALL_KEY] = HintText(CustomMessage("a Gerudo Training Ground Small Key", /*german*/"", /*french*/"une petite clé du Gymnase Gerudo"), + // /*spanish*/una llave pequeña del Centro de Instrucción Gerudo + { + CustomMessage("a small key", /*german*/"", /*french*/"une petite clé") + // /*spanish*/una llave pequeña + }, { + CustomMessage("a labyrinthian tool for unlocking", /*german*/"", /*french*/"un anti-porte labyrinthique"), + // /*spanish*/una clave de una entrada laberíntica + CustomMessage("a labyrinthian dungeon pass", /*german*/"", /*french*/"le rêve labyrinthique d'un prisonnier"), + // /*spanish*/un pase de una mazmorra laberíntica + CustomMessage("a labyrinthian lock remover", /*german*/"", /*french*/"un efface-serrure labyrinthique"), + // /*spanish*/un destructor de cerraduras laberíntica + CustomMessage("a labyrinthian lockpick", /*german*/"", /*french*/"un crochet à porte labyrinthique")}); + // /*spanish*/una apertura portentosa laberíntica + + hintTextTable[RHT_GERUDO_FORTRESS_SMALL_KEY] = HintText(CustomMessage("a Gerudo Fortress Small Key", /*german*/"", /*french*/"une petite clé de la Repaire des Voleurs"), + // /*spanish*/una llave pequeña de la Fortaleza Gerudo + { + CustomMessage("a small key", /*german*/"", /*french*/"une petite clé") + // /*spanish*/una llave pequeña + }, { + CustomMessage("an imprisoned tool for unlocking", /*german*/"", /*french*/"un anti-porte emprisonné"), + // /*spanish*/una clave de una entrada encarcelada + CustomMessage("an imprisoned dungeon pass", /*german*/"", /*french*/"le rêve emprisonné d'un prisonnier"), + // /*spanish*/un pase de una mazmorra encarcelada + CustomMessage("an imprisoned lock remover", /*german*/"", /*french*/"un efface-serrure emprisonné"), + // /*spanish*/un destructor de cerraduras encarcelada + CustomMessage("an imprisoned lockpick", /*german*/"", /*french*/"un crochet à porte emprisonné")}); + // /*spanish*/una apertura portentosa encarcelada + + hintTextTable[RHT_BOTTOM_OF_THE_WELL_SMALL_KEY] = HintText(CustomMessage("a Bottom of the Well Small Key", /*german*/"", /*french*/"une petite clé du fond du Puits"), + // /*spanish*/una llave pequeña del Fondo del pozo + { + CustomMessage("a small key", /*german*/"", /*french*/"une petite clé") + // /*spanish*/una llave pequeña + }, { + CustomMessage("a moldy tool for unlocking", /*german*/"", /*french*/"un anti-porte moisi"), + // /*spanish*/una clave de una entrada mohosa + CustomMessage("a moldy dungeon pass", /*german*/"", /*french*/"le rêve moisi d'un prisonnier"), + // /*spanish*/un pase de una mazmorra mohosa + CustomMessage("a moldy lock remover", /*german*/"", /*french*/"un efface-serrure moisi"), + // /*spanish*/un destructor de cerraduras mohosa + CustomMessage("a moldy lockpick", /*german*/"", /*french*/"un crochet à porte moisi")}); + // /*spanish*/una apertura portentosa mohosa + + hintTextTable[RHT_GANONS_CASTLE_SMALL_KEY] = HintText(CustomMessage("a Ganon's Castle Small Key", /*german*/"", /*french*/"une petite clé du Château de Ganon"), + // /*spanish*/una llave pequeña del Castillo de Ganon + { + CustomMessage("a small key", /*german*/"", /*french*/"une petite clé") + // /*spanish*/una llave pequeña + }, { + CustomMessage("a final tool for unlocking", /*german*/"", /*french*/"un anti-porte final"), + // /*spanish*/una clave de una entrada final + CustomMessage("a final dungeon pass", /*german*/"", /*french*/"le rêve final d'un prisonnier"), + // /*spanish*/un pase de una mazmorra final + CustomMessage("a final lock remover", /*german*/"", /*french*/"un efface-serrure final"), + // /*spanish*/un destructor de cerraduras final + CustomMessage("a final lockpick", /*german*/"", /*french*/"un crochet à porte final")}); + // /*spanish*/una apertura portentosa final + + hintTextTable[RHT_FOREST_TEMPLE_KEY_RING] = HintText(CustomMessage("a Forest Temple Key Ring", /*german*/"", /*french*/"un trousseau de clés du Temple de la Forêt"), + // /*spanish*/un llavero del Templo del Bosque + { + CustomMessage("a key ring", /*german*/"", /*french*/"un trousseau de clés") + // /*spanish*/un llavero + }, { + CustomMessage("a sylvan toolbox for unlocking", /*german*/"", /*french*/"des anti-portes sylvestres"), + // /*spanish*/un conjunto silvestre de cerrajero + CustomMessage("a sylvan dungeon season pass", /*german*/"", /*french*/"les rêves sylvestres d'un prisonnier"), + // /*spanish*/un pase vip de mazmorras silvestre + CustomMessage("a sylvan jingling ring", /*german*/"", /*french*/"des efface-serrures sylvestres"), + // /*spanish*/una cadena multiusos silvestre + CustomMessage("a sylvan skeleton key", /*german*/"", /*french*/"des crochets à porte sylvestres")}); + // /*spanish*/un anillo silvestre contra cerrojos + + hintTextTable[RHT_FIRE_TEMPLE_KEY_RING] = HintText(CustomMessage("a Fire Temple Key Ring", /*german*/"", /*french*/"un trousseau de clés du Temple du Feu"), + // /*spanish*/un llavero del Templo del Fuego + { + CustomMessage("a key ring", /*german*/"", /*french*/"un trousseau de clés") + // /*spanish*/un llavero + }, { + CustomMessage("a molten toolbox for unlocking", /*german*/"", /*french*/"des anti-portes fondus"), + // /*spanish*/un conjunto fundido de cerrajero + CustomMessage("a molten dungeon season pass", /*german*/"", /*french*/"les rêves fondus d'un prisonnier"), + // /*spanish*/un pase vip de mazmorras fundido + CustomMessage("a molten jingling ring", /*german*/"", /*french*/"des efface-serrures fondus"), + // /*spanish*/una cadena multiusos fundida + CustomMessage("a molten skeleton key", /*german*/"", /*french*/"des crochets à porte fondus")}); + // /*spanish*/un anillo fundido contra cerrojos + + hintTextTable[RHT_WATER_TEMPLE_KEY_RING] = HintText(CustomMessage("a Water Temple Key Ring", /*german*/"", /*french*/"un trousseau de clés du Temple de l'Eau"), + // /*spanish*/un llavero del Templo del Agua + { + CustomMessage("a key ring", /*german*/"", /*french*/"un trousseau de clés") + // /*spanish*/un llavero + }, { + CustomMessage("a wet toolbox for unlocking", /*german*/"", /*french*/"des anti-portes humides"), + // /*spanish*/un conjunto abisal de cerrajero + CustomMessage("a wet dungeon season pass", /*german*/"", /*french*/"les rêves humides d'un prisonnier"), + // /*spanish*/un pase vip de mazmorras abisal + CustomMessage("a wet jingling ring", /*german*/"", /*french*/"des efface-serrures humides"), + // /*spanish*/una cadena multiusos abisal + CustomMessage("a wet skeleton key", /*german*/"", /*french*/"des crochets à porte humides")}); + // /*spanish*/un anillo abisal contra cerrojos + + hintTextTable[RHT_SPIRIT_TEMPLE_KEY_RING] = HintText(CustomMessage("a Spirit Temple Key Ring", /*german*/"", /*french*/"un trousseau de clés du Temple de l'Esprit"), + // /*spanish*/un llavero del Templo del Espíritu + { + CustomMessage("a key ring", /*german*/"", /*french*/"un trousseau de clés") + // /*spanish*/un llavero + }, { + CustomMessage("a sandy toolbox for unlocking", /*german*/"", /*french*/"des anti-portes sableux"), + // /*spanish*/un conjunto arenoso de cerrajero + CustomMessage("a sandy dungeon season pass", /*german*/"", /*french*/"les rêves sableux d'un prisonnier"), + // /*spanish*/un pase vip de mazmorras arenoso + CustomMessage("a sandy jingling ring", /*german*/"", /*french*/"des efface-serrures sableux"), + // /*spanish*/una cadena multiusos arenosa + CustomMessage("a sandy skeleton key", /*german*/"", /*french*/"des crochets à porte sableux")}); + // /*spanish*/un anillo arenoso contra cerrojos + + hintTextTable[RHT_SHADOW_TEMPLE_KEY_RING] = HintText(CustomMessage("a Shadow Temple Key Ring", /*german*/"", /*french*/"un trousseau de clés du Temple de l'Ombre"), + // /*spanish*/un llavero del Templo de las Sombras + { + CustomMessage("a key ring", /*german*/"", /*french*/"un trousseau de clés") + // /*spanish*/un llavero + }, { + CustomMessage("a creepy toolbox for unlocking", /*german*/"", /*french*/"des anti-portes sinistres"), + // /*spanish*/un conjunto tenebroso de cerrajero + CustomMessage("a creepy dungeon season pass", /*german*/"", /*french*/"les rêves sinistres d'un prisonnier"), + // /*spanish*/un pase vip de mazmorras tenebroso + CustomMessage("a creepy jingling ring", /*german*/"", /*french*/"des efface-serrures sinistres"), + // /*spanish*/una cadena multiusos tenebrosa + CustomMessage("a creepy skeleton key", /*german*/"", /*french*/"des crochets à porte sinistres")}); + // /*spanish*/un anillo tenebroso contra cerrojos + + hintTextTable[RHT_GERUDO_TRAINING_GROUNDS_KEY_RING] = HintText(CustomMessage("a Gerudo Training Ground Key Ring", /*german*/"", /*french*/"un trousseau de clés du Gymnase Gerudo"), + // /*spanish*/un llavero del Centro de Instrucción Gerudo + { + CustomMessage("a key ring", /*german*/"", /*french*/"un trousseau de clés") + // /*spanish*/un llavero + }, { + CustomMessage("a labyrinthian toolbox for unlocking", /*german*/"", /*french*/"des anti-portes labyrinthiques"), + // /*spanish*/un conjunto laberíntico de cerrajero + CustomMessage("a labyrinthian dungeon season pass", /*german*/"", /*french*/"les rêves labyrinthiques d'un prisonnier"), + // /*spanish*/un pase vip de mazmorras laberíntico + CustomMessage("a labyrinthian jingling ring", /*german*/"", /*french*/"des efface-serrures labyrinthiques"), + // /*spanish*/una cadena multiusos laberíntica + CustomMessage("a labyrinthian skeleton key", /*german*/"", /*french*/"des crochets à porte labyrinthiques")}); + // /*spanish*/un anillo laberíntico contra cerrojos + + hintTextTable[RHT_GERUDO_FORTRESS_KEY_RING] = HintText(CustomMessage("a Gerudo Fortress Key Ring", /*german*/"", /*french*/"un trousseau de clés de la Repaire des Voleurs"), + // /*spanish*/un llavero de la Fortaleza Gerudo + { + CustomMessage("a key ring", /*german*/"", /*french*/"un trousseau de clés") + // /*spanish*/un llavero + }, { + CustomMessage("an imprisoned toolbox for unlocking", /*german*/"", /*french*/"des anti-portes emprisonnés"), + // /*spanish*/un conjunto enjaulado de cerrajero + CustomMessage("an imprisoned dungeon season pass", /*german*/"", /*french*/"les rêves emprisonnés d'un prisonnier"), + // /*spanish*/un pase vip de una mazmorra enjaulado + CustomMessage("an imprisoned jingling ring", /*german*/"", /*french*/"des efface-serrures emprisonnés"), + // /*spanish*/una cadena multiusos enjaulada + CustomMessage("an imprisoned skeleton key", /*german*/"", /*french*/"des crochets à porte emprisonnés")}); + // /*spanish*/un anillo enjaulado contra cerrojos + + hintTextTable[RHT_BOTTOM_OF_THE_WELL_KEY_RING] = HintText(CustomMessage("a Bottom of the Well Key Ring", /*german*/"", /*french*/"un trousseau de clés du fond du Puits"), + // /*spanish*/un llavero del Fondo del pozo + { + CustomMessage("a key ring", /*german*/"", /*french*/"un trousseau de clés") + // /*spanish*/un llavero + }, { + CustomMessage("a moldy toolbox for unlocking", /*german*/"", /*french*/"des anti-portes moisis"), + // /*spanish*/un conjunto subterráneo de cerrajero + CustomMessage("a moldy dungeon season pass", /*german*/"", /*french*/"les rêves moisis d'un prisonnier"), + // /*spanish*/un pase vip de una mazmorra subterráneo + CustomMessage("a moldy jingling ring", /*german*/"", /*french*/"des efface-serrures moisis"), + // /*spanish*/una cadena multiusos subterránea + CustomMessage("a moldy skeleton key", /*german*/"", /*french*/"des crochets à porte moisis")}); + // /*spanish*/un anillo subterráneo contra cerrojos + + hintTextTable[RHT_GANONS_CASTLE_KEY_RING] = HintText(CustomMessage("a Ganon's Castle Key Ring", /*german*/"", /*french*/"un trousseau de clés du Château de Ganon"), + // /*spanish*/un llavero del Castillo de Ganon + { + CustomMessage("a key ring", /*german*/"", /*french*/"un trousseau de clés") + // /*spanish*/un llavero + }, { + CustomMessage("a final toolbox for unlocking", /*german*/"", /*french*/"des anti-portes finaux"), + // /*spanish*/un conjunto decisivo de cerrajero + CustomMessage("a final dungeon season pass", /*german*/"", /*french*/"les rêves finaux d'un prisonnier"), + // /*spanish*/un pase vip de una mazmorra decisivo + CustomMessage("a final jingling ring", /*german*/"", /*french*/"des efface-serrures finaux"), + // /*spanish*/una cadena multiusos decisiva + CustomMessage("a final skeleton key", /*german*/"", /*french*/"des crochets à porte finaux")}); + // /*spanish*/un anillo decisivo multiusos + + hintTextTable[RHT_TREASURE_GAME_SMALL_KEY] = HintText(CustomMessage("a Treasure Chest Shop Small Key", /*german*/"", /*french*/"une petite clé de la chasse aux trésors"), + // /*spanish*/una llave pequeña del Cofre del Tesoro + { + CustomMessage("a small key", /*german*/"", /*french*/"une petite clé") + // /*spanish*/una llave pequeña + }, { + CustomMessage("a gambler's tool for unlocking", /*german*/"", /*french*/"un anti-porte de parieur"), + // /*spanish*/una clave de un juego de azar + CustomMessage("a gambler's dungeon pass", /*german*/"", /*french*/"le rêve d'un prisonnier parieur"), + // /*spanish*/un pase de un juego de azar + CustomMessage("a gambler's lock remover", /*german*/"", /*french*/"un efface-serrure de parieur"), + // /*spanish*/un destructor de cerraduras del juego de azar + CustomMessage("a gambler's lockpick", /*german*/"", /*french*/"un crochet à serrure de parieur")}); + // /*spanish*/una apertura portentosa del juego de azar + + hintTextTable[RHT_KOKIRI_EMERALD] = HintText(CustomMessage("the Kokiri Emerald", /*german*/"", /*french*/"l'Émeraude Kokiri"), + // /*spanish*/la Esmeralda de los Kokiri + { + CustomMessage("a spiritual stone", /*german*/"", /*french*/"une Pierre Ancestrale") + // /*spanish*/una piedra espiritual + }, { + CustomMessage("a green stone", /*german*/"", /*french*/"une pierre verte"), + // /*spanish*/una piedra verde + CustomMessage("a gift before death", /*german*/"", /*french*/"le dernier souffle d'un arbre")}); + // /*spanish*/un obsequio testamentario + + hintTextTable[RHT_GORON_RUBY] = HintText(CustomMessage("the Goron Ruby", /*german*/"", /*french*/"le Rubis Goron"), + // /*spanish*/el Rubí de los Goron + { + CustomMessage("a spiritual stone", /*german*/"", /*french*/"une Pierre Ancestrale") + // /*spanish*/una piedra espiritual + }, { + CustomMessage("a red stone", /*german*/"", /*french*/"une pierre rouge"), + // /*spanish*/una piedra carmín + CustomMessage("sworn brotherhood", /*german*/"", /*french*/"un serment de fraternité")}); + // /*spanish*/el juramento de hermanos de sangre + + hintTextTable[RHT_ZORA_SAPPHIRE] = HintText(CustomMessage("the Zora Sapphire", /*german*/"", /*french*/"le Saphir Zora"), + // /*spanish*/el Zafiro de los Zora + { + CustomMessage("a spiritual stone", /*german*/"", /*french*/"une Pierre Ancestrale") + // /*spanish*/una piedra espiritual + }, { + CustomMessage("a blue stone", /*german*/"", /*french*/"une pierre bleue"), + // /*spanish*/una piedra celeste + CustomMessage("an engagement gift", /*german*/"", /*french*/"un cadeau de mariage")}); + // /*spanish*/un regalo de compromiso + + hintTextTable[RHT_FOREST_MEDALLION] = HintText(CustomMessage("the Forest Medallion", /*german*/"", /*french*/"le Médaillon de la Forêt"), + // /*spanish*/el Medallón del Bosque + { + CustomMessage("a medallion", /*german*/"", /*french*/"un médaillon") + // /*spanish*/un medallón + }, { + CustomMessage("a green coin", /*german*/"", /*french*/"une pièce verte"), + // /*spanish*/una moneda esmeralda + CustomMessage("Saria's friendship", /*german*/"", /*french*/"l'amitié de Saria")}); + // /*spanish*/la amistad de Saria + + hintTextTable[RHT_FIRE_MEDALLION] = HintText(CustomMessage("the Fire Medallion", /*german*/"", /*french*/"le Médaillon du Feu"), + // /*spanish*/el Medallón del Fuego + { + CustomMessage("a medallion", /*german*/"", /*french*/"un médaillon") + // /*spanish*/un medallón + }, { + CustomMessage("a red coin", /*german*/"", /*french*/"une pièce rouge"), + // /*spanish*/una moneda rubí + CustomMessage("Darunia's power", /*german*/"", /*french*/"la fraternité de Darunia")}); + // /*spanish*/la fraternidad de Darunia + + hintTextTable[RHT_WATER_MEDALLION] = HintText(CustomMessage("the Water Medallion", /*german*/"", /*french*/"le Médaillon de l'Eau"), + // /*spanish*/el Medallón del Agua + { + CustomMessage("a medallion", /*german*/"", /*french*/"un médaillon") + // /*spanish*/un medallón + }, { + CustomMessage("a blue coin", /*german*/"", /*french*/"une pièce bleue"), + // /*spanish*/una moneda zafiro + CustomMessage("Ruto's power", /*german*/"", /*french*/"l'amour de Ruto")}); + // /*spanish*/el amor de Ruto + + hintTextTable[RHT_SPIRIT_MEDALLION] = HintText(CustomMessage("the Spirit Medallion", /*german*/"", /*french*/"le Médaillon de l'Esprit"), + // /*spanish*/el Medallón del Espíritu + { + CustomMessage("a medallion", /*german*/"", /*french*/"un médaillon") + // /*spanish*/un medallón + }, { + CustomMessage("an orange coin", /*german*/"", /*french*/"une pièce orange"), + // /*spanish*/una moneda ámbar + CustomMessage("Nabooru's power", /*german*/"", /*french*/"le respect de Nabooru")}); + // /*spanish*/el respeto de Nabooru + + hintTextTable[RHT_SHADOW_MEDALLION] = HintText(CustomMessage("the Shadow Medallion", /*german*/"", /*french*/"le Médaillon de l'Ombre"), + // /*spanish*/el Medallón de la Sombra + { + CustomMessage("a medallion", /*german*/"", /*french*/"un médaillon") + // /*spanish*/un medallón + }, { + CustomMessage("a purple coin", /*german*/"", /*french*/"une pièce pourpre"), + // /*spanish*/una moneda malva + CustomMessage("Impa's power", /*german*/"", /*french*/"la confiance d'Impa")}); + // /*spanish*/la confianza de Impa + + hintTextTable[RHT_LIGHT_MEDALLION] = HintText(CustomMessage("the Light Medallion", /*german*/"", /*french*/"le Médaillon de la Lumière"), + // /*spanish*/el Medallón de la Luz + { + CustomMessage("a medallion", /*german*/"", /*french*/"un médaillon") + // /*spanish*/un medallón + }, { + CustomMessage("a yellow coin", /*german*/"", /*french*/"une pièce jaune"), + // /*spanish*/una moneda resplandeciente + CustomMessage("Rauru's power", /*german*/"", /*french*/"la foi de Rauru")}); + // /*spanish*/la fe de Rauru + + hintTextTable[RHT_RECOVERY_HEART] = HintText(CustomMessage("a Recovery Heart", /*german*/"", /*french*/"un coeur de vie"), + // /*spanish*/un corazón + { + CustomMessage("something heart-shaped", /*german*/"", /*french*/"une chose en forme de coeur") + // /*spanish*/algo con forma de corazón + }, { + CustomMessage("a free heal", /*german*/"", /*french*/"un bec-au-bobo"), + // /*spanish*/una cura de regalo + CustomMessage("a hearty meal", /*german*/"", /*french*/"un petit amour"), + // /*spanish*/una sanación romántica + CustomMessage("a Band-Aid", /*german*/"", /*french*/"un diachylon")}); + // /*spanish*/un corazoncito sanador + + hintTextTable[RHT_GREEN_RUPEE] = HintText(CustomMessage("a Green Rupee", /*german*/"", /*french*/"un rubis vert"), + // /*spanish*/una rupia verde + { + CustomMessage("some rupees", /*german*/"", /*french*/"une quantité de rubis") + // /*spanish*/una cantidad de rupias + }, { + CustomMessage("a unique coin", /*german*/"", /*french*/"un rubis bien mérité"), + // /*spanish*/una singular moneda + CustomMessage("a penny", /*german*/"", /*french*/"un sou"), + // /*spanish*/un peso hyliano + CustomMessage("a green gem", /*german*/"", /*french*/"un joyau vert")}); + // /*spanish*/una gema verde + + hintTextTable[RHT_GREG_RUPEE] = HintText(CustomMessage("Greg", /*german*/"", /*french*/"Greg"), + // /*spanish*/Greg + { + CustomMessage("a Green Rupee", /*german*/"", /*french*/"un rubis vert") + // /*spanish*/una rupia verde + }, { + CustomMessage("an old friend", /*german*/"", /*french*/"Greg"), + // /*spanish*/Greg + CustomMessage("a glorious gem", /*german*/"", /*french*/"Greg")}); + // /*spanish*/Greg + + hintTextTable[RHT_BLUE_RUPEE] = HintText(CustomMessage("a Blue Rupee", /*german*/"", /*french*/"un rubis bleu"), + // /*spanish*/una rupia azul + { + CustomMessage("some rupees", /*german*/"", /*french*/"une quantité de rubis") + // /*spanish*/una cantidad de rupias + }, { + CustomMessage("a common coin", /*german*/"", /*french*/"quelques sous"), + // /*spanish*/una moneda usual + CustomMessage("a blue gem", /*german*/"", /*french*/"un joyau bleu")}); + // /*spanish*/una gema azul + + hintTextTable[RHT_RED_RUPEE] = HintText(CustomMessage("a Red Rupee", /*german*/"", /*french*/"un rubis rouge"), + // /*spanish*/una rupia roja + { + CustomMessage("some rupees", /*german*/"", /*french*/"une quantité de rubis") + // /*spanish*/una cantidad de rupias + }, { + CustomMessage("couch cash", /*german*/"", /*french*/"un peu de fric"), + // /*spanish*/una buena moneda + CustomMessage("a red gem", /*german*/"", /*french*/"un joyau rouge")}); + // /*spanish*/una gema roja + + hintTextTable[RHT_PURPLE_RUPEE] = HintText(CustomMessage("a Purple Rupee", /*german*/"", /*french*/"un rubis pourpre"), + // /*spanish*/una rupia morada + { + CustomMessage("some rupees", /*german*/"", /*french*/"une quantité de rubis") + // /*spanish*/una cantidad de rupias + }, { + CustomMessage("big bucks", /*german*/"", /*french*/"plein de fric"), + // /*spanish*/plata de calidad + CustomMessage("a purple gem", /*german*/"", /*french*/"un joyau mauve"), + // /*spanish*/una gema morada + CustomMessage("wealth", /*german*/"", /*french*/"la richesse")}); + // /*spanish*/una buena riqueza + + hintTextTable[RHT_HUGE_RUPEE] = HintText(CustomMessage("a Huge Rupee", /*german*/"", /*french*/"un énorme rubis"), + // /*spanish*/una rupia gigante + { + CustomMessage("some rupees", /*german*/"", /*french*/"une quantité de rubis") + // /*spanish*/una cantidad de rupias + }, { + CustomMessage("a juicy jackpot", /*german*/"", /*french*/"le jackpot"), + // /*spanish*/el premio gordo + CustomMessage("a yellow gem", /*german*/"", /*french*/"un joyau doré"), + // /*spanish*/una gema amarilla + CustomMessage("a giant gem", /*german*/"", /*french*/"un gros joyau"), + // /*spanish*/una gema descomunal + CustomMessage("great wealth", /*german*/"", /*french*/"l'aisance financière")}); + // /*spanish*/dinero a caudales + + hintTextTable[RHT_PIECE_OF_HEART] = HintText(CustomMessage("a Piece of Heart", /*german*/"", /*french*/"un Quart de Coeur"), + // /*spanish*/una pieza de corazón + { + CustomMessage("something heart-shaped", /*german*/"", /*french*/"une chose en forme de coeur") + // /*spanish*/algo con forma de corazón + }, { + CustomMessage("a little love", /*german*/"", /*french*/"un peu plus d'amour"), + // /*spanish*/un cuarto de amor + CustomMessage("a broken heart", /*german*/"", /*french*/"un coeur brisé")}); + // /*spanish*/un corazón roto + + hintTextTable[RHT_HEART_CONTAINER] = HintText(CustomMessage("a Heart Container", /*german*/"", /*french*/"un Réceptacle de Coeur"), + // /*spanish*/un contenedor de corazón + { + CustomMessage("something heart-shaped", /*german*/"", /*french*/"une chose en forme de coeur") + // /*spanish*/algo con forma de corazón + }, { + CustomMessage("a lot of love", /*german*/"", /*french*/"le grand amour"), + // /*spanish*/amor por doquier + CustomMessage("a Valentine's gift", /*german*/"", /*french*/"un cadeau de Saint-Valentin"), + // /*spanish*/un contenedor de afección + CustomMessage("a boss's organ", /*german*/"", /*french*/"un organe de monstre")}); + // /*spanish*/los órganos de un jefe + + hintTextTable[RHT_ICE_TRAP] = HintText(CustomMessage("an Ice Trap", /*german*/"", /*french*/"un Piège de Glace"), + // /*spanish*/una trampa de hielo + { + CustomMessage("a Great Fairy's power", /*german*/"", /*french*/"le pouvoir d'une grande fée"), + // /*spanish*/el poder de una Gran Hada + CustomMessage("a magic arrow", /*german*/"", /*french*/"une flèche magique"), + // /*spanish*/una flecha mágica + CustomMessage("a medallion", /*german*/"", /*french*/"un médaillon"), + // /*spanish*/un medallón + CustomMessage("a spiritual stone", /*german*/"", /*french*/"une Pierre Ancestrale"), + // /*spanish*/una piedra espiritual + CustomMessage("something that can stun", /*german*/"", /*french*/"une chose qui peut paralyser") + // /*spanish*/algo que pueda paralizar + }, { + CustomMessage("a gift from Ganon", /*german*/"", /*french*/"un cadeau de Ganon"), + // /*spanish*/un regalo de Ganon + CustomMessage("a chilling discovery", /*german*/"", /*french*/"une frissonante découverte"), + // /*spanish*/un escalofriante hallazgo + CustomMessage("frosty fun", /*german*/"", /*french*/"une engelure")}); + // /*spanish*/una gélida diversión + + hintTextTable[RHT_BOMBS_5] = HintText(CustomMessage("Bombs (5 pieces)", /*german*/"", /*french*/"une demi-dizaine de bombes"), + // /*spanish*/unas (5) bombas + { + CustomMessage("explosives", /*german*/"", /*french*/"un paquet d'explosifs") + // /*spanish*/un montón de explosivos + }, { + CustomMessage("a few explosives", /*german*/"", /*french*/"une poignée de pétards"), + // /*spanish*/un par de explosivos + CustomMessage("a few blast balls", /*german*/"", /*french*/"une poignée de boules bleues")}); + // /*spanish*/un par de estallidos + + hintTextTable[RHT_BOMBS_10] = HintText(CustomMessage("Bombs (10 pieces)", /*german*/"", /*french*/"une dizaine de bombes"), + // /*spanish*/unas (10) bombas + { + CustomMessage("explosives", /*german*/"", /*french*/"un paquet d'explosifs") + // /*spanish*/un montón de explosivos + }, { + CustomMessage("some explosives", /*german*/"", /*french*/"un paquet de pétards"), + // /*spanish*/unos cuantos explosivos + CustomMessage("some blast balls", /*german*/"", /*french*/"un paquet de boules bleues")}); + // /*spanish*/unos cuantos estallidos + + hintTextTable[RHT_BOMBS_20] = HintText(CustomMessage("Bombs (20 pieces)", /*german*/"", /*french*/"une vingtaine de bombes"), + // /*spanish*/unas (20) bombas + { + CustomMessage("explosives", /*german*/"", /*french*/"un paquet d'explosifs") + // /*spanish*/un montón de explosivos + }, { + CustomMessage("lots-o-explosives", /*german*/"", /*french*/"une abondance de pétards"), + // /*spanish*/un puñado de explosivos + CustomMessage("plenty of blast balls", /*german*/"", /*french*/"une abondance de boules bleues")}); + // /*spanish*/bastantes estallidos + + hintTextTable[RHT_BOMBCHU_5] = HintText(CustomMessage("Bombchus (5 pieces)", /*german*/"", /*french*/"une demi-dizaine de Missiles"), + // /*spanish*/unos (5) bombchus + { + CustomMessage("a prize of the House of Skulltulas", /*german*/"", /*french*/"un prix de la maison des Skulltulas"), + // /*spanish*/un obsequio de la Casa Skulltula + CustomMessage("explosives", /*german*/"", /*french*/"un paquet d'explosifs") + // /*spanish*/un montón de explosivos + }, { + CustomMessage("a few mice bombs", /*german*/"", /*french*/"une poignée de mignons explosifs"), + // /*spanish*/un par de bombas roedoras + CustomMessage("a few proximity mice", /*german*/"", /*french*/"une poignée de jouets à remonter"), + // /*spanish*/un par de explosivos ratoncitos + CustomMessage("a few wall crawlers", /*german*/"", /*french*/"une poignée de rapides grimpeurs"), + // /*spanish*/un par de trepaparedes + CustomMessage("a few trail blazers", /*german*/"", /*french*/"une poignée de zigzags éclatants")}); + // /*spanish*/un par de ratas propulsadas + + hintTextTable[RHT_BOMBCHU_10] = HintText(CustomMessage("Bombchus (10 pieces)", /*german*/"", /*french*/"une dizaine de Missiles"), + // /*spanish*/unos (10) bombchus + { + CustomMessage("a prize of the House of Skulltulas", /*german*/"", /*french*/"un prix de la maison des Skulltulas"), + // /*spanish*/un obsequio de la Casa Skulltula + CustomMessage("explosives", /*german*/"", /*french*/"un paquet d'explosifs") + // /*spanish*/un montón de explosivos + }, { + CustomMessage("some mice bombs", /*german*/"", /*french*/"un paquet de mignons explosifs"), + // /*spanish*/unas cuantas bombas roedoras + CustomMessage("some proximity mice", /*german*/"", /*french*/"un paquet de jouets à remonter"), + // /*spanish*/unos cuantos explosivos ratoncitos + CustomMessage("some wall crawlers", /*german*/"", /*french*/"un paquet de rapides grimpeurs"), + // /*spanish*/unos cuantos trepaparedes + CustomMessage("some trail blazers", /*german*/"", /*french*/"un paquet de zigzags éclatants")}); + // /*spanish*/unas cuantas ratas propulsadas + + hintTextTable[RHT_BOMBCHU_20] = HintText(CustomMessage("Bombchus (20 pieces)", /*german*/"", /*french*/"une vingtaine de Missiles"), + // /*spanish*/unos (20) bombchus + { + CustomMessage("a prize of the House of Skulltulas", /*german*/"", /*french*/"un prix de la maison des Skulltulas"), + // /*spanish*/un obsequio de la Casa Skulltula + CustomMessage("explosives", /*german*/"", /*french*/"un paquet d'explosifs") + // /*spanish*/un montón de explosivos + }, { + CustomMessage("plenty of mice bombs", /*german*/"", /*french*/"une abondance de mignons explosifs"), + // /*spanish*/bastantes bombas roedoras + CustomMessage("plenty of proximity mice", /*german*/"", /*french*/"une abondance de jouets à remonter"), + // /*spanish*/bastantes explosivos ratoncitos + CustomMessage("plenty of wall crawlers", /*german*/"", /*french*/"une abondance de rapides grimpeurs"), + // /*spanish*/bastantes trepaparedes + CustomMessage("plenty of trail blazers", /*german*/"", /*french*/"une abondance de zigzags éclatants")}); + // /*spanish*/bastantes ratas propulsadas + + hintTextTable[RHT_ARROWS_5] = HintText(CustomMessage("Arrows (5 pieces)", /*german*/"", /*french*/"une demi-dizaine de flèches"), + // /*spanish*/unas (5) flechas + { + CustomMessage("a projectile", /*german*/"", /*french*/"un projectile") + // /*spanish*/un proyectil + }, { + CustomMessage("a few danger darts", /*german*/"", /*french*/"une poignée d'obus"), + // /*spanish*/un par de peligrosos dardos + CustomMessage("a few sharp shafts", /*german*/"", /*french*/"une poignée de piquets")}); + // /*spanish*/un par de puntas afiladas + + hintTextTable[RHT_ARROWS_10] = HintText(CustomMessage("Arrows (10 pieces)", /*german*/"", /*french*/"une dizaine de flèches"), + // /*spanish*/unas (10) flechas + { + CustomMessage("a projectile", /*german*/"", /*french*/"un projectile") + // /*spanish*/un proyectil + }, { + CustomMessage("some danger darts", /*german*/"", /*french*/"un paquet d'obus"), + // /*spanish*/unos cuantos peligrosos dardos + CustomMessage("some sharp shafts", /*german*/"", /*french*/"un paquet de piquets")}); + // /*spanish*/unas cuantas puntas afiladas + + hintTextTable[RHT_ARROWS_30] = HintText(CustomMessage("Arrows (30 pieces)", /*german*/"", /*french*/"une trentaine de flèches"), + // /*spanish*/unas (30) flechas + { + CustomMessage("a projectile", /*german*/"", /*french*/"un projectile") + // /*spanish*/un proyectil + }, { + CustomMessage("plenty of danger darts", /*german*/"", /*french*/"une abondance d'obus"), + // /*spanish*/bastantes peligrosos dardos + CustomMessage("plenty of sharp shafts", /*german*/"", /*french*/"une abondance de piquets")}); + // /*spanish*/bastantes puntas afiladas + + hintTextTable[RHT_DEKU_NUTS_5] = HintText(CustomMessage("Deku Nuts (5 pieces)", /*german*/"", /*french*/"une demi-dizaine de noix Mojo"), + // /*spanish*/unas (5) nueces deku + { + CustomMessage("some Deku munitions", /*german*/"", /*french*/"un paquet de munitions Mojo"), + // /*spanish*/un montón de municiones Deku + CustomMessage("something that can stun", /*german*/"", /*french*/"une chose qui peut paralyser") + // /*spanish*/algo que pueda paralizar + }, { + CustomMessage("some nuts", /*german*/"", /*french*/"une poignée de noisettes"), + // /*spanish*/un par de nueces + CustomMessage("some flashbangs", /*german*/"", /*french*/"une poignée d'éclats"), + // /*spanish*/un par de semillas aturdidoras + CustomMessage("some scrub spit", /*german*/"", /*french*/"une poignée de crachats Mojo")}); + // /*spanish*/un par de escupitajos deku + + hintTextTable[RHT_DEKU_NUTS_10] = HintText(CustomMessage("Deku Nuts (10 pieces)", /*german*/"", /*french*/"une dizaine de noix Mojo"), + // /*spanish*/unas (10) nueces deku + { + CustomMessage("some Deku munitions", /*german*/"", /*french*/"un paquet de munitions Mojo"), + // /*spanish*/un montón de municiones Deku + CustomMessage("something that can stun", /*german*/"", /*french*/"une chose qui peut paralyser") + // /*spanish*/algo que pueda paralizar + }, { + CustomMessage("lots-o-nuts", /*german*/"", /*french*/"un paquet de noisettes"), + // /*spanish*/un puñado de nueces + CustomMessage("plenty of flashbangs", /*german*/"", /*french*/"un paquet d'éclats"), + // /*spanish*/unas cuantas semillas aturdidoras + CustomMessage("plenty of scrub spit", /*german*/"", /*french*/"un paquet de crachats Mojo")}); + // /*spanish*/unos cuantos escupitajos deku + + hintTextTable[RHT_DEKU_SEEDS_30] = HintText(CustomMessage("Deku Seeds (30 pieces)", /*german*/"", /*french*/"une trentaine de graines Mojo"), + // /*spanish*/unas (30) semillas deku + { + CustomMessage("a projectile", /*german*/"", /*french*/"un projectile"), + // /*spanish*/un proyectil + CustomMessage("some Deku munitions", /*german*/"", /*french*/"un paquet de munitions Mojo") + // /*spanish*/un montón de municiones Deku + }, { + CustomMessage("catapult ammo", /*german*/"", /*french*/"un paquet de délicieuses munitions"), + // /*spanish*/un par de munición infantil + CustomMessage("lots-o-seeds", /*german*/"", /*french*/"un paquet de germes séchés")}); + // /*spanish*/un puñado de semillas + + hintTextTable[RHT_DEKU_STICK_1] = HintText(CustomMessage("a Deku Stick", /*german*/"", /*french*/"un bâton Mojo"), + // /*spanish*/un palo deku + { + CustomMessage("some Deku munitions", /*german*/"", /*french*/"un paquet de munitions Mojo") + // /*spanish*/un montón de municiones Deku + }, { + CustomMessage("a breakable branch", /*german*/"", /*french*/"un bout de bois")}); + // /*spanish*/un pequeño báculo + + hintTextTable[RHT_TREASURE_GAME_HEART] = HintText(CustomMessage("a Piece of Heart", /*german*/"", /*french*/"un Quart de Coeur"), + // /*spanish*/el amor de la victoria + { + CustomMessage("something heart-shaped", /*german*/"", /*french*/"une chose en forme de coeur") + // /*spanish*/algo con forma de corazón + }, { + CustomMessage("a victory valentine", /*german*/"", /*french*/"un amour gagnant")}); + // /*spanish*/el amor victorioso + + hintTextTable[RHT_TREASURE_GAME_GREEN_RUPEE] = HintText(CustomMessage("a Green Rupee", /*german*/"", /*french*/"un rubis vert"), + // /*spanish*/una rupia verde + { + CustomMessage("some rupees", /*german*/"", /*french*/"une quantité de rubis") + // /*spanish*/una cantidad de rupias + }, { + CustomMessage("the dollar of defeat", /*german*/"", /*french*/"le rubis de la défaite")}); + // /*spanish*/el peso de la derrota + + hintTextTable[RHT_TRIFORCE_PIECE] = HintText(CustomMessage("a Piece of the Triforce", /*german*/"", /*french*/"un fragment de la Triforce"), + // /*spanish*/un fragmento de la Trifuerza + {}, { + CustomMessage("a triumph fork", /*german*/"", /*french*/"la Tribosse"), + // /*spanish*/un trígono del triunfo + CustomMessage("cheese", /*german*/"", /*french*/"du fromage"), + // /*spanish*/un porción de queso + CustomMessage("a gold fragment", /*german*/"", /*french*/"un fragment d'or")}); + // /*spanish*/un fragmento dorado + + hintTextTable[RHT_GOHMA_SOUL] = HintText(CustomMessage("the soul of Gohma", /*german*/"", /*french*/""), + { + CustomMessage("something webbed", /*german*/"", /*french*/"") + }, { + CustomMessage("an invasive soul", /*german*/"", /*french*/""), + CustomMessage("some spider essence", /*german*/"", /*french*/"")}); + + hintTextTable[RHT_KING_DODONGO_SOUL] = HintText(CustomMessage("the soul of King Dodongo", /*german*/"", /*french*/""), + { + CustomMessage("something explosive", /*german*/"", /*french*/"") + }, { + CustomMessage("a royal soul", /*german*/"", /*french*/""), + CustomMessage("some reptile essence", /*german*/"", /*french*/"")}); + + hintTextTable[RHT_BARINADE_SOUL] = HintText(CustomMessage("the soul of Barinade", /*german*/"", /*french*/""), + { + CustomMessage("something fishy", /*german*/"", /*french*/"") + }, { + CustomMessage("an infectuous soul", /*german*/"", /*french*/""), + CustomMessage("some parasitic essence", /*german*/"", /*french*/"")}); + + hintTextTable[RHT_PHANTOM_GANON_SOUL] = HintText(CustomMessage("the soul of Phantom Ganon", /*german*/"", /*french*/""), + { + CustomMessage("something spectral", /*german*/"", /*french*/"") + }, { + CustomMessage("a duplicate soul", /*german*/"", /*french*/""), + + CustomMessage("some illusionary essence", /*german*/"", /*french*/"")}); + + hintTextTable[RHT_VOLVAGIA_SOUL] = HintText(CustomMessage("the soul of Volvagia", /*german*/"", /*french*/""), + { + CustomMessage("something hot", /*german*/"", /*french*/"") + }, { + CustomMessage("a draconic soul", /*german*/"", /*french*/""), + CustomMessage("some magmatic essence", /*german*/"", /*french*/"")}); + + hintTextTable[RHT_MORPHA_SOUL] = HintText(CustomMessage("the soul of Barinade", /*german*/"", /*french*/""), + { + CustomMessage("something wet", /*german*/"", /*french*/"") + }, { + CustomMessage("an aquatic soul", /*german*/"", /*french*/""), + CustomMessage("some liquid essence", /*german*/"", /*french*/"")}); + + hintTextTable[RHT_BONGO_BONGO_SOUL] = HintText(CustomMessage("the soul of Bongo Bongo", /*german*/"", /*french*/""), + { + CustomMessage("something dark", /*german*/"", /*french*/"") + }, { + CustomMessage("a shadowy soul", /*german*/"", /*french*/""), + CustomMessage("some handy essence", /*german*/"", /*french*/"")}); + + hintTextTable[RHT_TWINROVA_SOUL] = HintText(CustomMessage("the soul of Twinrova", /*german*/"", /*french*/""), + { + CustomMessage("something spiritual", /*german*/"", /*french*/"") + }, { + CustomMessage("old souls", /*german*/"", /*french*/""), + CustomMessage("twin essences", /*german*/"", /*french*/"")}); + + hintTextTable[RHT_GANON_SOUL] = HintText(CustomMessage("the soul of Ganon", /*german*/"", /*french*/""), + { + CustomMessage("something strong", /*german*/"", /*french*/"") + }, { + CustomMessage("an evil soul", /*german*/"", /*french*/""), + CustomMessage("some powerful essence", /*german*/"", /*french*/"")}); + + hintTextTable[RHT_OCARINA_A_BUTTON] = HintText(CustomMessage("an Ocarina A Button", /*german*/"", /*french*/"la Touche A de l'Ocarina"), + // /*spanish*/un botón A de Ocarina + { + CustomMessage("something melodic", /*german*/"", /*french*/"quelque chose de mélodieux") + // /*spanish*/algo melódico + }, { + CustomMessage("a musical letter", /*german*/"", /*french*/"une lettre musicale")}); + // /*spanish*/una letra musical + + hintTextTable[RHT_OCARINA_C_UP_BUTTON] = HintText(CustomMessage("an Ocarina C Up Button", /*german*/"", /*french*/"la Touche C-Haut de l'Ocarina"), + // /*spanish*/un botón C superior de Ocarina + { + CustomMessage("something melodic", /*german*/"", /*french*/"quelque chose de mélodieux") + // /*spanish*/algo melódico + }, { + CustomMessage("a high tone", /*german*/"", /*french*/"une tonalité élevée")}); + // /*spanish*/un tono alto + + hintTextTable[RHT_OCARINA_C_DOWN_BUTTON] = HintText(CustomMessage("an Ocarina C Down Button", /*german*/"", /*french*/"la Touche C-Bas de l'Ocarina"), + // /*spanish*/un botón C inferior de Ocarina + { + CustomMessage("something melodic", /*german*/"", /*french*/"quelque chose de mélodieux") + // /*spanish*/algo melódico + }, { + CustomMessage("a low tone", /*german*/"", /*french*/"une tonalité basse")}); + // /*spanish*/un tono bajo + + hintTextTable[RHT_OCARINA_C_LEFT_BUTTON] = HintText(CustomMessage("an Ocarina C Left Button", /*german*/"", /*french*/"la Touche C-Gauche de l'Ocarina"), + // /*spanish*/un botón C izquierdo de Ocarina + { + CustomMessage("something melodic", /*german*/"", /*french*/"quelque chose de mélodieux") + // /*spanish*/algo melódico + }, { + CustomMessage("a leftward tone", /*german*/"", /*french*/"une tonalité vers la gauche")}); + // /*spanish*/un tono hacia la izquierda + + hintTextTable[RHT_OCARINA_C_RIGHT_BUTTON] = HintText(CustomMessage("an Ocarina C Right Button", /*german*/"", /*french*/"la Touche C-Droit de l'Ocarina"), + // /*spanish*/un botón C derecho de Ocarina + { + CustomMessage("something melodic", /*german*/"", /*french*/"quelque chose de mélodieux") + // /*spanish*/algo melódico + }, { + CustomMessage("a rightward tone", /*german*/"", /*french*/"une tonalité vers la droite")}); + // /*spanish*/un tono hacia la derecha + + hintTextTable[RHT_FISHING_POLE] = HintText(CustomMessage("a fishing pole", /*german*/"", /*french*/"canne à pêche"), + // /*spanish*/caña de pescar + { + CustomMessage("the pond owner's property", /*german*/"", /*french*/"(canne à pêche)") + // /*spanish*/(caña de pescar) + }, { + CustomMessage("a fish-puller", /*german*/"", /*french*/"(canne à pêche)")}); + // /*spanish*/(caña de pescar) + + hintTextTable[RHT_EPONA] = HintText(CustomMessage("Epona", /*german*/"", /*french*/"Epona"), + // /*spanish*/a Epona + { + CustomMessage("something from Malon", /*german*/"", /*french*/"un cadeau de Malon"), + // /*spanish*/un obsequio de Malon + CustomMessage("a song sung by frogs", /*german*/"", /*french*/"une chanson aimée des grenouilles"), + // /*spanish*/una melodía de ranas + CustomMessage("something to cross a broken bridge", /*german*/"", /*french*/"une chose pour traverser un pont brisé") + // /*spanish*/algo para cruzar un puente roto + }, { + CustomMessage("a horse", /*german*/"", /*french*/"un fidèle destrier"), + // /*spanish*/una yegua + CustomMessage("a four legged friend", /*german*/"", /*french*/"un puissant animal")}); + // /*spanish*/una amiga cuadrúpeda + + //What is this used for? + hintTextTable[RHT_HINT_MYSTERIOUS] = HintText(CustomMessage("something mysterious", /*german*/"etwas Unvorhergesehenes", /*french*/"un sacré mystère")); + // /*spanish*/algo misterioso + + hintTextTable[RHT_MYSTERIOUS_ITEM] = HintText(CustomMessage("mysterious item", /*german*/"mysteriösen Gegenstand", /*french*/"objet mystérieux")); + // /*spanish*/algo misterioso + } +} \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/3drando/hints.cpp b/soh/soh/Enhancements/randomizer/3drando/hints.cpp index e007c06af..1c1edd62d 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hints.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hints.cpp @@ -4,38 +4,87 @@ #include "random.hpp" #include "spoiler_log.hpp" #include "fill.hpp" -#include "hint_list.hpp" #include "../trial.h" #include "../entrance.h" #include "z64item.h" #include #include "../randomizerTypes.h" -#include "../context.h" #include "pool_functions.hpp" +#include "../hint.h" +#include "../static_data.h" -#define QM_WHITE "%w" -#define QM_RED "%r" -#define QM_GREEN "%g" -#define QM_BLUE "%b" -#define QM_LBLUE "%c" -#define QM_PINK "%p" -#define QM_YELLOW "%y" -#define QM_BLACK "%B" using namespace Rando; -const Text& HintText::GetText() const { - auto ctx = Rando::Context::GetInstance(); +HintDistributionSetting::HintDistributionSetting(std::string _name, + HintType _type, + uint32_t _weight, + uint8_t _fixed, + uint8_t _copies, + std::function _filter, + uint8_t _dungeonLimit){ + name = _name; + type = _type; + weight = _weight; + fixed = _fixed; + copies = _copies; + filter = _filter; + dungeonLimit = _dungeonLimit; + } + +HintText::HintText(CustomMessage clearText_, std::vector ambiguousText_, std::vector obscureText_) +: clearText(std::move(clearText_)), ambiguousText(std::move(ambiguousText_)), obscureText(std::move(obscureText_)){} + +const CustomMessage& HintText::GetClear() const { + return clearText; +} + +const CustomMessage& HintText::GetObscure() const { + return obscureText.size() > 0 ? RandomElement(obscureText) : clearText; +} + +const CustomMessage& HintText::GetObscure(uint8_t selection) const { + if (obscureText.size() > selection){ + return obscureText[selection]; + } else if (obscureText.size() > 0) { + return obscureText[0]; + } + return clearText; +} + +const CustomMessage& HintText::GetAmbiguous() const { + return ambiguousText.size() > 0 ? RandomElement(ambiguousText) : clearText; +} + +const CustomMessage& HintText::GetAmbiguous(uint8_t selection) const { + if (ambiguousText.size() > selection){ + return ambiguousText[selection]; + } else if (ambiguousText.size() > 0) { + return ambiguousText[0]; + } + return clearText; +} + +uint8_t HintText::GetAmbiguousSize() const{ + return ambiguousText.size(); +} + +uint8_t HintText::GetObscureSize() const{ + return obscureText.size(); +} + +const CustomMessage& HintText::GetHintMessage(uint8_t selection) const { + auto ctx = Rando::Context::GetInstance(); if (ctx->GetOption(RSK_HINT_CLARITY).Is(RO_HINT_CLARITY_OBSCURE)) { - return GetObscure(); + return GetObscure(selection); } else if (ctx->GetOption(RSK_HINT_CLARITY).Is(RO_HINT_CLARITY_AMBIGUOUS)) { - return GetAmbiguous(); + return GetAmbiguous(selection); } else { return GetClear(); } } -const Text HintText::GetTextCopy() const { +const CustomMessage HintText::GetMessageCopy() const { auto ctx = Rando::Context::GetInstance(); if (ctx->GetOption(RSK_HINT_CLARITY).Is(RO_HINT_CLARITY_OBSCURE)) { return GetObscure(); @@ -46,33 +95,34 @@ const Text HintText::GetTextCopy() const { } } -std::array hintTypeNames = { - "Static", - "Trial", - "WotH", - "Barren", - "Entrance", - "Item Area", - "Item Location", - "Junk" -}; +bool HintText::operator==(const HintText& right) const { + return obscureText == right.obscureText && + ambiguousText == right.ambiguousText && + clearText == right.clearText; +} + +bool HintText::operator!=(const HintText& right) const { + return !operator==(right); +} + +StaticHintInfo::StaticHintInfo(HintType _type, std::vector _hintKeys, RandomizerSettingKey _setting, + std::variant _condition, std::vector _targetChecks, + std::vector _targetItems, std::vector _hintChecks, bool _yourPocket, int _num): + type(_type), hintKeys(_hintKeys), setting(_setting), condition(_condition), targetChecks(_targetChecks), + targetItems(_targetItems), hintChecks(_hintChecks), yourPocket(_yourPocket), num(_num){} + +RandomizerHintTextKey GetRandomJunkHint(){ + //temp code to handle random junk hints now I work in keys instead of a vector of HintText + // Will be replaced with a better system once more customisable hint pools are added + uint32_t range = RHT_JUNK_SG_8 - RHT_JUNK02; + return (RandomizerHintTextKey)(Random(0, range) + RHT_JUNK02); +} + +RandomizerHintTextKey GetRandomGanonJoke(){ + uint32_t range = RHT_GANON_JOKE11 - RHT_GANON_JOKE01; + return (RandomizerHintTextKey)(Random(0, range) + RHT_GANON_JOKE01); +} -std::array, 14> staticHintLocations = {{ - {RC_KAK_10_GOLD_SKULLTULA_REWARD, RSK_KAK_10_SKULLS_HINT}, - {RC_KAK_20_GOLD_SKULLTULA_REWARD, RSK_KAK_20_SKULLS_HINT}, - {RC_KAK_30_GOLD_SKULLTULA_REWARD, RSK_KAK_30_SKULLS_HINT}, - {RC_KAK_40_GOLD_SKULLTULA_REWARD, RSK_KAK_40_SKULLS_HINT}, - {RC_KAK_50_GOLD_SKULLTULA_REWARD, RSK_KAK_50_SKULLS_HINT}, - {RC_KAK_100_GOLD_SKULLTULA_REWARD, RSK_KAK_100_SKULLS_HINT}, - {RC_SONG_FROM_IMPA, RSK_SKIP_CHILD_ZELDA}, - {RC_ZR_FROGS_OCARINA_GAME, RSK_FROGS_HINT}, - {RC_DMT_TRADE_CLAIM_CHECK, RSK_BIGGORON_HINT}, - {RC_MARKET_10_BIG_POES, RSK_BIG_POES_HINT}, - {RC_KAK_ANJU_AS_CHILD, RSK_CHICKENS_HINT}, - {RC_KF_LINKS_HOUSE_COW, RSK_MALON_HINT}, - {RC_GF_HBA_1000_POINTS, RSK_HBA_HINT}, - {RC_GF_HBA_1500_POINTS, RSK_HBA_HINT}, - }}; bool FilterWotHLocations(RandomizerCheck loc){ auto ctx = Rando::Context::GetInstance(); @@ -125,14 +175,14 @@ const std::array hintSettingTable{{ .trialCopies = 1, .junkWeight = 6, .distTable = { - {"WotH", HINT_TYPE_WOTH, 7, 0, 1, FilterWotHLocations, 2}, - {"Barren", HINT_TYPE_BARREN, 4, 0, 1, FilterBarrenLocations, 1}, + {"WotH", HINT_TYPE_WOTH, 7, 0, 1, FilterWotHLocations, 2}, + {"Barren", HINT_TYPE_FOOLISH, 4, 0, 1, FilterBarrenLocations, 1}, //("Entrance", HINT_TYPE_ENTRANCE, 6, 0, 1), //not yet implemented - {"Song", HINT_TYPE_ITEM_LOCATION, 2, 0, 1, FilterSongLocations}, - {"Overworld", HINT_TYPE_ITEM_LOCATION, 4, 0, 1, FilterOverworldLocations}, - {"Dungeon", HINT_TYPE_ITEM_LOCATION, 3, 0, 1, FilterDungeonLocations}, - {"Named Item", HINT_TYPE_ITEM_AREA, 10, 0, 1, FilterGoodItems}, - {"Random" , HINT_TYPE_ITEM_AREA, 12, 0, 1, NoFilter} + {"Song", HINT_TYPE_ITEM, 2, 0, 1, FilterSongLocations}, + {"Overworld", HINT_TYPE_ITEM, 4, 0, 1, FilterOverworldLocations}, + {"Dungeon", HINT_TYPE_ITEM, 3, 0, 1, FilterDungeonLocations}, + {"Named Item", HINT_TYPE_ITEM_AREA, 10, 0, 1, FilterGoodItems}, + {"Random" , HINT_TYPE_ITEM_AREA, 12, 0, 1, NoFilter} } }, // Strong hints @@ -141,14 +191,14 @@ const std::array hintSettingTable{{ .trialCopies = 1, .junkWeight = 0, .distTable = { - {"WotH", HINT_TYPE_WOTH, 12, 0, 2, FilterWotHLocations, 2}, - {"Barren", HINT_TYPE_BARREN, 12, 0, 1, FilterBarrenLocations, 1}, + {"WotH", HINT_TYPE_WOTH, 12, 0, 2, FilterWotHLocations, 2}, + {"Barren", HINT_TYPE_FOOLISH, 12, 0, 1, FilterBarrenLocations, 1}, //{"Entrance", HINT_TYPE_ENTRANCE, 4, 0, 1}, //not yet implemented - {"Song", HINT_TYPE_ITEM_LOCATION, 4, 0, 1, FilterSongLocations}, - {"Overworld", HINT_TYPE_ITEM_LOCATION, 6, 0, 1, FilterOverworldLocations}, - {"Dungeon", HINT_TYPE_ITEM_LOCATION, 6, 0, 1, FilterDungeonLocations}, - {"Named Item", HINT_TYPE_ITEM_AREA, 8, 0, 1, FilterGoodItems}, - {"Random" , HINT_TYPE_ITEM_AREA, 8, 0, 1, NoFilter}, + {"Song", HINT_TYPE_ITEM, 4, 0, 1, FilterSongLocations}, + {"Overworld", HINT_TYPE_ITEM, 6, 0, 1, FilterOverworldLocations}, + {"Dungeon", HINT_TYPE_ITEM, 6, 0, 1, FilterDungeonLocations}, + {"Named Item", HINT_TYPE_ITEM_AREA, 8, 0, 1, FilterGoodItems}, + {"Random" , HINT_TYPE_ITEM_AREA, 8, 0, 1, NoFilter}, }, }, // Very strong hints @@ -157,169 +207,111 @@ const std::array hintSettingTable{{ .trialCopies = 1, .junkWeight = 0, .distTable = { - {"WotH", HINT_TYPE_WOTH, 15, 0, 2, FilterWotHLocations}, - {"Barren", HINT_TYPE_BARREN, 15, 0, 1, FilterBarrenLocations}, + {"WotH", HINT_TYPE_WOTH, 15, 0, 2, FilterWotHLocations}, + {"Barren", HINT_TYPE_FOOLISH, 15, 0, 1, FilterBarrenLocations}, //{"Entrance", HINT_TYPE_ENTRANCE, 10, 0, 1}, //not yet implemented - {"Song", HINT_TYPE_ITEM_LOCATION, 2, 0, 1, FilterSongLocations}, - {"Overworld", HINT_TYPE_ITEM_LOCATION, 7, 0, 1, FilterOverworldLocations}, - {"Dungeon", HINT_TYPE_ITEM_LOCATION, 7, 0, 1, FilterDungeonLocations}, - {"Named Item", HINT_TYPE_ITEM_AREA, 5, 0, 1, FilterGoodItems}, + {"Song", HINT_TYPE_ITEM, 2, 0, 1, FilterSongLocations}, + {"Overworld", HINT_TYPE_ITEM, 7, 0, 1, FilterOverworldLocations}, + {"Dungeon", HINT_TYPE_ITEM, 7, 0, 1, FilterDungeonLocations}, + {"Named Item", HINT_TYPE_ITEM_AREA, 5, 0, 1, FilterGoodItems}, }, }, }}; -static std::map pixelWidthTable = { - { " ", 6 }, { "!", 6 }, { "\"", 5 }, { "#", 7 }, { "$", 7 }, { "%", 11 }, { "&", 9 }, { "\'", 3 }, - { "(", 6 }, { ")", 6 }, { "*", 6 }, { "+", 7 }, { ",", 3 }, { "-", 5 }, { ".", 3 }, { "/", 7 }, - { "0", 8 }, { "1", 4 }, { "2", 7 }, { "3", 7 }, { "4", 8 }, { "5", 7 }, { "6", 7 }, { "7", 7 }, - { "8", 7 }, { "9", 7 }, { ":", 5 }, { ";", 5 }, { "<", 7 }, { "=", 9 }, { ">", 7 }, { "?", 9 }, - { "@", 10 }, { "A", 9 }, { "B", 7 }, { "C", 9 }, { "D", 9 }, { "E", 6 }, { "F", 6 }, { "G", 9 }, - { "H", 8 }, { "I", 3 }, { "J", 6 }, { "K", 8 }, { "L", 6 }, { "M", 10 }, { "N", 9 }, { "O", 10 }, - { "P", 7 }, { "Q", 10 }, { "R", 8 }, { "S", 8 }, { "T", 7 }, { "U", 8 }, { "V", 9 }, { "W", 12 }, - { "X", 9 }, { "Y", 8 }, { "Z", 8 }, { "[", 6 }, { "\\", 8 }, { "]", 6 }, { "^", 8 }, { "_", 7 }, - { "`", 4 }, { "a", 6 }, { "b", 7 }, { "c", 6 }, { "d", 7 }, { "e", 7 }, { "f", 5 }, { "g", 7 }, - { "h", 6 }, { "i", 3 }, { "j", 5 }, { "k", 6 }, { "l", 3 }, { "m", 9 }, { "n", 7 }, { "o", 7 }, - { "p", 7 }, { "q", 7 }, { "r", 6 }, { "s", 6 }, { "t", 6 }, { "u", 6 }, { "v", 7 }, { "w", 9 }, - { "x", 6 }, { "y", 7 }, { "z", 6 }, { "{", 6 }, { "¦", 4 }, { "}", 6 }, { "¡", 5 }, { "¢", 7 }, - { "£", 8 }, { "¤", 7 }, { "¥", 8 }, { "|", 4 }, { "§", 12 }, { "¨", 12 }, { "©", 10 }, { "ª", 5 }, - { "«", 8 }, { "¬", 7 }, { "\u00AD", 6 }, { "®", 10 }, { "¯", 8 }, { "°", 12 }, { "±", 12 }, { "²", 5 }, - { "³", 5 }, { "µ", 6 }, { "¶", 8 }, { "·", 4 }, { "¹", 4 }, { "º", 5 }, { "»", 9 }, { "¼", 9 }, - { "½", 9 }, { "¾", 10 }, { "¿", 7 }, { "À", 11 }, { "Á", 9 }, { "Â", 9 }, { "Ã", 9 }, { "Ä", 9 }, - { "Å", 9 }, { "Æ", 12 }, { "Ç", 9 }, { "È", 6 }, { "É", 6 }, { "Ê", 6 }, { "Ë", 6 }, { "Ì", 5 }, - { "Í", 5 }, { "Î", 5 }, { "Ï", 5 }, { "Ð", 10 }, { "Ñ", 9 }, { "Ò", 10 }, { "Ó", 10 }, { "Ô", 10 }, - { "Õ", 10 }, { "Ö", 10 }, { "×", 9 }, { "Ø", 10 }, { "Ù", 8 }, { "Ú", 8 }, { "Û", 8 }, { "Ü", 8 }, - { "Ý", 10 }, { "Þ", 8 }, { "ß", 7 }, { "à", 6 }, { "á", 6 }, { "â", 6 }, { "ã", 6 }, { "ä", 6 }, - { "å", 6 }, { "æ", 11 }, { "ç", 6 }, { "è", 7 }, { "é", 7 }, { "ê", 7 }, { "ë", 7 }, { "ì", 5 }, - { "í", 5 }, { "î", 5 }, { "ï", 5 }, { "ð", 7 }, { "ñ", 7 }, { "ò", 7 }, { "ó", 7 }, { "ô", 7 }, - { "õ", 7 }, { "ö", 7 }, { "÷", 11 }, { "ø", 9 }, { "ù", 7 }, { "ú", 7 }, { "û", 7 }, { "ü", 7 }, - { "ý", 8 }, { "þ", 8 }, { "ÿ", 8 }, { "Œ", 11 }, { "œ", 11 }, { "„", 5 }, { "”", 5 }, { "€", 10 }, - { "Ÿ", 10 }, { "~", 8 } +uint8_t StonesRequiredBySettings() { + auto ctx = Rando::Context::GetInstance(); + uint8_t stones = 0; + if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_STONES)) { + stones = ctx->GetOption(RSK_RAINBOW_BRIDGE_STONE_COUNT).Value(); + } else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_DUNGEON_REWARDS)) { + stones = ctx->GetOption(RSK_RAINBOW_BRIDGE_REWARD_COUNT).Value() - 6; + } else if ((ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_DUNGEONS)) && (ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_END_OF_DUNGEON))) { + stones = ctx->GetOption(RSK_RAINBOW_BRIDGE_DUNGEON_COUNT).Value() - 6; + } + if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_STONES)) { + stones = std::max({ stones, ctx->GetOption(RSK_LACS_STONE_COUNT).Value() }); + } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_STONES)) { + stones = std::max({ stones, (uint8_t)(ctx->GetOption(RSK_LACS_REWARD_COUNT).Value() - 6 )}); + } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_DUNGEONS)) { + stones = std::max({ stones, (uint8_t)(ctx->GetOption(RSK_LACS_DUNGEON_COUNT).Value() - 6 )}); + } + return stones; +} + +uint8_t MedallionsRequiredBySettings() { + auto ctx = Rando::Context::GetInstance(); + uint8_t medallions = 0; + if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_MEDALLIONS)) { + medallions = ctx->GetOption(RSK_RAINBOW_BRIDGE_MEDALLION_COUNT).Value(); + } else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_DUNGEON_REWARDS)) { + medallions = ctx->GetOption(RSK_RAINBOW_BRIDGE_REWARD_COUNT).Value() - 3; + } else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_DUNGEONS) && ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_END_OF_DUNGEON)) { + medallions = ctx->GetOption(RSK_RAINBOW_BRIDGE_DUNGEON_COUNT).Value() - 3; + } + if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_MEDALLIONS)) { + medallions = std::max({ medallions, ctx->GetOption(RSK_LACS_MEDALLION_COUNT).Value() }); + } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_REWARDS)) { + medallions = std::max({ medallions, (uint8_t)(ctx->GetOption(RSK_LACS_REWARD_COUNT).Value() - 3 )}); + } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_DUNGEONS) && ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_END_OF_DUNGEON)) { + medallions = std::max({ medallions, (uint8_t)(ctx->GetOption(RSK_LACS_DUNGEON_COUNT).Value() - 3 )}); + } + return medallions; +} + +uint8_t TokensRequiredBySettings() { + auto ctx = Rando::Context::GetInstance(); + uint8_t tokens = 0; + if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_TOKENS)) { + tokens = ctx->GetOption(RSK_RAINBOW_BRIDGE_TOKEN_COUNT).Value(); + } + if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_TOKENS)) { + tokens = std::max({ tokens, ctx->GetOption(RSK_LACS_TOKEN_COUNT).Value() }); + } + return tokens; +} + +std::vector>> conditionalAlwaysHints = { + std::make_pair(RC_MARKET_10_BIG_POES, []() { + auto ctx = Rando::Context::GetInstance(); + return ctx->GetOption(RSK_BIG_POE_COUNT).Value() >= 3 && !ctx->GetOption(RSK_BIG_POES_HINT); + }), // Remember, the option's value being 3 means 4 are required + std::make_pair(RC_DEKU_THEATER_MASK_OF_TRUTH, []() { + auto ctx = Rando::Context::GetInstance(); + return !ctx->GetOption(RSK_COMPLETE_MASK_QUEST); + }), + std::make_pair(RC_SONG_FROM_OCARINA_OF_TIME, []() { return StonesRequiredBySettings() < 2; }), + std::make_pair(RC_HF_OCARINA_OF_TIME_ITEM, []() { return StonesRequiredBySettings() < 2; }), + std::make_pair(RC_SHEIK_IN_KAKARIKO, []() { return MedallionsRequiredBySettings() < 5; }), + std::make_pair(RC_DMT_TRADE_CLAIM_CHECK, []() { + auto ctx = Rando::Context::GetInstance(); + return !ctx->GetOption(RSK_BIGGORON_HINT); + }), + std::make_pair(RC_KAK_30_GOLD_SKULLTULA_REWARD, []() { + auto ctx = Rando::Context::GetInstance(); + return !ctx->GetOption(RSK_KAK_30_SKULLS_HINT) && TokensRequiredBySettings() < 30; + }), + std::make_pair(RC_KAK_40_GOLD_SKULLTULA_REWARD, []() { + auto ctx = Rando::Context::GetInstance(); + return !ctx->GetOption(RSK_KAK_40_SKULLS_HINT) && TokensRequiredBySettings() < 40; + }), + std::make_pair(RC_KAK_50_GOLD_SKULLTULA_REWARD, []() { + auto ctx = Rando::Context::GetInstance(); + return !ctx->GetOption(RSK_KAK_50_SKULLS_HINT) && TokensRequiredBySettings() < 50; + }), + std::make_pair(RC_ZR_FROGS_OCARINA_GAME, []() { + auto ctx = Rando::Context::GetInstance(); + return !ctx->GetOption(RSK_FROGS_HINT); + }), + std::make_pair(RC_KF_LINKS_HOUSE_COW, []() { + auto ctx = Rando::Context::GetInstance(); + return !ctx->GetOption(RSK_MALON_HINT); + }), + std::make_pair(RC_KAK_100_GOLD_SKULLTULA_REWARD, []() { + auto ctx = Rando::Context::GetInstance(); + return !ctx->GetOption(RSK_KAK_100_SKULLS_HINT) && TokensRequiredBySettings() < 100; + }), }; -static size_t NextLineLength(const std::string* textStr, const size_t lastNewline, bool hasIcon = false) { - const size_t maxLinePixelWidth = hasIcon ? 200 : 216; - - - size_t totalPixelWidth = 0; - size_t currentPos = lastNewline; - - // Looping through the string from the lastNewline until the total - // width of counted characters exceeds the maximum pixels in a line. - size_t nextPosJump = 0; - while (totalPixelWidth < maxLinePixelWidth && currentPos < textStr->length()) { - // Skip over control codes - if (textStr->at(currentPos) == '%') { - nextPosJump = 2; - } else if (textStr->at(currentPos) == '$') { - nextPosJump = 2; - } else if (textStr->at(currentPos) == '@') { - nextPosJump = 1; - // Assume worst case for player name 12 * 8 (widest character * longest name length) - totalPixelWidth += 96; - } else { - // Some characters only one byte while others are two bytes - // So check both possibilities when checking for a character - if (pixelWidthTable.count(textStr->substr(currentPos, 1))) { - totalPixelWidth += pixelWidthTable[textStr->substr(currentPos, 1)]; - nextPosJump = 1; - } else if (pixelWidthTable.count(textStr->substr(currentPos, 2))) { - 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("Full string: " + *textStr); - nextPosJump = 1; - } - } - currentPos += nextPosJump; - } - // return the total number of characters we looped through - if (totalPixelWidth > maxLinePixelWidth && textStr->at(currentPos - nextPosJump) != ' ') { - return currentPos - lastNewline - nextPosJump; - } else { - return currentPos - lastNewline; - } -} - -Text AutoFormatHintText(const Text& unformattedHintText, const std::vector& colors = {}) { - std::array strings; - for (int i = 0; i < LANGUAGE_MAX; i++) { - std::string textStr = unformattedHintText.GetForLanguage(i); - - for (const auto& color: colors) { - if (const size_t firstHashtag = textStr.find('#'); firstHashtag != std::string::npos) { - textStr.replace(firstHashtag, 1, color); - if (const size_t secondHashtag = textStr.find('#', firstHashtag + 1); secondHashtag != std::string::npos) { - textStr.replace(secondHashtag, 1, QM_WHITE); - } else { - SPDLOG_DEBUG("non-matching hashtags in string: \"%s\"", textStr); - } - } - } - // Remove any remaining '#' characters. - std::erase(textStr, '#'); - - // insert newlines either manually or when encountering a '&' - size_t lastNewline = 0; - const bool hasIcon = textStr.find('$', 0) != std::string::npos; - size_t lineLength = NextLineLength(&textStr, lastNewline, hasIcon); - while (lastNewline + lineLength < textStr.length()) { - const size_t carrot = textStr.find('^', lastNewline); - const size_t ampersand = textStr.find('&', lastNewline); - const size_t lastSpace = textStr.rfind(' ', lastNewline + lineLength); - const size_t lastPeriod = textStr.rfind('.', lastNewline + lineLength); - // replace '&' first if it's within the newline range - if (ampersand < lastNewline + lineLength) { - lastNewline = ampersand + 1; - // or move the lastNewline cursor to the next line if a '^' is encountered - } else if (carrot < lastNewline + lineLength) { - lastNewline = carrot + 1; - // some lines need to be split but don't have spaces, look for periods instead - } else if (lastSpace == std::string::npos) { - textStr.replace(lastPeriod, 1, ".&"); - lastNewline = lastPeriod + 2; - } else { - textStr.replace(lastSpace, 1, "&"); - lastNewline = lastSpace + 1; - } - lineLength = NextLineLength(&textStr, lastNewline, hasIcon); - } - strings[i] = textStr; - } - - return {strings[0], strings[2], ""/*spanish*/, strings[1]}; -} - -std::array dungeonInfoData; - -Text childAltarText; -Text adultAltarText; -Text ganonText; -Text ganonHintText; -Text sheikText; -Text warpMinuetText; -Text warpBoleroText; -Text warpSerenadeText; -Text warpRequiemText; -Text warpNocturneText; -Text warpPreludeText; - -std::string masterSwordHintLoc; -std::string lightArrowHintLoc; - -void SetGanonText(Text text){ - ganonText = text; -} - - -std::string GetMasterSwordHintLoc() { - return masterSwordHintLoc; -} - -std::string GetLightArrowHintLoc() { - return lightArrowHintLoc; -} - static std::vector GetEmptyGossipStones() { auto emptyGossipStones = GetEmptyLocations(Rando::StaticData::gossipStoneLocations); return emptyGossipStones; @@ -365,34 +357,32 @@ static void SetAllInRegionAsHinted(RandomizerArea area, std::vectorGetItemLocation(loc)->GetArea() == area; }); for(RandomizerCheck loc: locsInRegion){ - ctx->GetItemLocation(loc)->SetAsHinted(); + ctx->GetItemLocation(loc)->SetHintAccesible(); } } -static void AddGossipStoneHint(Text hint, - const RandomizerCheck gossipStone, - const std::vector& colors, - HintType hintType, - std::string distributionName, - const RandomizerCheck hintedLocation) { - //save hints as dummy items for writing to the spoiler log - //NewItem(gossipStone, Item{RG_HINT, hint, ITEMTYPE_EVENT, GI_RUPEE_BLUE_LOSE, false, &noVariable, NONE}); - //GetLocation(gossipStone)->SetPlacedItem(gossipStone); +static void AddGossipStoneHint( const RandomizerCheck gossipStone, + const HintType hintType, + const std::string distributionName, + const std::vector hintKeys, + const std::vector locations, + const std::vector trials) { auto ctx = Rando::Context::GetInstance(); - ctx->AddHint((RandomizerHintKey)((gossipStone - RC_COLOSSUS_GOSSIP_STONE) + 1), AutoFormatHintText(hint, colors), hintedLocation, hintType, distributionName, ctx->GetItemLocation(hintedLocation)->GetArea()); + ctx->AddHint(StaticData::gossipStoneCheckToHint[gossipStone], Hint(StaticData::gossipStoneCheckToHint[gossipStone], hintType, distributionName, hintKeys, locations, {}, trials)); ctx->GetItemLocation(gossipStone)->SetPlacedItem(RG_HINT); //RANDOTODO, better gossip stone to location to hint key system } static void AddGossipStoneHintCopies(uint8_t copies, - Text hint, - std::vector colours, - HintType type, - std::string distributionName, - RandomizerCheck location = RC_UNKNOWN_CHECK, - RandomizerCheck firstStone = RC_UNKNOWN_CHECK){ + const HintType hintType, + const std::string distributionName, + const std::vector hintKeys = {}, + const std::vector locations = {}, + const std::vector trials = {}, + RandomizerCheck firstStone = RC_UNKNOWN_CHECK){ + if (firstStone != RC_UNKNOWN_CHECK && copies > 0){ - AddGossipStoneHint(hint, firstStone, colours, type, distributionName, location); + AddGossipStoneHint(firstStone, hintType, distributionName, hintKeys, locations, trials); copies -= 1; } for(int c=0; c gossipStoneLocations; - gossipStoneLocations = GetAccessibleGossipStones(hintedLocation); + //get a gossip stone accessible without the hinted item + std::vector gossipStoneLocations = GetAccessibleGossipStones(location); if (gossipStoneLocations.empty()) { SPDLOG_DEBUG("\tNO IN LOGIC GOSSIP STONE\n\n"); return false; } - RandomizerCheck gossipStone = RandomElement(gossipStoneLocations); //make hint text - Text finalHint; - Text prefix = ::Hint(RHT_PREFIX).GetText(); - std::vector colours; - if (type == HINT_TYPE_WOTH){ - Text areaText = ::Hint(ctx->GetItemLocation(hintedLocation)->GetArea()).GetText(); - finalHint = prefix + "#" + areaText + "#" + ::Hint(RHT_WAY_OF_THE_HERO).GetText(); - colours = {QM_RED, QM_LBLUE}; - } - else if(type == HINT_TYPE_BARREN){ - Text areaText = ::Hint(ctx->GetItemLocation(hintedLocation)->GetArea()).GetText(); - finalHint = prefix + ::Hint(RHT_PLUNDERING).GetText() + "#" + areaText + "#" + ::Hint(RHT_FOOLISH).GetText(); - colours = {QM_RED, QM_PINK}; - } - else { - Text itemText = ctx->GetItemLocation(hintedLocation)->GetPlacedItem().GetHint().GetText(); - if (type == HINT_TYPE_ITEM_LOCATION){ - Text locationText = Rando::StaticData::GetLocation(hintedLocation)->GetHint()->GetText(); - finalHint = prefix + locationText + " #"+itemText+"#."; - colours = {QM_RED, QM_GREEN}; - } - else if (type == HINT_TYPE_ITEM_AREA){ - Text areaText = ::Hint(ctx->GetItemLocation(hintedLocation)->GetArea()).GetText(); - if (Rando::StaticData::GetLocation(hintedLocation)->IsDungeon()) { - finalHint = prefix+"#"+areaText+"# "+::Hint(RHT_HOARDS).GetText()+" #"+itemText+"#."; - colours = {QM_RED, QM_GREEN}; - } else { - finalHint = prefix+"#"+itemText+"# "+::Hint(RHT_CAN_BE_FOUND_AT).GetText()+" #"+areaText+"#."; - colours = {QM_GREEN, QM_RED}; - } - } - else{ - SPDLOG_DEBUG("\tINVALID HINT TYPE\n\n"); - return false; - } - } - - ctx->GetItemLocation(hintedLocation)->SetAsHinted(); - SPDLOG_DEBUG("\tMessage: "); - SPDLOG_DEBUG(finalHint.english); - SPDLOG_DEBUG("\n\n"); - - AddGossipStoneHintCopies(copies, finalHint, colours, type, distributionName, hintedLocation, gossipStone); + ctx->GetItemLocation(location)->SetHintAccesible(); + AddGossipStoneHintCopies(copies, type, distribution, {}, {location}, {}, gossipStone); return true; } @@ -501,7 +448,7 @@ static RandomizerCheck CreateRandomHint(std::vector& possibleHi placed = CreateHint(hintedLocation, copies, type, distributionName); } - if (type == HINT_TYPE_BARREN){ + if (type == HINT_TYPE_FOOLISH){ SetAllInRegionAsHinted(ctx->GetItemLocation(hintedLocation)->GetArea(), possibleHintLocations); } return hintedLocation; @@ -511,7 +458,7 @@ static std::vector FilterHintability(std::vector extraFilter = NoFilter){ auto ctx = Rando::Context::GetInstance(); return FilterFromPool(locations, [extraFilter, ctx](const RandomizerCheck loc) { - return ctx->GetItemLocation(loc)->IsHintable() && !(ctx->GetItemLocation(loc)->IsHintedAt()) + return ctx->GetItemLocation(loc)->IsHintable() && !(ctx->GetItemLocation(loc)->IsAHintAccessible()) && extraFilter(loc); }); } @@ -519,426 +466,60 @@ static std::vector FilterHintability(std::vector 0) { auto ctx = Rando::Context::GetInstance(); - Text prefix = ::Hint(RHT_PREFIX).GetText(); - //six trials - if (ctx->GetOption(RSK_GANONS_TRIALS).IsNot(RO_GANONS_TRIALS_SKIP) && ctx->GetOption(RSK_TRIAL_COUNT).Is(6)) { - AddGossipStoneHintCopies(copies, prefix + ::Hint(RHT_SIX_TRIALS).GetText(), {QM_PINK}, HINT_TYPE_TRIAL, "Trial"); - //zero trials - } else if (ctx->GetOption(RSK_GANONS_TRIALS).IsNot(RO_GANONS_TRIALS_SKIP) && ctx->GetOption(RSK_TRIAL_COUNT).Is(0)) { - AddGossipStoneHintCopies(copies, prefix + ::Hint(RHT_ZERO_TRIALS).GetText(), {QM_YELLOW}, HINT_TYPE_TRIAL, "Trial"); - //4 or 5 required trials - } else if (ctx->GetOption(RSK_TRIAL_COUNT).Is(5) || ctx->GetOption(RSK_TRIAL_COUNT).Is(4)) { - //get skipped trials - std::vector trials = {}; - auto trialList = ctx->GetTrials()->GetTrialList(); - trials.assign(trialList.begin(), trialList.end()); - auto skippedTrials = FilterFromPool(trials, [](TrialInfo* trial){return trial->IsSkipped();}); - - //create a hint for each skipped trial - for (auto& trial : skippedTrials) { - //make hint - auto hint = prefix+"#"+trial->GetName()+"#"+::Hint(RHT_FOUR_TO_FIVE_TRIALS).GetText(); - AddGossipStoneHintCopies(copies, hint, {QM_YELLOW}, HINT_TYPE_TRIAL, "Trial"); - } - //1 to 3 trials - } else if (ctx->GetOption(RSK_TRIAL_COUNT).Value() >= 1 && ctx->GetOption(RSK_TRIAL_COUNT).Value() <= 3) { - //get requried trials - std::vector trials = {}; - auto trialList = ctx->GetTrials()->GetTrialList(); - trials.assign(trialList.begin(), trialList.end()); - auto requiredTrials = FilterFromPool(trials, [](TrialInfo* trial){return trial->IsRequired();}); - - //create a hint for each required trial - for (auto& trial : requiredTrials) { - //make hint - auto hint = prefix+"#"+trial->GetName()+"#"+::Hint(RHT_ONE_TO_THREE_TRIALS).GetText(); - AddGossipStoneHintCopies(copies, hint, {QM_PINK}, HINT_TYPE_TRIAL, "Trial"); - } - } - } -} - -//RANDOTODO clean this mess up once starting items are expanded -void CreateGanonAndSheikText() { - auto ctx = Rando::Context::GetInstance(); - if(ctx->GetOption(RSK_LIGHT_ARROWS_HINT)){ - //Get the location of the light arrows - auto lightArrowLocation = FilterFromPool(ctx->allLocations, [ctx](const RandomizerCheck loc) { - return ctx->GetItemLocation(loc)->GetPlacedRandomizerGet() == RG_LIGHT_ARROWS; - }); - RandomizerArea lightArrowArea = ctx->GetItemLocation(lightArrowLocation[0])->GetArea(); - Text LightArrowAreaText = ::Hint(lightArrowArea).GetText(); - std::vector locsToCheck = {RC_GANONDORF_HINT}; - - //If there is no light arrow location, it was in the player's inventory at the start - auto hint = ::Hint(RHT_LIGHT_ARROW_LOCATION_HINT); - if (lightArrowLocation.empty()) { - ganonHintText = hint.GetText()+::Hint(RHT_YOUR_POCKET).GetText(); - lightArrowHintLoc = "Link's Pocket"; + if (ctx->GetOption(RSK_TRIAL_COUNT).Is(6)) {//six trials + AddGossipStoneHintCopies(copies, HINT_TYPE_HINT_KEY, "Trial", {RHT_SIX_TRIALS}); + } else if (ctx->GetOption(RSK_TRIAL_COUNT).Is(0)) {//zero trials + AddGossipStoneHintCopies(copies, HINT_TYPE_HINT_KEY, "Trial", {RHT_ZERO_TRIALS}); } else { - ganonHintText = hint.GetText() + "%r" + LightArrowAreaText + "%w"; - lightArrowHintLoc = Rando::StaticData::GetLocation(lightArrowLocation[0])->GetName(); - } - ganonHintText = ganonHintText + "!"; - - //Get the location of the master sword - auto masterSwordLocation = FilterFromPool(ctx->allLocations, [ctx](const RandomizerCheck loc) { - return ctx->GetItemLocation(loc)->GetPlacedRandomizerGet() == RG_MASTER_SWORD; - }); - Text masterSwordArea = ::Hint(ctx->GetItemLocation(masterSwordLocation[0])->GetArea()).GetText(); - - if (ctx->GetOption(RSK_SHUFFLE_MASTER_SWORD)) { - // Add second text box - ganonHintText = ganonHintText + "^"; - if (masterSwordLocation.empty()) { - ganonHintText = ganonHintText + ::Hint(RHT_MASTER_SWORD_LOCATION_HINT).GetText() + "%r" + ::Hint(RHT_YOUR_POCKET).GetText() + "%w"; - masterSwordHintLoc = "Link's Pocket"; - } else { - ganonHintText = ganonHintText + ::Hint(RHT_MASTER_SWORD_LOCATION_HINT).GetText() + "%r" + masterSwordArea + "%w"; - masterSwordHintLoc = Rando::StaticData::GetLocation(masterSwordLocation[0])->GetName(); + std::vector trials = ctx->GetTrials()->GetTrialList(); //there's probably a way to remove this assignment + if (ctx->GetOption(RSK_TRIAL_COUNT).Value() >= 4) {//4 or 5 required trials, get skipped trials + trials = FilterFromPool(trials, [](TrialInfo* trial){return trial->IsSkipped();}); + } else {//1 to 3 trials, get requried trials + auto requiredTrials = FilterFromPool(trials, [](TrialInfo* trial){return trial->IsRequired();}); } - ganonHintText = ganonHintText + "!"; - } - - ctx->AddHint(RH_GANONDORF_HINT, AutoFormatHintText(ganonHintText), lightArrowLocation[0], HINT_TYPE_STATIC, "Static", lightArrowArea); - ctx->AddHint(RH_GANONDORF_NOHINT, AutoFormatHintText(ganonText), lightArrowLocation[0], HINT_TYPE_STATIC, "Static", lightArrowArea); - - if (!ctx->GetOption(RSK_TRIAL_COUNT).Is(0)) { - sheikText = ::Hint(RHT_SHEIK_LIGHT_ARROW_HINT).GetText() + LightArrowAreaText + "%w."; - locsToCheck = {RC_GANONDORF_HINT, RC_SHEIK_HINT_GC, RC_SHEIK_HINT_MQ_GC}; - - if (ctx->GetOption(RSK_SHUFFLE_MASTER_SWORD)) { - sheikText = sheikText + "^" + ::Hint(RHT_SHEIK_MASTER_SWORD_LOCATION_HINT).GetText() + masterSwordArea + "%w."; - } - } - - if (IsReachableWithout(locsToCheck, lightArrowLocation[0], true)) { - ctx->GetItemLocation(lightArrowLocation[0])->SetAsHinted(); - } - ctx->AddHint(RH_SHEIK_LIGHT_ARROWS, AutoFormatHintText(sheikText), lightArrowLocation[0], HINT_TYPE_STATIC, "Static", lightArrowArea); - - if (ctx->GetOption(RSK_SHUFFLE_MASTER_SWORD)) { - if (IsReachableWithout(locsToCheck, masterSwordLocation[0], true)) { - ctx->GetItemLocation(masterSwordLocation[0])->AddHintedBy(RH_GANONDORF_HINT); - ctx->GetItemLocation(masterSwordLocation[0])->SetAsHinted(); + for (auto& trial : trials) {//create a hint for each hinted trial + AddGossipStoneHintCopies(copies, HINT_TYPE_TRIAL, "Trial", {}, {}, {trial->GetTrialKey()}); } } } } -//Find the location which has the given itemKey and create the generic altar text for the reward -static Text BuildDungeonRewardText(const ItemID itemID, const RandomizerGet itemKey) { - auto ctx = Rando::Context::GetInstance(); - RandomizerCheck altarLoc = RC_ALTAR_HINT_ADULT; - if (itemKey == RG_KOKIRI_EMERALD || itemKey == RG_GORON_RUBY || itemKey == RG_ZORA_SAPPHIRE) { - altarLoc = RC_ALTAR_HINT_CHILD; - } - const RandomizerCheck location = FilterFromPool(ctx->allLocations, [itemKey, ctx](const RandomizerCheck loc) { - return ctx->GetItemLocation(loc)->GetPlacedRandomizerGet() == itemKey; - })[0]; - if (IsReachableWithout({altarLoc}, location, true) || ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_END_OF_DUNGEON)){ //RANDOTODO check if works properly - ctx->GetItemLocation(location)->SetAsHinted(); - } - - std::string rewardString = "$" + std::to_string(itemKey - RG_KOKIRI_EMERALD); - - // RANDOTODO implement colors for locations - return Text() + rewardString + "#" + - ::Hint(ctx->GetItemLocation(location)->GetArea()).GetText().Capitalize() + - "#...^"; -} - -static Text BuildDoorOfTimeText() { - auto ctx = Rando::Context::GetInstance(); - std::string itemObtained; - Text doorOfTimeText; - - if (ctx->GetOption(RSK_DOOR_OF_TIME).Is(RO_DOOROFTIME_OPEN)) { - itemObtained = "$o"; - doorOfTimeText = ::Hint(RHT_CHILD_ALTAR_TEXT_END_DOTOPEN).GetText(); - - } else if (ctx->GetOption(RSK_DOOR_OF_TIME).Is(RO_DOOROFTIME_SONGONLY)) { - itemObtained = "$c"; - doorOfTimeText = ::Hint(RHT_CHILD_ALTAR_TEXT_END_DOTSONGONLY).GetText(); - - } else if (ctx->GetOption(RSK_DOOR_OF_TIME).Is(RO_DOOROFTIME_CLOSED)) { - itemObtained = "$i"; - doorOfTimeText = ::Hint(RHT_CHILD_ALTAR_TEXT_END_DOTCLOSED).GetText(); - } - - return Text()+itemObtained+doorOfTimeText; -} - -//insert the required number into the hint and set the singular/plural form -static Text BuildCountReq(const RandomizerHintTextKey req, const Rando::Option& count) { - Text requirement = ::Hint(req).GetTextCopy(); - if (count.Value() == 1) { - requirement.SetForm(SINGULAR); - } else { - requirement.SetForm(PLURAL); - } - requirement.Replace("%d", std::to_string(count.Value())); - return requirement; -} - -static Text BuildBridgeReqsText() { - auto ctx = Rando::Context::GetInstance(); - Text bridgeText; - - if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_ALWAYS_OPEN)) { - bridgeText = ::Hint(RHT_BRIDGE_OPEN_HINT).GetText(); - - } else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_VANILLA)) { - bridgeText = ::Hint(RHT_BRIDGE_VANILLA_HINT).GetText(); - - } else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_STONES)) { - bridgeText = BuildCountReq(RHT_BRIDGE_STONES_HINT, ctx->GetOption(RSK_RAINBOW_BRIDGE_STONE_COUNT)); - - } else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_MEDALLIONS)) { - bridgeText = BuildCountReq(RHT_BRIDGE_MEDALLIONS_HINT, ctx->GetOption(RSK_RAINBOW_BRIDGE_MEDALLION_COUNT)); - - } else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_DUNGEON_REWARDS)) { - bridgeText = BuildCountReq(RHT_BRIDGE_REWARDS_HINT, ctx->GetOption(RSK_RAINBOW_BRIDGE_REWARD_COUNT)); - - } else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_DUNGEONS)) { - bridgeText = BuildCountReq(RHT_BRIDGE_DUNGEONS_HINT, ctx->GetOption(RSK_RAINBOW_BRIDGE_DUNGEON_COUNT)); - - } else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_TOKENS)) { - bridgeText = BuildCountReq(RHT_BRIDGE_TOKENS_HINT, ctx->GetOption(RSK_RAINBOW_BRIDGE_TOKEN_COUNT)); - - } else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_GREG)) { - bridgeText = ::Hint(RHT_BRIDGE_GREG_HINT).GetText(); - } - - return Text()+"$l"+bridgeText+"^"; -} - -static Text BuildGanonBossKeyText() { - auto ctx = Rando::Context::GetInstance(); - Text ganonBossKeyText; - - if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_STARTWITH)) { - ganonBossKeyText = ::Hint(RHT_GANON_BK_START_WITH_HINT).GetText(); - - } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_VANILLA)) { - ganonBossKeyText = ::Hint(RHT_GANON_BK_VANILLA_HINT).GetText(); - - } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_OWN_DUNGEON)) { - ganonBossKeyText = ::Hint(RHT_GANON_BK_OWN_DUNGEON_HINT).GetText(); - - } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_ANY_DUNGEON)) { - ganonBossKeyText = ::Hint(RHT_GANON_BK_ANY_DUNGEON_HINT).GetText(); - - } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_OVERWORLD)) { - ganonBossKeyText = ::Hint(RHT_GANON_BK_OVERWORLD_HINT).GetText(); - - } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_ANYWHERE)) { - ganonBossKeyText = ::Hint(RHT_GANON_BK_ANYWHERE_HINT).GetText(); - - } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_KAK_TOKENS)) { - ganonBossKeyText = ::Hint(RHT_GANON_BK_SKULLTULA_HINT).GetText(); - - } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_VANILLA)) { - ganonBossKeyText = ::Hint(RHT_LACS_VANILLA_HINT).GetText(); - - } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_STONES)) { - ganonBossKeyText = BuildCountReq(RHT_LACS_STONES_HINT, ctx->GetOption(RSK_LACS_STONE_COUNT)); - - } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_MEDALLIONS)) { - ganonBossKeyText = BuildCountReq(RHT_LACS_MEDALLIONS_HINT, ctx->GetOption(RSK_LACS_MEDALLION_COUNT)); - - } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_REWARDS)) { - ganonBossKeyText = BuildCountReq(RHT_LACS_REWARDS_HINT, ctx->GetOption(RSK_LACS_REWARD_COUNT)); - - } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_DUNGEONS)) { - ganonBossKeyText = BuildCountReq(RHT_LACS_DUNGEONS_HINT, ctx->GetOption(RSK_LACS_DUNGEON_COUNT)); - - } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_TOKENS)) { - ganonBossKeyText = BuildCountReq(RHT_LACS_TOKENS_HINT, ctx->GetOption(RSK_LACS_TOKEN_COUNT)); - - } else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_TRIFORCE_HUNT)) { - ganonBossKeyText = ::Hint(RHT_GANON_BK_TRIFORCE_HINT).GetText(); - } - - return Text()+"$b"+ganonBossKeyText+"^"; -} - -void CreateAltarText() { - auto ctx = Rando::Context::GetInstance(); - - //Child Altar Text - if (ctx->GetOption(RSK_TOT_ALTAR_HINT)) { - childAltarText = ::Hint(RHT_SPIRITUAL_STONE_TEXT_START).GetText()+"^"+ - //Spiritual Stones - // TODO: Starting Inventory Dungeon Rewards - (/*StartingKokiriEmerald.Value()*/false ? Text{ "##", "##", "##" } - : BuildDungeonRewardText(ITEM_KOKIRI_EMERALD, RG_KOKIRI_EMERALD)) + - (/*StartingGoronRuby.Value()*/false ? Text{ "##", "##", "##" } - : BuildDungeonRewardText(ITEM_GORON_RUBY, RG_GORON_RUBY)) + - (/*StartingZoraSapphire.Value()*/false ? Text{ "##", "##", "##" } - : BuildDungeonRewardText(ITEM_ZORA_SAPPHIRE, RG_ZORA_SAPPHIRE)) + - //How to open Door of Time, the event trigger is necessary to read the altar multiple times - BuildDoorOfTimeText(); - } else { - childAltarText = BuildDoorOfTimeText(); - } - ctx->AddHint(RH_ALTAR_CHILD, AutoFormatHintText(childAltarText, { QM_GREEN, QM_RED, QM_BLUE }), RC_UNKNOWN_CHECK, HINT_TYPE_STATIC, "Static"); - - //CreateMessageFromTextObject(0x7040, 0, 2, 3, AddColorsAndFormat(childAltarText, {QM_GREEN, QM_RED, QM_BLUE})); - - //Adult Altar Text - adultAltarText = ::Hint(RHT_ADULT_ALTAR_TEXT_START).GetText() + "^"; - if (ctx->GetOption(RSK_TOT_ALTAR_HINT)) { - adultAltarText = adultAltarText + - //Medallion Areas - (/*StartingLightMedallion.Value()*/false ? Text{ "##", "##", "##" } - : BuildDungeonRewardText(ITEM_MEDALLION_LIGHT, RG_LIGHT_MEDALLION)) + - (/*StartingForestMedallion.Value()*/false ? Text{ "##", "##", "##" } - : BuildDungeonRewardText(ITEM_MEDALLION_FOREST, RG_FOREST_MEDALLION)) + - (/*StartingFireMedallion.Value()*/false ? Text{ "##", "##", "##" } - : BuildDungeonRewardText(ITEM_MEDALLION_FIRE, RG_FIRE_MEDALLION)) + - (/*StartingWaterMedallion.Value()*/false ? Text{ "##", "##", "##" } - : BuildDungeonRewardText(ITEM_MEDALLION_WATER, RG_WATER_MEDALLION)) + - (/*StartingSpiritMedallion.Value()*/false ? Text{ "##", "##", "##" } - : BuildDungeonRewardText(ITEM_MEDALLION_SPIRIT, RG_SPIRIT_MEDALLION)) + - (/*StartingShadowMedallion.Value()*/false ? Text{ "##", "##", "##" } - : BuildDungeonRewardText(ITEM_MEDALLION_SHADOW, RG_SHADOW_MEDALLION)); - } - adultAltarText = adultAltarText + - //Bridge requirement - BuildBridgeReqsText()+ - - //Ganons Boss Key requirement - BuildGanonBossKeyText()+ - - //End - ::Hint(RHT_ADULT_ALTAR_TEXT_END).GetText(); - //CreateMessageFromTextObject(0x7088, 0, 2, 3, AddColorsAndFormat(adultAltarText, {QM_RED, QM_YELLOW, QM_GREEN, QM_RED, QM_BLUE, QM_YELLOW, QM_PINK, QM_RED, QM_RED, QM_RED, QM_RED})); - ctx->AddHint(RH_ALTAR_ADULT, AutoFormatHintText(adultAltarText, { QM_RED, QM_YELLOW, QM_GREEN, QM_RED, QM_BLUE, QM_YELLOW, QM_PINK, QM_RED, QM_RED, QM_RED, QM_RED }), RC_UNKNOWN_CHECK, HINT_TYPE_STATIC, "Static"); -} - -void CreateMerchantsHints() { - auto ctx = Rando::Context::GetInstance(); - Text beanSalesmanItemText, medigoronItemText, grannyItemText, carpetSalesmanItemText, carpetSalesmanAfterItemText; - if (ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ON_HINT)) { - RandomizerGet beanSalesmanItem = ctx->GetItemLocation(RC_ZR_MAGIC_BEAN_SALESMAN)->GetPlacedRandomizerGet(); - beanSalesmanItemText = ctx->GetItemLocation(RC_ZR_MAGIC_BEAN_SALESMAN)->GetPlacedItem().GetHint().GetText(); - if (beanSalesmanItem == RG_ICE_TRAP) { - beanSalesmanItemText = ctx->overrides[RC_ZR_MAGIC_BEAN_SALESMAN].GetTrickName(); - } - RandomizerGet medigoronItem = ctx->GetItemLocation(RC_GC_MEDIGORON)->GetPlacedRandomizerGet(); - medigoronItemText = ctx->GetItemLocation(RC_GC_MEDIGORON)->GetPlacedItem().GetHint().GetText(); - if (medigoronItem == RG_ICE_TRAP) { - medigoronItemText = ctx->overrides[RC_GC_MEDIGORON].GetTrickName(); - } - RandomizerGet grannyItem = ctx->GetItemLocation(RC_KAK_GRANNYS_SHOP)->GetPlacedRandomizerGet(); - grannyItemText = ctx->GetItemLocation(RC_KAK_GRANNYS_SHOP)->GetPlacedItem().GetHint().GetText().Capitalize(); - if (grannyItem == RG_ICE_TRAP) { - grannyItemText = ctx->overrides[RC_KAK_GRANNYS_SHOP].GetTrickName(); - } - RandomizerGet carpetSalesmanItem = ctx->GetItemLocation(RC_WASTELAND_BOMBCHU_SALESMAN)->GetPlacedRandomizerGet(); - carpetSalesmanItemText = - ctx->GetItemLocation(RC_WASTELAND_BOMBCHU_SALESMAN)->GetPlacedItem().GetHint().GetText(); - if (carpetSalesmanItem == RG_ICE_TRAP) { - carpetSalesmanItemText = ctx->overrides[RC_WASTELAND_BOMBCHU_SALESMAN].GetTrickName(); - } - carpetSalesmanAfterItemText = ::Hint(RHT_CARPET_SALESMAN_DIALOG_HINTED).GetText(); - } else { - medigoronItemText = grannyItemText = carpetSalesmanItemText = hintTable[RHT_HINT_MYSTERIOUS].GetTextCopy(); - carpetSalesmanAfterItemText = ::Hint(RHT_CARPET_SALESMAN_DIALOG_MYSTERIOUS).GetText(); - beanSalesmanItemText = Text{ "mysterious item", "objet mystérieux", "objeto misterioso", "mysteriöser gegenstand" }; - } - - Text medigoronText = - ::Hint(RHT_MEDIGORON_DIALOG_FIRST).GetText() + medigoronItemText + ::Hint(RHT_MEDIGORON_DIALOG_SECOND).GetText(); - Text grannyText = Text{"#"} + grannyItemText + "#" + ::Hint(RHT_GRANNY_DIALOG).GetText(); - Text carpetSalesmanTextOne = ::Hint(RHT_CARPET_SALESMAN_DIALOG_FIRST).GetText() + carpetSalesmanItemText + - carpetSalesmanAfterItemText; - Text carpetSalesmanTextTwo = ::Hint(RHT_CARPET_SALESMAN_DIALOG_FINAL).GetText(); - medigoronText = AutoFormatHintText(medigoronText, {QM_GREEN, QM_YELLOW, QM_GREEN }); - grannyText = AutoFormatHintText(grannyText, { QM_GREEN, QM_YELLOW, QM_GREEN }); - carpetSalesmanTextOne = AutoFormatHintText(carpetSalesmanTextOne, { QM_GREEN, QM_RED, QM_YELLOW, QM_GREEN }); - - if (ctx->GetOption(RSK_SHUFFLE_MAGIC_BEANS)) { - Text beanSalesmanText = ::Hint(RHT_BEAN_SALESMAN_FIRST).GetText() + beanSalesmanItemText + ::Hint(RHT_BEAN_SALESMAN_SECOND).GetText(); - ctx->AddHint(RH_BEAN_SALESMAN, AutoFormatHintText(beanSalesmanText, { QM_RED, QM_GREEN, QM_YELLOW, QM_GREEN }), RC_ZR_MAGIC_BEAN_SALESMAN, HINT_TYPE_STATIC, "Static", RA_ZORAS_RIVER); - } - - ctx->AddHint(RH_MEDIGORON, medigoronText, RC_GC_MEDIGORON, HINT_TYPE_STATIC, "Static", RA_GORON_CITY); - ctx->AddHint(RH_GRANNYS_SHOP, grannyText, RC_KAK_GRANNYS_SHOP, HINT_TYPE_STATIC, "Static", RA_KAKARIKO_VILLAGE); - ctx->AddHint(RH_WASTELAND_BOMBCHU_SALESMAN, carpetSalesmanTextOne, RC_WASTELAND_BOMBCHU_SALESMAN, HINT_TYPE_STATIC, "Static", RA_HAUNTED_WASTELAND); - // Technically not a hint but this is probably the best place we have to store it for now. - ctx->AddHint(RH_WASTELAND_BOMBCHU_SALESMAN_POST, carpetSalesmanTextTwo, RC_WASTELAND_BOMBCHU_SALESMAN, HINT_TYPE_STATIC, "Static", RA_HAUNTED_WASTELAND); -} - -//RANDOTODO add Better Links Pocket and starting item handling once more starting items are added -void CreateSpecialItemHint(uint32_t item, RandomizerHintKey hintKey, std::vector hints, RandomizerHintTextKey text1, RandomizerHintTextKey text2, bool condition, bool yourpocket = false) { - auto ctx = Rando::Context::GetInstance(); - if(condition){ - RandomizerCheck location = FilterFromPool(ctx->allLocations, [item, ctx](const RandomizerCheck loc) { - return ctx->GetItemLocation(loc)->GetPlacedRandomizerGet() == item; - })[0]; - - if (IsReachableWithout(hints,location,true)){ - ctx->GetItemLocation(location)->SetAsHinted(); - } - - RandomizerArea area = ctx->GetItemLocation(location)->GetArea(); - ctx->AddHint(hintKey, AutoFormatHintText(::Hint(text1).GetText() + ::Hint(area).GetText() + ::Hint(text2).GetText()), - location, HINT_TYPE_STATIC, "Static", area); - } -} - void CreateWarpSongTexts() { auto ctx = Rando::Context::GetInstance(); - - auto warpSongEntrances = GetShuffleableEntrances(EntranceType::WarpSong, false); - for (auto entrance : warpSongEntrances) { - auto destination = entrance->GetConnectedRegion()->GetArea(); - Text resolvedHint = ::Hint(destination).GetText(); - // If no Hint Area, use Region text - if (destination == RA_NONE) { - resolvedHint = Text{"","",""} + entrance->GetConnectedRegion()->regionName; + if (ctx->GetOption(RSK_WARP_SONG_HINTS)){ + auto warpSongEntrances = GetShuffleableEntrances(EntranceType::WarpSong, false); + for (auto entrance : warpSongEntrances) { + auto destination = entrance->GetConnectedRegion()->GetArea();//KNOWN ISSUE: says links pocket sometimes, putting off as this will need rewriting when entrance hits are added anyway + switch (entrance->GetIndex()) { + case 0x0600: // minuet RANDOTODO make into entrance hints when they are added + ctx->AddHint(RH_MINUET_WARP_LOC, Hint(RH_MINUET_WARP_LOC, HINT_TYPE_AREA, "", {RHT_WARP_SONG}, {}, {destination})); + break; + case 0x04F6: // bolero + ctx->AddHint(RH_BOLERO_WARP_LOC, Hint(RH_BOLERO_WARP_LOC, HINT_TYPE_AREA, "", {RHT_WARP_SONG}, {}, {destination})); + break; + case 0x0604: // serenade + ctx->AddHint(RH_SERENADE_WARP_LOC, Hint(RH_SERENADE_WARP_LOC, HINT_TYPE_AREA, "", {RHT_WARP_SONG}, {}, {destination})); + break; + case 0x01F1: // requiem + ctx->AddHint(RH_REQUIEM_WARP_LOC, Hint(RH_REQUIEM_WARP_LOC, HINT_TYPE_AREA, "", {RHT_WARP_SONG}, {}, {destination})); + break; + case 0x0568: // nocturne + ctx->AddHint(RH_NOCTURNE_WARP_LOC, Hint(RH_NOCTURNE_WARP_LOC, HINT_TYPE_AREA, "", {RHT_WARP_SONG}, {}, {destination})); + break; + case 0x05F4: // prelude + ctx->AddHint(RH_PRELUDE_WARP_LOC, Hint(RH_PRELUDE_WARP_LOC, HINT_TYPE_AREA, "", {RHT_WARP_SONG}, {}, {destination})); + break; + default: + break; + } } - resolvedHint = ::Hint(RHT_WARP_TO).GetText() + resolvedHint + ::Hint(RHT_WARP_CHOICE).GetText(); - RandomizerHintKey hintKey = RH_NONE; - switch (entrance->GetIndex()) { - case 0x0600: // minuet - hintKey = RH_MINUET_WARP_LOC; - break; - case 0x04F6: // bolero - hintKey = RH_BOLERO_WARP_LOC; - break; - case 0x0604: // serenade - hintKey = RH_SERENADE_WARP_LOC; - break; - case 0x01F1: // requiem - hintKey = RH_REQUIEM_WARP_LOC; - break; - case 0x0568: // nocturne - hintKey = RH_NOCTURNE_WARP_LOC; - break; - case 0x05F4: // prelude - hintKey = RH_PRELUDE_WARP_LOC; - break; - default: - break; - } - ctx->AddHint(hintKey, AutoFormatHintText(resolvedHint, { QM_RED, QM_GREEN }), RC_UNKNOWN_CHECK, HINT_TYPE_STATIC, "Static", destination); } } @@ -973,8 +554,7 @@ static void DistributeHints(std::vector& selected, size_t stoneCount, s selected[distribution] += 1; stoneCount -= distTable[distribution].copies; break; - } - else { + } else { totalWeight -= distTable[distribution].weight; distTable[distribution].weight = 0; break; @@ -1002,10 +582,7 @@ uint8_t PlaceHints(std::vector& selectedHints, std::vector hintTypePool = FilterHintability(ctx->allLocations, distribution.filter); for (uint8_t numHint = 0; numHint < selectedHints[curSlot]; numHint++){ - SPDLOG_DEBUG("Attempting to make hint of type: "); - SPDLOG_DEBUG(hintTypeNames[static_cast(distribution.type)]); - SPDLOG_DEBUG("\n"); - + SPDLOG_DEBUG("Attempting to make hint of type: " + StaticData::hintTypeNames[distribution.type].GetEnglish(MF_CLEAN) + "\n"); RandomizerCheck hintedLocation = RC_UNKNOWN_CHECK; hintedLocation = CreateRandomHint(hintTypePool, distribution.copies, distribution.type, distribution.name); @@ -1035,40 +612,44 @@ void CreateStoneHints() { const HintSetting& hintSetting = hintSettingTable[ctx->GetOption(RSK_HINT_DISTRIBUTION).Value()]; std::vector distTable = hintSetting.distTable; - // Apply Static hint exclusions with no in-game requirements - for (int c = 0; c < staticHintLocations.size(); c++){ - if(ctx->GetOption(staticHintLocations[c].second)){ - ctx->GetItemLocation(staticHintLocations[c].first)->SetAsHinted(); - } + // Apply impa's song exclusions when zelda is skipped + if(ctx->GetOption(RSK_SKIP_CHILD_ZELDA)){ + ctx->GetItemLocation(RC_SONG_FROM_IMPA)->SetHintAccesible(); } // Add 'always' location hints + std::vector alwaysHintLocations = {}; if (hintSetting.alwaysCopies > 0) { - // Only filter locations that had a random item placed at them (e.g. don't get cow locations if shuffle cows is - // off) - auto alwaysHintLocations = FilterFromPool(ctx->allLocations, [ctx](const RandomizerCheck loc) { - return ((Rando::StaticData::GetLocation(loc)->GetHint()->GetType() == HintCategory::Always) || - // If we have Rainbow Bridge set to Greg, add a hint for where Greg is - (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_GREG) && - ctx->GetItemLocation(loc)->GetPlacedRandomizerGet() == RG_GREG_RUPEE)) && - ctx->GetItemLocation(loc)->IsHintable() && - !(ctx->GetOption(RSK_GREG_HINT) && (IsReachableWithout({RC_GREG_HINT}, loc, true))); + if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_GREG)){ + // If we have Rainbow Bridge set to Greg and the greg hint isn't useful, add a hint for where Greg is + // Do we really need this with the greg hint? + auto gregLocations = FilterFromPool(ctx->allLocations, [ctx](const RandomizerCheck loc) { + return ( + (ctx->GetItemLocation(loc)->GetPlacedRandomizerGet() == RG_GREG_RUPEE)) && + ctx->GetItemLocation(loc)->IsHintable() && + !(ctx->GetOption(RSK_GREG_HINT) && (IsReachableWithout({RC_GREG_HINT}, loc, true))); }); - - for (auto& hint : conditionalAlwaysHints) { - RandomizerCheck loc = hint.first; - if (hint.second() && ctx->GetItemLocation(loc)->IsHintable()) { - alwaysHintLocations.push_back(loc); - } + if (gregLocations.size() > 0){ + alwaysHintLocations.push_back(gregLocations[0]); } + } + + for (auto& hint : conditionalAlwaysHints) { + RandomizerCheck loc = hint.first; + if (hint.second() && ctx->GetItemLocation(loc)->IsHintable()) { + alwaysHintLocations.push_back(loc); + } + } for (RandomizerCheck location : alwaysHintLocations) { - CreateHint(location, hintSetting.alwaysCopies, HINT_TYPE_ITEM_LOCATION, "Always"); + CreateHint(location, hintSetting.alwaysCopies, HINT_TYPE_ITEM, "Always"); } } //Add 'trial' location hints - CreateTrialHints(hintSetting.trialCopies); + if (ctx->GetOption(RSK_GANONS_TRIALS).IsNot(RO_GANONS_TRIALS_SKIP)) { + CreateTrialHints(hintSetting.trialCopies); + } size_t totalStones = GetEmptyGossipStones().size(); std::vector selectedHints = {}; @@ -1077,7 +658,7 @@ void CreateStoneHints() { } selectedHints.push_back(0); DistributeHints(selectedHints, totalStones, distTable, hintSetting.junkWeight); - + while(totalStones != 0){ totalStones = PlaceHints(selectedHints, distTable); while (totalStones != 0){ @@ -1092,34 +673,114 @@ void CreateStoneHints() { GetAccessibleLocations({}); } -void CreateFrogsHint() { - const auto ctx = Rando::Context::GetInstance(); - Rando::ItemLocation* itemLoc = ctx->GetItemLocation(RC_ZR_FROGS_OCARINA_GAME); - Text itemText = itemLoc->GetPlacedItem().GetHint().GetText(); - if (itemLoc->GetPlacedRandomizerGet() == RG_ICE_TRAP) { - itemText = ctx->overrides[RC_ZR_FROGS_OCARINA_GAME].GetTrickName(); +std::vector FindItemsAndMarkHinted(std::vector items, std::vector hintChecks){ + std::vector locations = {}; + auto ctx = Rando::Context::GetInstance(); + for (uint8_t c = 0; c < items.size(); c++){ + std::vector found = FilterFromPool(ctx->allLocations, [items, ctx, c](const RandomizerCheck loc) { + return ctx->GetItemLocation(loc)->GetPlacedRandomizerGet() == items[c];}); + if (found.size() > 0){ + locations.push_back(found[0]); + } + //RANDOTODO make the called functions of this always return true if empty hintChecks are provided + if (hintChecks.size() == 0 || (!ctx->GetItemLocation(found[0])->IsAHintAccessible() && IsReachableWithout(hintChecks,found[0],true))){ + ctx->GetItemLocation(found[0])->SetHintAccesible(); + } + } + return locations; +} + +void CreateChildAltarHint() { + auto ctx = Rando::Context::GetInstance(); + if (!ctx->GetHint(RH_ALTAR_CHILD)->IsEnabled()){ + std::vector stoneLocs = {}; + if (ctx->GetOption(RSK_TOT_ALTAR_HINT)) { + //force marking the rewards as hinted if they are at the end of dungeons as they can be inffered + if (ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_END_OF_DUNGEON)){ + stoneLocs = FindItemsAndMarkHinted({RG_KOKIRI_EMERALD, RG_GORON_RUBY, RG_ZORA_SAPPHIRE}, {}); + } else { + stoneLocs = FindItemsAndMarkHinted({RG_KOKIRI_EMERALD, RG_GORON_RUBY, RG_ZORA_SAPPHIRE}, {RC_ALTAR_HINT_CHILD}); + } + } + ctx->AddHint(RH_ALTAR_CHILD, Hint(RH_ALTAR_CHILD, HINT_TYPE_ALTAR_CHILD, {}, stoneLocs)); + } +} + +void CreateAdultAltarHint() { + auto ctx = Rando::Context::GetInstance(); + if (!ctx->GetHint(RH_ALTAR_ADULT)->IsEnabled()){ + std::vector medallionLocs = {}; + if (ctx->GetOption(RSK_TOT_ALTAR_HINT)) { + //force marking the rewards as hinted if they are at the end of dungeons as they can be inffered + if (ctx->GetOption(RSK_SHUFFLE_DUNGEON_REWARDS).Is(RO_DUNGEON_REWARDS_END_OF_DUNGEON)){ + medallionLocs = FindItemsAndMarkHinted({RG_LIGHT_MEDALLION, RG_FOREST_MEDALLION, RG_FIRE_MEDALLION, RG_WATER_MEDALLION, RG_SPIRIT_MEDALLION, RG_SHADOW_MEDALLION}, + {}); + } else { + medallionLocs = FindItemsAndMarkHinted({RG_LIGHT_MEDALLION, RG_FOREST_MEDALLION, RG_FIRE_MEDALLION, RG_WATER_MEDALLION, RG_SPIRIT_MEDALLION, RG_SHADOW_MEDALLION}, + {RC_ALTAR_HINT_ADULT}); + } + } + ctx->AddHint(RH_ALTAR_ADULT, Hint(RH_ALTAR_ADULT, HINT_TYPE_ALTAR_ADULT, {}, medallionLocs)); + } +} + +void CreateStaticHintFromData(RandomizerHint hint, StaticHintInfo staticData){ + auto ctx = Rando::Context::GetInstance(); + if (!ctx->GetHint(hint)->IsEnabled()){ + Option option = ctx->GetOption(staticData.setting); + if ((std::holds_alternative(staticData.condition) && option.Is(std::get(staticData.condition))) || + (std::holds_alternative(staticData.condition) && option.Is(std::get(staticData.condition)))){ + std::vector locations = {}; + if (staticData.targetItems.size() > 0){ + locations = FindItemsAndMarkHinted(staticData.targetItems, staticData.hintChecks); + } + //hintKeys are defaulted to in the hint object and do not need to be specified + ctx->AddHint(hint, Hint(hint, staticData.type, {}, locations, {}, {}, staticData.yourPocket, staticData.num)); + } + } +} + +void CreateStaticItemHint(RandomizerHint hintKey, std::vector hintTextKeys, + std::vector items, std::vector hintChecks, bool yourPocket = false) { + auto ctx = Rando::Context::GetInstance(); + std::vector locations = FindItemsAndMarkHinted(items, hintChecks); + ctx->AddHint(hintKey, Hint(hintKey, HINT_TYPE_AREA, hintTextKeys, locations, {}, {}, yourPocket)); +} + +void CreateGanondorfJoke(){ + auto ctx = Rando::Context::GetInstance(); + if (!ctx->GetHint(RH_GANONDORF_JOKE)->IsEnabled()){ + ctx->AddHint(RH_GANONDORF_JOKE, Hint(RH_GANONDORF_JOKE, HINT_TYPE_HINT_KEY, {GetRandomGanonJoke()})); + } +} + +void CreateGanondorfHint(){ + auto ctx = Rando::Context::GetInstance(); + if (ctx->GetOption(RSK_GANONDORF_HINT) && !ctx->GetHint(RH_GANONDORF_HINT)->IsEnabled()){ + if (ctx->GetOption(RSK_SHUFFLE_MASTER_SWORD)) { + CreateStaticItemHint(RH_GANONDORF_HINT, {RHT_GANONDORF_HINT_LA_ONLY, RHT_GANONDORF_HINT_MS_ONLY, RHT_GANONDORF_HINT_LA_AND_MS}, + {RG_LIGHT_ARROWS, RG_MASTER_SWORD}, {RC_GANONDORF_HINT}, true); + } else { + CreateStaticItemHint(RH_GANONDORF_HINT, {RHT_GANONDORF_HINT_LA_ONLY}, {RG_LIGHT_ARROWS}, {RC_GANONDORF_HINT}, true); + } + } +} + +void CreateStaticHints(){ + CreateChildAltarHint(); + CreateAdultAltarHint(); + CreateGanondorfJoke(); + CreateGanondorfHint(); + for (auto[hint, staticData] : StaticData::staticHintInfoMap){ + CreateStaticHintFromData(hint, staticData); } - Text hintText = ::Hint(RHT_FROGS_HINT01).GetText() + itemText + ::Hint(RHT_FROGS_HINT02).GetText(); - RandomizerArea area = itemLoc->GetArea(); - itemLoc->SetAsHinted(); - ctx->AddHint(RH_FROGS, AutoFormatHintText(hintText, { QM_GREEN }), RC_ZR_FROGS_OCARINA_GAME, HINT_TYPE_STATIC, "Static", area); } void CreateAllHints(){ auto ctx = Rando::Context::GetInstance(); - CreateGanonAndSheikText(); - CreateAltarText(); - CreateSpecialItemHint(RG_PROGRESSIVE_HOOKSHOT, RH_DAMPES_DIARY, {RC_DAMPE_HINT}, RHT_DAMPE_DIARY01, RHT_DAMPE_DIARY02, (bool)ctx->GetOption(RSK_DAMPES_DIARY_HINT)); - CreateSpecialItemHint(RG_GREG_RUPEE, RH_GREG_RUPEE, {RC_GREG_HINT}, RHT_GREG_HINT01, RHT_GREG_HINT02, (bool)ctx->GetOption(RSK_GREG_HINT)); - CreateSpecialItemHint(RG_PROGRESSIVE_MAGIC_METER, RH_SARIA, {RC_SARIA_SONG_HINT, RC_SONG_FROM_SARIA}, RHT_SARIA_TEXT01, RHT_SARIA_TEXT02, (bool)ctx->GetOption(RSK_SARIA_HINT)); - CreateSpecialItemHint(RG_FISHING_POLE, RH_FISHING_POLE, {RC_FISHING_POLE_HINT}, RHT_FISHING_POLE_HINT01, RHT_FISHING_POLE_HINT02, (bool)ctx->GetOption(RSK_FISHING_POLE_HINT)); - if (ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ON_HINT)) { - CreateMerchantsHints(); - } - if (ctx->GetOption(RSK_FROGS_HINT)) { - CreateFrogsHint(); - } + CreateStaticHints(); + if (ctx->GetOption(RSK_GOSSIP_STONE_HINTS).IsNot(RO_GOSSIP_STONES_NONE)) { SPDLOG_INFO("Creating Hints..."); CreateStoneHints(); diff --git a/soh/soh/Enhancements/randomizer/3drando/hints.hpp b/soh/soh/Enhancements/randomizer/3drando/hints.hpp index ed23c1e9a..d111c78ca 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hints.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/hints.hpp @@ -1,12 +1,15 @@ #pragma once -#include #include #include +#include #include "text.hpp" #include "random.hpp" #include +#include "../randomizerTypes.h" +#include "../../custom-message/CustomMessageManager.h" + struct HintDistributionSetting { std::string name; HintType type; @@ -16,21 +19,8 @@ struct HintDistributionSetting { std::function filter; uint8_t dungeonLimit; - HintDistributionSetting(std::string _name, - HintType _type, - uint32_t _weight, - uint8_t _fixed, - uint8_t _copies, - std::function _filter, - uint8_t _dungeonLimit = 40){ - name = _name; - type = _type; - weight = _weight; - fixed = _fixed; - copies = _copies; - filter = _filter; - dungeonLimit = _dungeonLimit; - } + HintDistributionSetting(std::string _name, HintType _type, uint32_t _weight, uint8_t _fixed, uint8_t _copies, + std::function _filter, uint8_t _dungeonLimit = 40); }; struct HintSetting { @@ -40,185 +30,45 @@ struct HintSetting { std::vector distTable; }; -enum class HintCategory { - Item, - Always, - Sometimes, - Exclude, - Entrance, - Region, - Junk, - DungeonName, - Boss, - Bridge, - GanonsBossKey, - LACS, - Altar, - Validation, - OtherHint, - MasterSword, - GanonLine, - SheikLine, - MerchantsDialogs, -}; - class HintText { public: HintText() = default; - HintText(std::vector obscureText_, std::vector ambiguousText_, Text clearText_, HintCategory type_) - : obscureText(std::move(obscureText_)), - ambiguousText(std::move(ambiguousText_)), - clearText(std::move(clearText_)), - type(type_) { - } - - static auto Item(std::vector&& obscureText, std::vector&& ambiguousText = {}, Text&& clearText = {}) { - return HintText{std::move(obscureText), std::move(ambiguousText), std::move(clearText), HintCategory::Item}; - } - - static auto Always(std::vector&& obscureText, std::vector&& ambiguousText = {}, Text&& clearText = {}) { - return HintText{std::move(obscureText), std::move(ambiguousText), std::move(clearText), HintCategory::Always}; - } - - static auto Sometimes(std::vector&& obscureText, std::vector&& ambiguousText = {}, Text&& clearText = {}) { - return HintText{std::move(obscureText), std::move(ambiguousText), std::move(clearText), HintCategory::Sometimes}; - } - - static auto Exclude(std::vector&& obscureText, std::vector&& ambiguousText = {}, Text&& clearText = {}) { - return HintText{std::move(obscureText), std::move(ambiguousText), std::move(clearText), HintCategory::Exclude}; - } - - static auto Entrance(std::vector&& obscureText, std::vector&& ambiguousText = {}, Text&& clearText = {}) { - return HintText{std::move(obscureText), std::move(ambiguousText), std::move(clearText), HintCategory::Entrance}; - } - - static auto Region(std::vector&& obscureText, std::vector&& ambiguousText = {}, Text&& clearText = {}) { - return HintText{std::move(obscureText), std::move(ambiguousText), std::move(clearText), HintCategory::Region}; - } - - static auto Junk(std::vector&& obscureText, std::vector&& ambiguousText = {}, Text&& clearText = {}) { - return HintText{std::move(obscureText), std::move(ambiguousText), std::move(clearText), HintCategory::Junk}; - } - - static auto DungeonName(std::vector&& obscureText, std::vector&& ambiguousText = {}, Text&& clearText = {}) { - return HintText{std::move(obscureText), std::move(ambiguousText), std::move(clearText), HintCategory::DungeonName}; - } - - static auto Boss(std::vector&& obscureText, std::vector&& ambiguousText = {}, Text&& clearText = {}) { - return HintText{std::move(obscureText), std::move(ambiguousText), std::move(clearText), HintCategory::Boss}; - } - - static auto Bridge(std::vector&& obscureText, std::vector&& ambiguousText = {}, Text&& clearText = {}) { - return HintText{std::move(obscureText), std::move(ambiguousText), std::move(clearText), HintCategory::Bridge}; - } - - static auto GanonsBossKey(std::vector&& obscureText, std::vector&& ambiguousText = {}, Text&& clearText = {}) { - return HintText{std::move(obscureText), std::move(ambiguousText), std::move(clearText), HintCategory::GanonsBossKey}; - } - - static auto LACS(std::vector&& obscureText, std::vector&& ambiguousText = {}, Text&& clearText = {}) { - return HintText{std::move(obscureText), std::move(ambiguousText), std::move(clearText), HintCategory::LACS}; - } - - static auto Altar(std::vector&& obscureText, std::vector&& ambiguousText = {}, Text&& clearText = {}) { - return HintText{std::move(obscureText), std::move(ambiguousText), std::move(clearText), HintCategory::Altar}; - } - - static auto Validation(std::vector&& obscureText, std::vector&& ambiguousText = {}, Text&& clearText = {}) { - return HintText{std::move(obscureText), std::move(ambiguousText), std::move(clearText), HintCategory::Validation}; - } - - static auto OtherHint(std::vector&& obscureText, std::vector&& ambiguousText = {}, Text&& clearText = {}) { - return HintText{std::move(obscureText), std::move(ambiguousText), std::move(clearText), HintCategory::OtherHint}; - } - - static auto MasterSword(std::vector&& obscureText, std::vector&& ambiguousText = {}, Text&& clearText = {}) { - return HintText{std::move(obscureText), std::move(ambiguousText), std::move(clearText), HintCategory::MasterSword}; - } - - static auto GanonLine(std::vector&& obscureText, std::vector&& ambiguousText = {}, Text&& clearText = {}) { - return HintText{std::move(obscureText), std::move(ambiguousText), std::move(clearText), HintCategory::GanonLine}; - } - - static auto SheikLine(std::vector&& obscureText, std::vector&& ambiguousText = {}, Text&& clearText = {}) { - return HintText{std::move(obscureText), std::move(ambiguousText), std::move(clearText), HintCategory::SheikLine}; - } - - static auto MerchantsDialogs(std::vector&& obscureText, std::vector&& ambiguousText = {}, Text&& clearText = {}) { - return HintText{std::move(obscureText), std::move(ambiguousText), std::move(clearText), HintCategory::MerchantsDialogs}; - } - - Text& GetObscure() { - return RandomElement(obscureText); - } - - const Text& GetObscure() const { - return RandomElement(obscureText); - } - - Text& GetAmbiguous() { - if (ambiguousText.size() > 0) { - return RandomElement(ambiguousText); - } - return RandomElement(obscureText); - } - - const Text& GetAmbiguous() const { - if (ambiguousText.size() > 0) { - return RandomElement(ambiguousText); - } - return RandomElement(obscureText); - } - - const Text& GetClear() const { - if (clearText.GetEnglish().empty()) { - return GetObscure(); - } - return clearText; - } - - const Text& GetText() const; - - const Text GetTextCopy() const; - - HintCategory GetType() const { - return type; - } - - bool operator==(const HintText& right) const { - return obscureText == right.obscureText && - ambiguousText == right.ambiguousText && - clearText == right.clearText; - } - bool operator!=(const HintText& right) const { - return !operator==(right); - } + HintText(CustomMessage clearText_, std::vector ambiguousText_ = {}, std::vector obscureText_ = {}); + const CustomMessage& GetClear() const; + const CustomMessage& GetObscure() const; + const CustomMessage& GetObscure(uint8_t selection) const; + const CustomMessage& GetAmbiguous() const; + const CustomMessage& GetAmbiguous(uint8_t selection) const; + uint8_t GetAmbiguousSize() const; + uint8_t GetObscureSize() const; + const CustomMessage& GetHintMessage(uint8_t selection = 0) const; + const CustomMessage GetMessageCopy() const; + bool operator==(const HintText& right) const; + bool operator!=(const HintText& right) const; private: - std::vector obscureText = {}; - std::vector ambiguousText = {}; - Text clearText; - HintCategory type; + CustomMessage clearText; + std::vector ambiguousText = {}; + std::vector obscureText = {}; }; -using ConditionalAlwaysHint = std::pair>; +struct StaticHintInfo{ + HintType type; + std::vector hintKeys; + RandomizerSettingKey setting; + std::variant condition; + std::vector targetChecks; + std::vector targetItems; + std::vector hintChecks; + bool yourPocket; + int num; -typedef enum { - DUNGEON_NEITHER, - DUNGEON_BARREN, - DUNGEON_WOTH, -} DungeonHintInfo; - -//10 dungeons as GTG and GC are excluded -extern std::array dungeonInfoData; - -extern std::array conditionalAlwaysHints; + StaticHintInfo() = default; + StaticHintInfo(HintType _type, std::vector _hintKeys, RandomizerSettingKey _setting, std::variant _condition, + std::vector _targetChecks, std::vector _targetItems = {}, + std::vector _hintChecks = {}, bool _yourPocket = false, int _num = 0); +}; extern void CreateAllHints(); extern void CreateWarpSongTexts(); - -void SetGanonText(Text text); - -std::string GetMasterSwordHintLoc(); -std::string GetLightArrowHintLoc(); - +void CreateStaticHints(); \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access.hpp b/soh/soh/Enhancements/randomizer/3drando/location_access.hpp index 09fc5209e..82b3817bf 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access.hpp @@ -4,7 +4,6 @@ #include #include -#include "hint_list.hpp" #include "fill.hpp" #include "../randomizerTypes.h" #include "../context.h" diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_castle_town.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_castle_town.cpp index 874cc76c1..dacd8127e 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_castle_town.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_castle_town.cpp @@ -38,10 +38,10 @@ void AreaTable_Init_CastleTown() { EventAccess(&logic->GossipStoneFairy, {[]{return logic->GossipStoneFairy || logic->CanSummonGossipFairyWithoutSuns;}}), }, { //Locations - LocationAccess(RC_TOT_LEFT_GOSSIP_STONE, {[]{return true;}}), + LocationAccess(RC_TOT_LEFTMOST_GOSSIP_STONE, {[]{return true;}}), LocationAccess(RC_TOT_LEFT_CENTER_GOSSIP_STONE, {[]{return true;}}), LocationAccess(RC_TOT_RIGHT_CENTER_GOSSIP_STONE, {[]{return true;}}), - LocationAccess(RC_TOT_RIGHT_GOSSIP_STONE, {[]{return true;}}), + LocationAccess(RC_TOT_RIGHTMOST_GOSSIP_STONE, {[]{return true;}}), }, { //Exits Entrance(RR_THE_MARKET, {[]{return true;}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp index e91513b79..baa3cb0fc 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp @@ -32,12 +32,12 @@ void AreaTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_SHADOW_TRIAL, {[]{return true;}}), Entrance(RR_GANONS_CASTLE_SPIRIT_TRIAL, {[]{return true;}}), Entrance(RR_GANONS_CASTLE_LIGHT_TRIAL, {[]{return logic->CanUse(RG_GOLDEN_GAUNTLETS);}}), - Entrance(RR_GANONS_CASTLE_TOWER, {[]{return (logic->ForestTrialClear || randoCtx->GetTrial(Rando::FOREST_TRIAL)->IsSkipped()) && - (logic->FireTrialClear || randoCtx->GetTrial(Rando::FIRE_TRIAL)->IsSkipped()) && - (logic->WaterTrialClear || randoCtx->GetTrial(Rando::WATER_TRIAL)->IsSkipped()) && - (logic->ShadowTrialClear || randoCtx->GetTrial(Rando::SHADOW_TRIAL)->IsSkipped()) && - (logic->SpiritTrialClear || randoCtx->GetTrial(Rando::SPIRIT_TRIAL)->IsSkipped()) && - (logic->LightTrialClear || randoCtx->GetTrial(Rando::LIGHT_TRIAL)->IsSkipped());}}), + Entrance(RR_GANONS_CASTLE_TOWER, {[]{return (logic->ForestTrialClear || randoCtx->GetTrial(TK_FOREST_TRIAL)->IsSkipped()) && + (logic->FireTrialClear || randoCtx->GetTrial(TK_FIRE_TRIAL)->IsSkipped()) && + (logic->WaterTrialClear || randoCtx->GetTrial(TK_WATER_TRIAL)->IsSkipped()) && + (logic->ShadowTrialClear || randoCtx->GetTrial(TK_SHADOW_TRIAL)->IsSkipped()) && + (logic->SpiritTrialClear || randoCtx->GetTrial(TK_SPIRIT_TRIAL)->IsSkipped()) && + (logic->LightTrialClear || randoCtx->GetTrial(TK_LIGHT_TRIAL)->IsSkipped());}}), Entrance(RR_GANONS_CASTLE_DEKU_SCRUBS, {[]{return randoCtx->GetTrickOption(RT_LENS_GANON) || logic->CanUse(RG_LENS_OF_TRUTH);}}), }); @@ -134,12 +134,12 @@ void AreaTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_MQ_SHADOW_TRIAL, {[]{return true;}}), Entrance(RR_GANONS_CASTLE_MQ_SPIRIT_TRIAL, {[]{return true;}}), Entrance(RR_GANONS_CASTLE_MQ_LIGHT_TRIAL, {[]{return logic->CanUse(RG_GOLDEN_GAUNTLETS);}}), - Entrance(RR_GANONS_CASTLE_TOWER, {[]{return (logic->ForestTrialClear || randoCtx->GetTrial(Rando::FOREST_TRIAL)->IsSkipped()) && - (logic->FireTrialClear || randoCtx->GetTrial(Rando::FIRE_TRIAL)->IsSkipped()) && - (logic->WaterTrialClear || randoCtx->GetTrial(Rando::WATER_TRIAL)->IsSkipped()) && - (logic->ShadowTrialClear || randoCtx->GetTrial(Rando::SHADOW_TRIAL)->IsSkipped()) && - (logic->SpiritTrialClear || randoCtx->GetTrial(Rando::SPIRIT_TRIAL)->IsSkipped()) && - (logic->LightTrialClear || randoCtx->GetTrial(Rando::LIGHT_TRIAL)->IsSkipped());}}), + Entrance(RR_GANONS_CASTLE_TOWER, {[]{return (logic->ForestTrialClear || randoCtx->GetTrial(TK_FOREST_TRIAL)->IsSkipped()) && + (logic->FireTrialClear || randoCtx->GetTrial(TK_FIRE_TRIAL)->IsSkipped()) && + (logic->WaterTrialClear || randoCtx->GetTrial(TK_WATER_TRIAL)->IsSkipped()) && + (logic->ShadowTrialClear || randoCtx->GetTrial(TK_SHADOW_TRIAL)->IsSkipped()) && + (logic->SpiritTrialClear || randoCtx->GetTrial(TK_SPIRIT_TRIAL)->IsSkipped()) && + (logic->LightTrialClear || randoCtx->GetTrial(TK_LIGHT_TRIAL)->IsSkipped());}}), Entrance(RR_GANONS_CASTLE_MQ_DEKU_SCRUBS, {[]{return randoCtx->GetTrickOption(RT_LENS_GANON_MQ) || logic->CanUse(RG_LENS_OF_TRUTH);}}), }); diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp index 777154bab..8c3d6a5b1 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp @@ -34,7 +34,7 @@ void AreaTable_Init_HyruleField() { //Locations LocationAccess(RC_HF_SOUTHEAST_GROTTO_CHEST, {[]{return true;}}), LocationAccess(RC_HF_SOUTHEAST_GROTTO_FISH, {[]{return logic->HasBottle;}}), - LocationAccess(RC_HF_SOUTHEAST_GOSSIP_STONE, {[]{return true;}}), + LocationAccess(RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE, {[]{return true;}}), LocationAccess(RC_HF_SOUTHEAST_GROTTO_BEEHIVE_LEFT, {[]{return logic->CanBreakLowerBeehives;}}), LocationAccess(RC_HF_SOUTHEAST_GROTTO_BEEHIVE_RIGHT, {[]{return logic->CanBreakLowerBeehives;}}), }, { @@ -77,7 +77,7 @@ void AreaTable_Init_HyruleField() { //Locations LocationAccess(RC_HF_NEAR_MARKET_GROTTO_CHEST, {[]{return true;}}), LocationAccess(RC_HF_NEAR_MARKET_GROTTO_FISH, {[]{return logic->HasBottle;}}), - LocationAccess(RC_HF_NEAR_MARKET_GOSSIP_STONE, {[]{return true;}}), + LocationAccess(RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE, {[]{return true;}}), LocationAccess(RC_HF_NEAR_MARKET_GROTTO_BEEHIVE_LEFT, {[]{return logic->CanBreakLowerBeehives;}}), LocationAccess(RC_HF_NEAR_MARKET_GROTTO_BEEHIVE_RIGHT, {[]{return logic->CanBreakLowerBeehives;}}), }, { diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_kakariko.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_kakariko.cpp index 809a439f8..b33cc9381 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_kakariko.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_kakariko.cpp @@ -281,7 +281,7 @@ void AreaTable_Init_Kakariko() { EventAccess(&logic->GossipStoneFairy, {[]{return logic->GossipStoneFairy || logic->CanSummonGossipFairyWithoutSuns;}}), }, { //Locations - LocationAccess(RC_GY_GOSSIP_STONE, {[]{return true;}}), + LocationAccess(RC_GRAVEYARD_GOSSIP_STONE, {[]{return true;}}), }, { //Exits Entrance(RR_THE_GRAVEYARD, {[]{return true;}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp index 6dc417727..c7214d6ca 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp @@ -98,7 +98,7 @@ void AreaTable_Init_LostWoods() { //Locations LocationAccess(RC_KF_STORMS_GROTTO_CHEST, {[]{return true;}}), LocationAccess(RC_KF_STORMS_GROTTO_FISH, {[]{return logic->HasBottle;}}), - LocationAccess(RC_KF_STORMS_GOSSIP_STONE, {[]{return true;}}), + LocationAccess(RC_KF_STORMS_GROTTO_GOSSIP_STONE, {[]{return true;}}), LocationAccess(RC_KF_STORMS_GROTTO_BEEHIVE_LEFT, {[]{return logic->CanBreakLowerBeehives;}}), LocationAccess(RC_KF_STORMS_GROTTO_BEEHIVE_RIGHT, {[]{return logic->CanBreakLowerBeehives;}}), }, { @@ -168,7 +168,7 @@ void AreaTable_Init_LostWoods() { //Locations LocationAccess(RC_LW_NEAR_SHORTCUTS_GROTTO_CHEST, {[]{return true;}}), LocationAccess(RC_LW_NEAR_SHORTCUTS_GROTTO_FISH, {[]{return logic->HasBottle;}}), - LocationAccess(RC_LW_NEAR_SHORTCUTS_GOSSIP_STONE, {[]{return true;}}), + LocationAccess(RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE, {[]{return true;}}), LocationAccess(RC_LW_NEAR_SHORTCUTS_GROTTO_BEEHIVE_LEFT, {[]{return logic->CanBreakLowerBeehives;}}), LocationAccess(RC_LW_NEAR_SHORTCUTS_GROTTO_BEEHIVE_RIGHT, {[]{return logic->CanBreakLowerBeehives;}}), }, { diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp index c20667c47..dddad29a1 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp @@ -158,8 +158,8 @@ void AreaTable_Init_ZorasDomain() { LocationAccess(RC_ZF_GS_TREE, {[]{return logic->IsChild;}}), LocationAccess(RC_ZF_GS_ABOVE_THE_LOG, {[]{return logic->IsChild && logic->HookshotOrBoomerang && logic->AtNight && logic->CanGetNightTimeGS;}}), LocationAccess(RC_ZF_GS_HIDDEN_CAVE, {[]{return logic->CanUse(RG_SILVER_GAUNTLETS) && logic->CanBlastOrSmash && logic->HookshotOrBoomerang && logic->IsAdult && logic->AtNight && logic->CanGetNightTimeGS;}}), - LocationAccess(RC_FAIRY_GOSSIP_STONE, {[]{return true;}}), - LocationAccess(RC_JABU_GOSSIP_STONE, {[]{return true;}}), + LocationAccess(RC_ZF_FAIRY_GOSSIP_STONE, {[]{return true;}}), + LocationAccess(RC_ZF_JABU_GOSSIP_STONE, {[]{return true;}}), }, { //Exits Entrance(RR_ZD_BEHIND_KING_ZORA, {[]{return true;}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/rando_main.cpp b/soh/soh/Enhancements/randomizer/3drando/rando_main.cpp index 349995177..e3c757ba5 100644 --- a/soh/soh/Enhancements/randomizer/3drando/rando_main.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/rando_main.cpp @@ -1,5 +1,4 @@ #include "menu.hpp" -#include "hint_list.hpp" #include "../static_data.h" #include "../item_location.h" #include "location_access.hpp" @@ -12,7 +11,6 @@ void RandoMain::GenerateRando(std::set excludedLocations, std::set enabledTricks, std::string seedString) { - HintTable_Init(); // std::string settingsFileName = "./randomizer/latest_settings.json"; // CVarSetString("gLoadedPreset", settingsFileName.c_str()); diff --git a/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp b/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp index 3fdf56b60..1835dfe03 100644 --- a/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp @@ -38,7 +38,6 @@ using namespace Rando; json jsonData; std::map hintedLocations; -extern std::array hintTypeNames; extern std::array hintCategoryNames; extern Area* GetHintRegion(uint32_t); @@ -499,16 +498,7 @@ static void WriteRequiredTrials() { auto ctx = Rando::Context::GetInstance(); for (const auto& trial : ctx->GetTrials()->GetTrialList()) { if (trial->IsRequired()) { - std::string trialName; - switch (gSaveContext.language) { - case LANGUAGE_FRA: - trialName = trial->GetName().GetFrench(); - break; - case LANGUAGE_ENG: - default: - trialName = trial->GetName().GetEnglish(); - break; - } + std::string trialName = trial->GetName().GetForCurrentLanguage(MF_CLEAN); jsonData["requiredTrials"].push_back(RemoveLineBreaks(trialName)); } } @@ -553,117 +543,13 @@ Rando::ItemLocation* GetItemLocation(RandomizerGet item) { })[0]); } -// Writes the hints to the spoiler log, if they are enabled. -static void WriteHints() { - auto ctx = Rando::Context::GetInstance(); - - uint8_t language = ctx->GetOption(RSK_LANGUAGE).GetSelectedOptionIndex(); - - if (ctx->GetOption(RSK_SHUFFLE_WARP_SONGS)) { - jsonData["warpMinuetText"] = ctx->GetHint(RH_MINUET_WARP_LOC)->GetText().GetForLanguage(language); - jsonData["warpBoleroText"] = ctx->GetHint(RH_BOLERO_WARP_LOC)->GetText().GetForLanguage(language); - jsonData["warpSerenadeText"] = ctx->GetHint(RH_SERENADE_WARP_LOC)->GetText().GetForLanguage(language); - jsonData["warpRequiemText"] = ctx->GetHint(RH_REQUIEM_WARP_LOC)->GetText().GetForLanguage(language); - jsonData["warpNocturneText"] = ctx->GetHint(RH_NOCTURNE_WARP_LOC)->GetText().GetForLanguage(language); - jsonData["warpPreludeText"] = ctx->GetHint(RH_PRELUDE_WARP_LOC)->GetText().GetForLanguage(language); - } - jsonData["childAltar"]["hintText"] = ctx->GetHint(RH_ALTAR_CHILD)->GetText().GetForLanguage(language); - jsonData["adultAltar"]["hintText"] = ctx->GetHint(RH_ALTAR_ADULT)->GetText().GetForLanguage(language); - - Rando::ItemLocation* emeraldLoc = GetItemLocation(RG_KOKIRI_EMERALD); - Rando::ItemLocation* rubyLoc = GetItemLocation(RG_GORON_RUBY); - Rando::ItemLocation* sapphireLoc = GetItemLocation(RG_ZORA_SAPPHIRE); - std::string emeraldArea; - std::string erubyArea; - std::string sapphireArea; - - jsonData["childAltar"]["rewards"]["emeraldLoc"] = Rando::StaticData::GetLocation(emeraldLoc->GetRandomizerCheck())->GetName(); - jsonData["childAltar"]["rewards"]["rubyLoc"] = Rando::StaticData::GetLocation(rubyLoc->GetRandomizerCheck())->GetName(); - jsonData["childAltar"]["rewards"]["sapphireLoc"] = - Rando::StaticData::GetLocation(sapphireLoc->GetRandomizerCheck())->GetName(); - - Rando::ItemLocation* forestMedallionLoc = GetItemLocation(RG_FOREST_MEDALLION); - Rando::ItemLocation* fireMedallionLoc = GetItemLocation(RG_FIRE_MEDALLION); - Rando::ItemLocation* waterMedallionLoc = GetItemLocation(RG_WATER_MEDALLION); - Rando::ItemLocation* shadowMedallionLoc = GetItemLocation(RG_SHADOW_MEDALLION); - Rando::ItemLocation* spiritMedallionLoc = GetItemLocation(RG_SPIRIT_MEDALLION); - Rando::ItemLocation* lightMedallionLoc = GetItemLocation(RG_LIGHT_MEDALLION); - - jsonData["adultAltar"]["rewards"]["forestMedallionLoc"] = - Rando::StaticData::GetLocation(forestMedallionLoc->GetRandomizerCheck())->GetName(); - jsonData["adultAltar"]["rewards"]["fireMedallionLoc"] = - Rando::StaticData::GetLocation(fireMedallionLoc->GetRandomizerCheck())->GetName(); - jsonData["adultAltar"]["rewards"]["waterMedallionLoc"] = - Rando::StaticData::GetLocation(waterMedallionLoc->GetRandomizerCheck())->GetName(); - jsonData["adultAltar"]["rewards"]["shadowMedallionLoc"] = - Rando::StaticData::GetLocation(shadowMedallionLoc->GetRandomizerCheck())->GetName(); - jsonData["adultAltar"]["rewards"]["spiritMedallionLoc"] = - Rando::StaticData::GetLocation(spiritMedallionLoc->GetRandomizerCheck())->GetName(); - jsonData["adultAltar"]["rewards"]["lightMedallionLoc"] = - Rando::StaticData::GetLocation(lightMedallionLoc->GetRandomizerCheck())->GetName(); - - jsonData["ganonText"] = ctx->GetHint(RH_GANONDORF_NOHINT)->GetText().GetForLanguage(language); - if (ctx->GetOption(RSK_LIGHT_ARROWS_HINT)){ - jsonData["ganonHintText"] = ctx->GetHint(RH_GANONDORF_HINT)->GetText().GetForLanguage(language); - jsonData["lightArrowHintLoc"] = GetLightArrowHintLoc(); - jsonData["lightArrowArea"] = ::Hint(ctx->GetHint(RH_GANONDORF_HINT)->GetHintedArea()).GetText().GetEnglish(); - jsonData["masterSwordHintLoc"] = GetMasterSwordHintLoc(); - if (!ctx->GetOption(RSK_TRIAL_COUNT).Is(0)) { - jsonData["sheikText"] = ctx->GetHint(RH_SHEIK_LIGHT_ARROWS)->GetText().GetForLanguage(language); - } - } - if (ctx->GetOption(RSK_DAMPES_DIARY_HINT)){ - jsonData["dampeText"] = ctx->GetHint(RH_DAMPES_DIARY)->GetText().GetForLanguage(language); - jsonData["dampeHintLoc"] = Rando::StaticData::GetLocation(ctx->GetHint(RH_DAMPES_DIARY)->GetHintedLocation())->GetName(); - jsonData["dampeRegion"] = ::Hint(ctx->GetHint(RH_DAMPES_DIARY)->GetHintedArea()).GetText().GetEnglish(); - } - if (ctx->GetOption(RSK_GREG_HINT)){ - jsonData["gregText"] = ctx->GetHint(RH_GREG_RUPEE)->GetText().GetForLanguage(language); - jsonData["gregLoc"] = Rando::StaticData::GetLocation(ctx->GetHint(RH_GREG_RUPEE)->GetHintedLocation())->GetName(); - jsonData["gregRegion"] = ::Hint(ctx->GetHint(RH_GREG_RUPEE)->GetHintedArea()).GetText().GetEnglish(); - } - if (ctx->GetOption(RSK_SARIA_HINT)){ - jsonData["sariaText"] = ctx->GetHint(RH_SARIA)->GetText().GetForLanguage(language); - jsonData["sariaHintLoc"] = Rando::StaticData::GetLocation(ctx->GetHint(RH_SARIA)->GetHintedLocation())->GetName(); - jsonData["sariaRegion"] = ::Hint(ctx->GetHint(RH_SARIA)->GetHintedArea()).GetText().GetEnglish(); - } - if (ctx->GetOption(RSK_FISHING_POLE_HINT)) { - jsonData["fishingPoleText"] = ctx->GetHint(RH_FISHING_POLE)->GetText().GetForLanguage(language); - jsonData["fishingPoleHintLoc"] = Rando::StaticData::GetLocation(ctx->GetHint(RH_FISHING_POLE)->GetHintedLocation())->GetName(); - jsonData["fishingPoleRegion"] = ::Hint(ctx->GetHint(RH_FISHING_POLE)->GetHintedArea()).GetText().GetEnglish(); - } - - if (ctx->GetOption(RSK_GOSSIP_STONE_HINTS).Is(RO_GOSSIP_STONES_NONE)) { - return; - } - for (const RandomizerCheck key : Rando::StaticData::gossipStoneLocations) { //RANDOTODO should be merged with static hints, iterate over hint keys - Rando::Hint* hint = ctx->GetHint((RandomizerHintKey)(key - RC_COLOSSUS_GOSSIP_STONE + 1)); - Rando::ItemLocation* hintedLocation = ctx->GetItemLocation(hint->GetHintedLocation()); - std::string hintTextString = hint->GetText().GetForLanguage(language); - HintType hintType = hint->GetHintType(); - - std::string textStr = hintTextString; - std::string name = Rando::StaticData::GetLocation(key)->GetName(); - jsonData["hints"][name]["hint"] = textStr; - jsonData["hints"][name]["distribution"] = hint->GetDistribution(); - jsonData["hints"][name]["type"] = hintTypeNames[(int)hintType]; - if (hintType == HINT_TYPE_ITEM_LOCATION || hintType == HINT_TYPE_ITEM_AREA || hintType == HINT_TYPE_WOTH) { - jsonData["hints"][name]["item"] = hintedLocation->GetPlacedItemName().GetEnglish(); - jsonData["hints"][name]["location"] = Rando::StaticData::GetLocation(hintedLocation->GetRandomizerCheck())->GetName(); - } - if (hintType != HINT_TYPE_TRIAL && hintType != HINT_TYPE_JUNK) { - jsonData["hints"][name]["area"] = ::Hint(hint->GetHintedArea()).GetText().Capitalize().GetEnglish(); - } - } -} - static void WriteAllLocations() { auto ctx = Rando::Context::GetInstance(); for (const RandomizerCheck key : ctx->allLocations) { Rando::ItemLocation* location = ctx->GetItemLocation(key); std::string placedItemName; - switch (ctx->GetOption(RSK_LANGUAGE).GetSelectedOptionIndex()) { + switch (gSaveContext.language) { case 0: default: placedItemName = location->GetPlacedItemName().english; @@ -689,12 +575,12 @@ static void WriteAllLocations() { jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()]["price"] = location->GetPrice(); } - if (location->IsHintedAt()) { + if (location->IsAHintAccessible()) { hintedLocations.emplace(Rando::StaticData::GetLocation(key)->GetHintKey(), location); } if (location->GetPlacedRandomizerGet() == RG_ICE_TRAP) { - switch (ctx->GetOption(RSK_LANGUAGE).GetSelectedOptionIndex()) { + switch (gSaveContext.language) { case 0: default: jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()]["model"] = @@ -737,7 +623,7 @@ const char* SpoilerLog_Write() { WriteSettings(); WriteExcludedLocations(); WriteStartingInventory(); - WriteEnabledTricks(spoilerLog); + WriteEnabledTricks(spoilerLog); //RANDOTODO clean up spoilerLog refernces //if (Settings::Logic.Is(LOGIC_GLITCHED)) { // WriteEnabledGlitches(spoilerLog); //} @@ -748,7 +634,7 @@ const char* SpoilerLog_Write() { ctx->playthroughLocations.clear(); ctx->playthroughBeatable = false; - WriteHints(); + ctx->WriteHintJson(jsonData); WriteShuffledEntrances(); WriteAllLocations(); diff --git a/soh/soh/Enhancements/randomizer/3drando/text.hpp b/soh/soh/Enhancements/randomizer/3drando/text.hpp index 49e598f63..46c0196bb 100644 --- a/soh/soh/Enhancements/randomizer/3drando/text.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/text.hpp @@ -1,7 +1,7 @@ #pragma once #include -#include "z64.h" +#include #define PLURAL 0 #define SINGULAR 1 @@ -54,11 +54,11 @@ public: const std::string& GetForLanguage(uint8_t language) const { switch (language) { - case LANGUAGE_ENG: + case 0: //LANGUAGE_ENG: changed to resolve #include loops return GetEnglish(); - case LANGUAGE_FRA: + case 2: //LANGUAGE_FRA: return GetFrench(); - case LANGUAGE_GER: + case 1: //LANGUAGE_GER: return GetGerman(); default: return GetEnglish(); @@ -97,6 +97,29 @@ public: } } + void Replace(std::string oldStr, Text newText) { + size_t position = english.find(oldStr); + while (position != std::string::npos) { + english.replace(position, oldStr.length(), newText.GetEnglish()); + position = english.find(oldStr); + } + position = french.find(oldStr); + while (position != std::string::npos) { + french.replace(position, oldStr.length(), newText.GetFrench()); + position = french.find(oldStr); + } + position = spanish.find(oldStr); + while (position != std::string::npos) { + spanish.replace(position, oldStr.length(), newText.GetSpanish()); + position = spanish.find(oldStr); + } + position = german.find(oldStr); + while (position != std::string::npos) { + german.replace(position, oldStr.length(), newText.GetGerman()); + position = german.find(oldStr); + } + } + // Convert first char to upper case Text Capitalize(void) const { Text cap = *this + ""; diff --git a/soh/soh/Enhancements/randomizer/context.cpp b/soh/soh/Enhancements/randomizer/context.cpp index 3f5e09db3..35c856d60 100644 --- a/soh/soh/Enhancements/randomizer/context.cpp +++ b/soh/soh/Enhancements/randomizer/context.cpp @@ -5,11 +5,11 @@ #include "3drando/shops.hpp" #include "dungeon.h" #include "logic.h" -#include "trial.h" #include "entrance.h" #include "settings.h" #include "rando_hash.h" #include "fishsanity.h" +#include "3drando/hints.hpp" #include #include @@ -20,56 +20,6 @@ namespace Rando { std::weak_ptr Context::mContext; Context::Context() { - mSpoilerfileHintTypeNameToEnum = { - { "Static", HINT_TYPE_STATIC }, - { "Trial", HINT_TYPE_TRIAL }, - { "WotH", HINT_TYPE_WOTH }, - { "Barren", HINT_TYPE_BARREN }, - { "Entrance", HINT_TYPE_ENTRANCE }, - { "Item Area", HINT_TYPE_ITEM_AREA }, - { "Item Location", HINT_TYPE_ITEM_LOCATION }, - { "Junk", HINT_TYPE_JUNK }, - }; - - mSpoilerfileAreaNameToEnum = { - {"No Hint", RA_NONE}, - {"Link's Pocket", RA_LINKS_POCKET}, - {"Kokiri Forest", RA_KOKIRI_FOREST}, - {"The Lost Woods", RA_THE_LOST_WOODS}, - {"Sacred Forest Meadow", RA_SACRED_FOREST_MEADOW}, - {"Hyrule Field", RA_HYRULE_FIELD}, - {"Lake Hylia", RA_LAKE_HYLIA}, - {"Gerudo Valley", RA_GERUDO_VALLEY}, - {"Gerudo Fortress", RA_GERUDO_FORTRESS}, - {"Haunted Wasteland", RA_HAUNTED_WASTELAND}, - {"Desert Colossus", RA_DESERT_COLOSSUS}, - {"The Market", RA_THE_MARKET}, - {"Temple of Time", RA_TEMPLE_OF_TIME}, - {"Hyrule Castle", RA_HYRULE_CASTLE}, - {"Outside Ganon's Castle", RA_OUTSIDE_GANONS_CASTLE}, - {"Castle Grounds", RA_CASTLE_GROUNDS}, - {"Kakariko Village", RA_KAKARIKO_VILLAGE}, - {"the Graveyard", RA_THE_GRAVEYARD}, - {"Death Mountain Trail", RA_DEATH_MOUNTAIN_TRAIL}, - {"Goron City", RA_GORON_CITY}, - {"Death Mountain Crater", RA_DEATH_MOUNTAIN_CRATER}, - {"Zora's River", RA_ZORAS_RIVER}, - {"Zora's Domain", RA_ZORAS_DOMAIN}, - {"Zora's Fountain", RA_ZORAS_FOUNTAIN}, - {"Lon Lon Ranch", RA_LON_LON_RANCH}, - {"Deku Tree", RA_DEKU_TREE}, - {"Dodongo's Cavern", RA_DODONGOS_CAVERN}, - {"Jabu-Jabu's Belly", RA_JABU_JABUS_BELLY}, - {"Forest Temple", RA_FOREST_TEMPLE}, - {"Fire Temple", RA_FIRE_TEMPLE}, - {"Water Temple", RA_WATER_TEMPLE}, - {"Spirit Temple", RA_SPIRIT_TEMPLE}, - {"Shadow Temple", RA_SHADOW_TEMPLE}, - {"Bottom of the Well", RA_BOTTOM_OF_THE_WELL}, - {"Ice Cavern", RA_ICE_CAVERN}, - {"Gerudo training Grounds", RA_GERUDO_TRAINING_GROUND}, - {"Inside Ganon's Castle", RA_GANONS_CASTLE}, - }; for (int i = 0; i < RC_MAX; i++) { itemLocationTable[i] = ItemLocation(static_cast(i)); @@ -83,11 +33,15 @@ Context::Context() { } RandomizerArea Context::GetAreaFromString(std::string str) { - return mSpoilerfileAreaNameToEnum[str]; + return (RandomizerArea)StaticData::areaNameToEnum[str]; } void Context::InitStaticData() { - StaticData::InitItemTable(); + StaticData::HintTable_Init(); + StaticData::trialNameToEnum = StaticData::PopulateTranslationMap(StaticData::trialData); + StaticData::hintNameToEnum = StaticData::PopulateTranslationMap(StaticData::hintNames); + StaticData::hintTypeNameToEnum = StaticData::PopulateTranslationMap(StaticData::hintTypeNames); + StaticData::areaNameToEnum = StaticData::PopulateTranslationMap(StaticData::areaNames); StaticData::InitLocationTable(); } @@ -104,14 +58,12 @@ std::shared_ptr Context::GetInstance() { return mContext.lock(); } -Hint* Context::GetHint(const RandomizerHintKey hintKey) { +Hint* Context::GetHint(const RandomizerHint hintKey) { return &hintTable[hintKey]; } -void Context::AddHint(const RandomizerHintKey hintId, const Text& text, const RandomizerCheck hintedLocation, const HintType hintType, - std::string distributionName, RandomizerArea hintedArea) { - hintTable[hintId] = Hint(text, hintedLocation, hintType, distributionName, hintedArea); - GetItemLocation(hintedLocation)->AddHintedBy(hintId); +void Context::AddHint(const RandomizerHint hintId, const Hint hint) { + hintTable[hintId] = hint; //RANDOTODO this should probably be an rvalue } ItemLocation* Context::GetItemLocation(const RandomizerCheck locKey) { @@ -222,7 +174,7 @@ std::vector Context::GetLocations(const std::vector(i))->ResetVariables(); } } @@ -250,7 +202,7 @@ void Context::LocationReset() { GetItemLocation(il)->RemoveFromPool(); } - for (const RandomizerCheck il : StaticData::otherHintLocations) { + for (const RandomizerCheck il : StaticData::staticHintLocations) { GetItemLocation(il)->RemoveFromPool(); } } @@ -258,7 +210,9 @@ void Context::LocationReset() { void Context::HintReset() { for (const RandomizerCheck il : StaticData::gossipStoneLocations) { GetItemLocation(il)->ResetVariables(); - GetHint(static_cast(il - RC_COLOSSUS_GOSSIP_STONE + 1))->ResetVariables(); + } + for (Hint& hint : hintTable){ + hint.ResetVariables(); } } @@ -393,126 +347,52 @@ void Context::ParseHashIconIndexesJson(nlohmann::json spoilerFileJson) { void Context::ParseItemLocationsJson(nlohmann::json spoilerFileJson) { nlohmann::json locationsJson = spoilerFileJson["locations"]; for (auto it = locationsJson.begin(); it != locationsJson.end(); ++it) { - RandomizerCheck rc = StaticData::SpoilerfileCheckNameToEnum[it.key()]; + RandomizerCheck rc = StaticData::locationNameToEnum[it.key()]; if (it->is_structured()) { nlohmann::json itemJson = *it; for (auto itemit = itemJson.begin(); itemit != itemJson.end(); ++itemit) { if (itemit.key() == "item") { - itemLocationTable[rc].SetPlacedItem(StaticData::SpoilerfileItemNameToEnum[itemit.value().get()]); + itemLocationTable[rc].SetPlacedItem(StaticData::itemNameToEnum[itemit.value().get()]); } else if (itemit.key() == "price") { itemLocationTable[rc].SetCustomPrice(itemit.value().get()); } else if (itemit.key() == "model") { - overrides[rc] = ItemOverride(rc, StaticData::SpoilerfileItemNameToEnum[itemit.value().get()]); + overrides[rc] = ItemOverride(rc, StaticData::itemNameToEnum[itemit.value().get()]); } else if (itemit.key() == "trickName") { overrides[rc].SetTrickName(Text(itemit.value().get())); } } } else { - itemLocationTable[rc].SetPlacedItem(StaticData::SpoilerfileItemNameToEnum[it.value().get()]); + itemLocationTable[rc].SetPlacedItem(StaticData::itemNameToEnum[it.value().get()]); } } } +void Context::WriteHintJson(nlohmann::ordered_json& spoilerFileJson){ + for (Hint hint: hintTable){ + hint.logHint(spoilerFileJson); + } +} + +nlohmann::json getValueForMessage(std::unordered_map map, CustomMessage message){ + std::vector strings = message.GetAllMessages(); + for (uint8_t language = 0; language < LANGUAGE_MAX; language++){ + if (map.contains(strings[language])){ + return strings[language]; + } + } + return {}; +} + void Context::ParseHintJson(nlohmann::json spoilerFileJson) { - // Child Altar - std::string childAltarText = spoilerFileJson["childAltar"]["hintText"].get(); - AddHint(RH_ALTAR_CHILD, Text(childAltarText), RC_UNKNOWN_CHECK, HINT_TYPE_STATIC, "Static", RA_NONE); - mEmeraldLoc = StaticData::SpoilerfileCheckNameToEnum[spoilerFileJson["childAltar"]["rewards"]["emeraldLoc"]]; - mRubyLoc = StaticData::SpoilerfileCheckNameToEnum[spoilerFileJson["childAltar"]["rewards"]["rubyLoc"]]; - mSapphireLoc = StaticData::SpoilerfileCheckNameToEnum[spoilerFileJson["childAltar"]["rewards"]["sapphireLoc"]]; - - // Adult Altar - std::string adultAltarText = spoilerFileJson["adultAltar"]["hintText"].get(); - AddHint(RH_ALTAR_ADULT, Text(adultAltarText), RC_UNKNOWN_CHECK, HINT_TYPE_STATIC, "Static", RA_NONE); - mForestMedallionLoc = StaticData::SpoilerfileCheckNameToEnum[spoilerFileJson["adultAltar"]["rewards"]["forestMedallionLoc"].get()]; - mFireMedallionLoc = StaticData::SpoilerfileCheckNameToEnum[spoilerFileJson["adultAltar"]["rewards"]["fireMedallionLoc"].get()]; - mWaterMedallionLoc = StaticData::SpoilerfileCheckNameToEnum[spoilerFileJson["adultAltar"]["rewards"]["waterMedallionLoc"].get()]; - mShadowMedallionLoc = StaticData::SpoilerfileCheckNameToEnum[spoilerFileJson["adultAltar"]["rewards"]["shadowMedallionLoc"].get()]; - mSpiritMedallionLoc = StaticData::SpoilerfileCheckNameToEnum[spoilerFileJson["adultAltar"]["rewards"]["spiritMedallionLoc"].get()]; - mLightMedallionLoc = StaticData::SpoilerfileCheckNameToEnum[spoilerFileJson["adultAltar"]["rewards"]["lightMedallionLoc"].get()]; - - // Ganondorf and Sheik Light Arrow Hints - std::string ganonHintText = spoilerFileJson["ganonHintText"].get(); - RandomizerCheck lightArrowLoc = StaticData::SpoilerfileCheckNameToEnum[spoilerFileJson["lightArrowHintLoc"].get()]; - std::string lightArrowRegion = spoilerFileJson["lightArrowArea"].get(); - AddHint(RH_GANONDORF_HINT, Text(ganonHintText), lightArrowLoc, HINT_TYPE_STATIC, "Static", mSpoilerfileAreaNameToEnum[lightArrowRegion]); - if (spoilerFileJson.contains("sheikText")) { - std::string sheikText = spoilerFileJson["sheikText"].get(); - AddHint(RH_SHEIK_LIGHT_ARROWS, Text(sheikText), lightArrowLoc, HINT_TYPE_STATIC, lightArrowRegion); + for (auto hintData : spoilerFileJson["Gossip Stone Hints"].items()){ + RandomizerHint hint = (RandomizerHint)StaticData::hintNameToEnum[hintData.key()]; + AddHint(hint, Hint(hint, hintData.value())); } - std::string ganonText = spoilerFileJson["ganonText"].get(); - AddHint(RH_GANONDORF_NOHINT, Text(ganonText), RC_UNKNOWN_CHECK, HINT_TYPE_JUNK, "Static", RA_GANONS_CASTLE); - - // Dampe Hookshot Hint - if (spoilerFileJson.contains("dampeText")) { - std::string dampeText = spoilerFileJson["dampeText"].get(); - std::string dampeRegion = spoilerFileJson["dampeRegion"].get(); - RandomizerCheck dampeHintLoc = StaticData::SpoilerfileCheckNameToEnum[spoilerFileJson["dampeHintLoc"].get()]; - AddHint(RH_DAMPES_DIARY, Text(dampeText), dampeHintLoc, HINT_TYPE_STATIC, "Static", mSpoilerfileAreaNameToEnum[dampeRegion]); - } - - // Greg Hint - if (spoilerFileJson.contains("gregText")) { - std::string gregText = spoilerFileJson["gregText"].get(); - std::string gregRegion = spoilerFileJson["gregRegion"].get(); - RandomizerCheck gregLoc = StaticData::SpoilerfileCheckNameToEnum[spoilerFileJson["gregLoc"].get()]; - AddHint(RH_GREG_RUPEE, Text(gregText), gregLoc, HINT_TYPE_STATIC, "Static", mSpoilerfileAreaNameToEnum[gregRegion]); - } - - // Saria Magic Hint - if (spoilerFileJson.contains("sariaText")) { - std::string sariaText = spoilerFileJson["sariaText"].get(); - std::string sariaRegion = spoilerFileJson["sariaRegion"].get(); - RandomizerCheck sariaHintLoc = StaticData::SpoilerfileCheckNameToEnum[spoilerFileJson["sariaHintLoc"].get()]; - AddHint(RH_SARIA, Text(sariaText), sariaHintLoc, HINT_TYPE_STATIC, "Static", mSpoilerfileAreaNameToEnum[sariaRegion]); - } - - // Fishing Pole Hint - if(spoilerFileJson.contains("fishingPoleText")) { - std::string fishingPoleText = spoilerFileJson["fishingPoleText"].get(); - std::string fishingPoleRegion = spoilerFileJson["fishingPoleRegion"].get(); - RandomizerCheck fishingPoleHintLoc = StaticData::SpoilerfileCheckNameToEnum[spoilerFileJson["fishingPoleHintLoc"].get()]; - AddHint(RH_FISHING_POLE, Text(fishingPoleText), fishingPoleHintLoc, HINT_TYPE_STATIC, "Static", mSpoilerfileAreaNameToEnum[fishingPoleRegion]); - } - - // Warp Songs - if (spoilerFileJson.contains("warpMinuetText")) { - std::string warpMinuetText = spoilerFileJson["warpMinuetText"].get(); //RANDOTODO fall back for if location is used - AddHint(RH_MINUET_WARP_LOC, Text(warpMinuetText), RC_UNKNOWN_CHECK, HINT_TYPE_STATIC, "Static", mSpoilerfileAreaNameToEnum[warpMinuetText]); - } - if (spoilerFileJson.contains("warpBoleroText")) { - std::string warpBoleroText = spoilerFileJson["warpBoleroText"].get(); - AddHint(RH_BOLERO_WARP_LOC, Text(warpBoleroText), RC_UNKNOWN_CHECK, HINT_TYPE_STATIC, "Static", mSpoilerfileAreaNameToEnum[warpBoleroText]); - } - if (spoilerFileJson.contains("warpSerenadeText")) { - std::string warpSerenadeText = spoilerFileJson["warpSerenadeText"].get(); - AddHint(RH_SERENADE_WARP_LOC, Text(warpSerenadeText), RC_UNKNOWN_CHECK, HINT_TYPE_STATIC, "Static", mSpoilerfileAreaNameToEnum[warpSerenadeText]); - } - if (spoilerFileJson.contains("warpRequiemText")) { - std::string warpRequiemText = spoilerFileJson["warpRequiemText"].get(); - AddHint(RH_REQUIEM_WARP_LOC, Text(warpRequiemText), RC_UNKNOWN_CHECK, HINT_TYPE_STATIC, "Static", mSpoilerfileAreaNameToEnum[warpRequiemText]); - } - if (spoilerFileJson.contains("warpNocturneText")) { - std::string warpNocturneText = spoilerFileJson["warpNocturneText"].get(); - AddHint(RH_NOCTURNE_WARP_LOC, Text(warpNocturneText), RC_UNKNOWN_CHECK, HINT_TYPE_STATIC, "Static", mSpoilerfileAreaNameToEnum[warpNocturneText]); - } - if (spoilerFileJson.contains("warpPreludeText")) { - std::string warpPreludeText = spoilerFileJson["warpPreludeText"].get(); - AddHint(RH_PRELUDE_WARP_LOC, Text(warpPreludeText), RC_UNKNOWN_CHECK, HINT_TYPE_STATIC, "Static", mSpoilerfileAreaNameToEnum[warpPreludeText]); - } - - // Gossip Stones - nlohmann::json hintsJson = spoilerFileJson["hints"]; - for (auto it = hintsJson.begin(); it != hintsJson.end(); ++it) { - RandomizerCheck gossipStoneLoc = StaticData::SpoilerfileCheckNameToEnum[it.key()]; - nlohmann::json hintInfo = it.value(); - std::string hintText = hintInfo["hint"].get(); - HintType hintType = mSpoilerfileHintTypeNameToEnum[hintInfo["type"].get()]; - RandomizerCheck hintedLocation = hintInfo.contains("location") ? StaticData::SpoilerfileCheckNameToEnum[hintInfo["location"]] : RC_UNKNOWN_CHECK; - RandomizerArea hintedArea = hintInfo.contains("area") ? mSpoilerfileAreaNameToEnum[hintInfo["area"].get()] : RA_NONE; - std::string distribution = hintInfo["distribution"].get(); - AddHint(static_cast(gossipStoneLoc - RC_COLOSSUS_GOSSIP_STONE + 1), Text(hintText), hintedLocation, hintType, distribution, hintedArea); + for (auto hintData : spoilerFileJson["Static Hints"].items()){ + RandomizerHint hint = (RandomizerHint)StaticData::hintNameToEnum[hintData.key()]; + AddHint(hint, Hint(hint, hintData.value())); } + CreateStaticHints(); } std::shared_ptr Context::GetSettings() { @@ -554,6 +434,10 @@ TrialInfo* Context::GetTrial(size_t key) const { return mTrials->GetTrial(static_cast(key)); } +TrialInfo* Context::GetTrial(TrialKey key) const { + return mTrials->GetTrial(key); +} + Sprite* Context::GetSeedTexture(const uint8_t index) { return &gSeedTextures[index]; } diff --git a/soh/soh/Enhancements/randomizer/context.h b/soh/soh/Enhancements/randomizer/context.h index 06dd44628..2deb4e365 100644 --- a/soh/soh/Enhancements/randomizer/context.h +++ b/soh/soh/Enhancements/randomizer/context.h @@ -7,6 +7,7 @@ #include "3drando/text.hpp" #include "hint.h" #include "fishsanity.h" +#include "trial.h" #include #include @@ -36,9 +37,8 @@ class Context { static std::shared_ptr CreateInstance(); static std::shared_ptr GetInstance(); void InitStaticData(); - Hint* GetHint(RandomizerHintKey hintKey); - void AddHint(RandomizerHintKey hintId, const Text& text, RandomizerCheck hintedLocation, HintType hintType, std::string distributionName, - RandomizerArea hintedArea = RA_NONE); + Hint* GetHint(RandomizerHint hintKey); + void AddHint(const RandomizerHint hintId, const Hint hint); ItemLocation* GetItemLocation(RandomizerCheck locKey); ItemLocation* GetItemLocation(size_t locKey); ItemOverride& GetItemOverride(RandomizerCheck locKey); @@ -73,6 +73,7 @@ class Context { void ResetLogic(); std::shared_ptr GetTrials(); TrialInfo* GetTrial(size_t key) const; + TrialInfo* GetTrial(TrialKey key) const; static Sprite* GetSeedTexture(uint8_t index); Option& GetOption(RandomizerSettingKey key) const; TrickOption& GetTrickOption(RandomizerTrick key) const; @@ -80,6 +81,7 @@ class Context { void ParseSpoiler(const char* spoilerFileName, bool plandoMode); void ParseHashIconIndexesJson(nlohmann::json spoilerFileJson); void ParseItemLocationsJson(nlohmann::json spoilerFileJson); + void WriteHintJson(nlohmann::ordered_json& spoilerFileJson); void ParseHintJson(nlohmann::json spoilerFileJson); std::map overrides = {}; std::vector> playthroughLocations = {}; @@ -93,18 +95,7 @@ class Context { private: static std::weak_ptr mContext; - std::unordered_map mSpoilerfileHintTypeNameToEnum; - std::unordered_map mSpoilerfileAreaNameToEnum; std::array hintTable = {}; - RandomizerCheck mEmeraldLoc = RC_UNKNOWN_CHECK; - RandomizerCheck mRubyLoc = RC_UNKNOWN_CHECK; - RandomizerCheck mSapphireLoc = RC_UNKNOWN_CHECK; - RandomizerCheck mForestMedallionLoc = RC_UNKNOWN_CHECK; - RandomizerCheck mFireMedallionLoc = RC_UNKNOWN_CHECK; - RandomizerCheck mWaterMedallionLoc = RC_UNKNOWN_CHECK; - RandomizerCheck mShadowMedallionLoc = RC_UNKNOWN_CHECK; - RandomizerCheck mSpiritMedallionLoc = RC_UNKNOWN_CHECK; - RandomizerCheck mLightMedallionLoc = RC_UNKNOWN_CHECK; std::array itemLocationTable = {}; std::shared_ptr mSettings; std::shared_ptr mEntranceShuffler; diff --git a/soh/soh/Enhancements/randomizer/hint.cpp b/soh/soh/Enhancements/randomizer/hint.cpp index ff9dfdf81..7d62d29c7 100644 --- a/soh/soh/Enhancements/randomizer/hint.cpp +++ b/soh/soh/Enhancements/randomizer/hint.cpp @@ -1,56 +1,729 @@ #include "hint.h" +#include "map" +#include "string" +#include "context.h" +#include +#include "static_data.h" namespace Rando { -Hint::Hint() : text(std::move(Text())) {} -Hint::Hint(Text text_): text(std::move(text_)) {} -Hint::Hint(Text text_, RandomizerCheck hintedLocation_, HintType hintType_, std::string distributionName_, RandomizerArea hintedArea_) - : text(std::move(text_)), hintedLocation(hintedLocation_), hintType(hintType_), - hintedArea(hintedArea_), distribution(std::move(distributionName_)) { +Hint::Hint(){} + +Hint::Hint(RandomizerHint ownKey_, + HintType hintType_, + std::string distribution_, + std::vector hintKeys_, + std::vector locations_, + std::vector areas_, + std::vector trials_) + : ownKey(ownKey_), hintType(hintType_), distribution(std::move(distribution_)), hintKeys(hintKeys_), locations(locations_), areas(areas_), trials(trials_) { + FillGapsInData(); + SetLocationsAsHinted(); + NamesChosen(); + enabled = true; } -const Text& Hint::GetText() const { - return text; +Hint::Hint(RandomizerHint ownKey_, + HintType hintType_, + std::vector hintKeys_, + std::vector locations_, + std::vector areas_, + std::vector trials_, + bool yourPocket_, + int num_) + : ownKey(ownKey_), hintType(hintType_), hintKeys(hintKeys_), locations(locations_), areas(areas_), trials(trials_), yourPocket(yourPocket_), num(num_) { + FillGapsInData(); + SetLocationsAsHinted(); + NamesChosen(); + enabled = true; } -void Hint::SetHintedLocation(RandomizerCheck location) { - hintedLocation = location; +Hint::Hint(RandomizerHint ownKey_, std::vector messages_) +: ownKey(ownKey_), messages(messages_){ + hintType = HINT_TYPE_MESSAGE; + enabled = true; } -RandomizerCheck Hint::GetHintedLocation() { - return hintedLocation; +Hint::Hint(RandomizerHint ownKey_, nlohmann::json json_){ + ownKey = ownKey_; + if (json_.contains("enabled") && !json_["enabled"].get()){ + return; + } + enabled = true; + + if (json_.contains("type")){ + hintType = (HintType)StaticData::hintTypeNameToEnum[json_["type"].get()]; + } + + if (hintType == HINT_TYPE_MESSAGE){ + if (json_.contains("messages")){ + for (auto message: json_["messages"]){ + messages.push_back(CustomMessage(message.get())); + } + } else if (json_.contains("message")){ + messages.push_back(CustomMessage(json_["message"].get())); + } + } + + if (json_.contains("distribution")){ + distribution = json_["distribution"].get(); + } + + if (json_.contains("locations")){ + for (auto loc: json_["locations"]){ + locations.push_back(StaticData::locationNameToEnum[loc.get()]); + } + } else if (json_.contains("location")){ + locations.push_back(StaticData::locationNameToEnum[json_["location"].get()]); + } + + if (json_.contains("itemNamesChosen")){ + for (auto name: json_["itemNamesChosen"]){ + itemNamesChosen.push_back(name.get()); + } + } else if (json_.contains("itemNameChosen")){ + itemNamesChosen.push_back(json_["itemNameChosen"].get()); + } + + if (json_.contains("areas")){ + for (auto area: json_["areas"]){ + areas.push_back((RandomizerArea)Rando::StaticData::areaNameToEnum[area]); + } + } else if (json_.contains("area")){ + areas.push_back((RandomizerArea)Rando::StaticData::areaNameToEnum[json_["area"]]); + } + + if (json_.contains("areaNamesChosen")){ + for (auto name: json_["areaNamesChosen"]){ + areaNamesChosen.push_back(name.get()); + } + } else if (json_.contains("areaNameChosen")){ + areaNamesChosen.push_back(json_["areaNameChosen"].get()); + } + + if (json_.contains("trials")){ + for (auto trial: json_["trials"]){ + trials.push_back((TrialKey)Rando::StaticData::trialNameToEnum[trial]); + } + } else if (json_.contains("trial")){ + trials.push_back((TrialKey)Rando::StaticData::trialNameToEnum[json_["trial"]]); + } + + if (json_.contains("hintKeys")){ + for (auto hintKey: json_["hintKeys"]){ + hintKeys.push_back((RandomizerHintTextKey)hintKey.get()); + } + } else if (json_.contains("hintKey")){ + hintKeys.push_back((RandomizerHintTextKey)json_["hintKey"].get()); + } + + if (json_.contains("hintTextsChosen")){ + for (auto name: json_["hintTextsChosen"]){ + hintTextsChosen.push_back(name.get()); + } + } else if (json_.contains("hintTextChosen")){ + hintTextsChosen.push_back(json_["hintTextChosen"].get()); + } + + if (json_.contains("num")){ + num = json_["num"].get(); + } + + FillGapsInData(); + SetLocationsAsHinted(); +} + +void Hint::FillGapsInData(){ + auto ctx = Rando::Context::GetInstance(); + if (locations.size() == 0 && StaticData::staticHintInfoMap.contains(ownKey)){ + locations = StaticData::staticHintInfoMap[ownKey].targetChecks; + } + bool fillAreas = true; + bool fillItems = true; + if (areas.size() > 0){ + fillAreas = false; + } + if (items.size() > 0){ + fillItems = false; + } + for(uint8_t c = 0; c < locations.size(); c++){ + if (fillAreas){ + areas.push_back(ctx->GetItemLocation(locations[c])->GetArea()); + } + if (fillItems){ + items.push_back(ctx->GetItemLocation(locations[c])->GetPlacedRandomizerGet()); + } + } +} + +void Hint::SetLocationsAsHinted() const { + auto ctx = Rando::Context::GetInstance(); + for (uint8_t count = 0; count < locations.size(); count++){ + ctx->GetItemLocation(locations[count])->AddHintedBy(ownKey); + } +} + +uint8_t GetRandomHintTextEntry(const HintText hintText){ + auto ctx = Rando::Context::GetInstance(); + uint8_t size = 0; + if (ctx->GetOption(RSK_HINT_CLARITY).Is(RO_HINT_CLARITY_AMBIGUOUS)){ + size = hintText.GetAmbiguousSize(); + } else if (ctx->GetOption(RSK_HINT_CLARITY).Is(RO_HINT_CLARITY_OBSCURE)){ + size = hintText.GetObscureSize(); + } + if (size > 0){ + return Random(0, size); + } + return 0; +} + +void Hint::NamesChosen(){ + auto ctx = Rando::Context::GetInstance(); + std::vector namesTemp = {}; + bool saveNames = false; + uint8_t numMessages = GetNumberOfMessages(); + for (uint8_t c = 0; c < numMessages; c++){ + uint8_t selection = GetRandomHintTextEntry(GetHintText(c)); + if (selection > 0){ + saveNames = true; + } + namesTemp.push_back(selection); + } + if (saveNames) { + hintTextsChosen = namesTemp; + } + + if (hintType == HINT_TYPE_ITEM || hintType == HINT_TYPE_ITEM_AREA || hintType == HINT_TYPE_MERCHANT){ + bool mysterious = hintType == HINT_TYPE_MERCHANT && ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ON_NO_HINT); + for(uint8_t c = 0; c < locations.size(); c++){ + namesTemp = {}; + saveNames = false; + uint8_t selection = GetRandomHintTextEntry(GetItemHintText(c, mysterious)); + if (selection > 0){ + saveNames = true; + } + namesTemp.push_back(selection); + } + if (saveNames) { + itemNamesChosen = namesTemp; + } + } + + if (hintType == HINT_TYPE_FOOLISH || hintType == HINT_TYPE_ITEM_AREA || hintType == HINT_TYPE_WOTH || + hintType == HINT_TYPE_ALTAR_CHILD || hintType == HINT_TYPE_ALTAR_ADULT){ + namesTemp = {}; + saveNames = false; + for(uint8_t c = 0; c < areas.size(); c++){ + uint8_t selection = GetRandomHintTextEntry(GetAreaHintText(c)); + if (selection > 0){ + saveNames = true; + } + namesTemp.push_back(selection); + } + if (saveNames) { + areaNamesChosen = namesTemp; + } + } +} + +uint8_t Hint::GetNumberOfMessages() const { + size_t numMessages = std::max(messages.size(), hintKeys.size()); + if (StaticData::staticHintInfoMap.contains(ownKey)){ + numMessages = std::max(StaticData::staticHintInfoMap[ownKey].hintKeys.size(), numMessages); + } + if (numMessages == 0){ + numMessages = 1; //RANDOTODO make std::max actually fucking work for 3 arguments + } + return numMessages; +} + +const std::vector Hint::GetAllMessageStrings(MessageFormat format) const { + std::vector hintMessages = {}; + uint8_t numMessages = GetNumberOfMessages(); + for (int c = 0; c < numMessages; c++){ + hintMessages.push_back(GetHintMessage(format, c).GetForCurrentLanguage(format)); + } + return hintMessages; +} + +const HintText Hint::GetHintText(uint8_t id) const { + auto ctx = Rando::Context::GetInstance(); + if (hintKeys.size() > id){ + return StaticData::hintTextTable[hintKeys[id]]; + } +// If a static hint, load default from staticHintInfoMap + if (StaticData::staticHintInfoMap.contains(ownKey) && StaticData::staticHintInfoMap[ownKey].hintKeys.size() > id){ + return StaticData::hintTextTable[StaticData::staticHintInfoMap[ownKey].hintKeys[id]]; + } + + switch (hintType){ + case HINT_TYPE_HINT_KEY: + return StaticData::hintTextTable[0]; + break; + case HINT_TYPE_TRIAL: + if (ctx->GetTrial(trials[0])->IsRequired()) { + return StaticData::hintTextTable[RHT_TRIAL_ON]; + } else { + return StaticData::hintTextTable[RHT_TRIAL_OFF]; + } + case HINT_TYPE_WOTH: + return StaticData::hintTextTable[RHT_WAY_OF_THE_HERO]; + case HINT_TYPE_FOOLISH: + return StaticData::hintTextTable[RHT_FOOLISH]; + case HINT_TYPE_ITEM: + if (locations.size() > 0) { + return *StaticData::GetLocation(locations[0])->GetHint(); + } else { + return CustomMessage("ERROR: ITEM HINT WITH NO LOCATIONS OR HINT KEY"); + } + case HINT_TYPE_ITEM_AREA: + if (locations.size() > 0) { + if (StaticData::GetLocation(locations[0])->IsDungeon()) { + return StaticData::hintTextTable[RHT_HOARDS]; + } else { + return StaticData::hintTextTable[RHT_CAN_BE_FOUND_AT]; + } + } else { + return CustomMessage("ERROR: ITEM AREA HINT WITH NO LOCATION"); //RANDOTODO get isDungeon from area? + } + default: + return CustomMessage("ERROR: NO HINTKEY PROVIDED AND HINT TYPE HAS NO DEFAULT"); + } +} + +const CustomMessage Hint::GetHintMessage(MessageFormat format, uint8_t id) const { + auto ctx = Rando::Context::GetInstance(); + CustomMessage hintText = CustomMessage(""); + + uint8_t chosenMessage = 0; + if (hintTextsChosen.size() > id){ + chosenMessage = id; + } + + if (hintType == HINT_TYPE_MESSAGE){ + if (id < messages.size()){ + hintText = messages[id]; + } + } else if (hintType == HINT_TYPE_ALTAR_CHILD){ + if (ctx->GetOption(RSK_TOT_ALTAR_HINT)){ + hintText = StaticData::hintTextTable[RHT_CHILD_ALTAR_STONES].GetHintMessage(); + } + if (ctx->GetOption(RSK_DOOR_OF_TIME).Is(RO_DOOROFTIME_OPEN)) { + hintText += CustomMessage(StaticData::hintTextTable[RHT_CHILD_ALTAR_TEXT_END_DOTOPEN].GetHintMessage()); + } else if (ctx->GetOption(RSK_DOOR_OF_TIME).Is(RO_DOOROFTIME_SONGONLY)) { + hintText += CustomMessage(StaticData::hintTextTable[RHT_CHILD_ALTAR_TEXT_END_DOTSONGONLY].GetHintMessage()); + } else { + hintText += CustomMessage(StaticData::hintTextTable[RHT_CHILD_ALTAR_TEXT_END_DOTCLOSED].GetHintMessage()); + } + } else if (hintType == HINT_TYPE_ALTAR_ADULT){ + if (ctx->GetOption(RSK_TOT_ALTAR_HINT)){ + hintText = StaticData::hintTextTable[RHT_ADULT_ALTAR_MEDALLIONS].GetHintMessage(); + } + hintText += GetBridgeReqsText() + GetGanonBossKeyText() + StaticData::hintTextTable[RHT_ADULT_ALTAR_TEXT_END].GetHintMessage(); + } else { + hintText = GetHintText(id).GetHintMessage(chosenMessage); + } + + std::vector toInsert = {}; + + switch (hintType){ + case HINT_TYPE_ITEM:{ + //if we write items + for(uint8_t b = 0; b < locations.size(); b++){ + toInsert.push_back(GetItemName(b)); + } + break;} + case HINT_TYPE_MERCHANT:{ + //if we write items, but need to adjust for merchants + bool mysterious = hintType == HINT_TYPE_MERCHANT && ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ON_NO_HINT); + for(uint8_t b = 0; b < locations.size(); b++){ + toInsert.push_back(GetItemName(b, mysterious)); + } + break;} + case HINT_TYPE_TRIAL:{ + //If we write trials + for(uint8_t b = 0; b < trials.size(); b++){ + toInsert.push_back(ctx->GetTrial(trials[b])->GetName()); + } + break;} + case HINT_TYPE_ITEM_AREA:{ + //If we write items and areas + for(uint8_t b = 0; b < items.size(); b++){ + toInsert.push_back(GetItemName(b)); + toInsert.push_back(GetAreaName(b)); + } + break;} + case HINT_TYPE_ALTAR_CHILD: + case HINT_TYPE_ALTAR_ADULT: + case HINT_TYPE_AREA: + case HINT_TYPE_WOTH: + case HINT_TYPE_FOOLISH:{ + //If we write areas + for(uint8_t b = 0; b < areas.size(); b++){ + toInsert.push_back(GetAreaName(b)); + } + break;} + default: + break; + } + + hintText.InsertNames(toInsert); + + if (num != 0){ + hintText.InsertNumber(num); + } + + if (format == MF_FORMATTED){ + hintText.Format(); + } else if (format == MF_AUTO_FORMAT){ + hintText.AutoFormat(); + } else if (format == MF_CLEAN){ + hintText.Clean(); + } + + return hintText; +} + +oJson Hint::toJSON() { + auto ctx = Rando::Context::GetInstance(); + nlohmann::ordered_json log = {}; + if (enabled){ + log["type"] = StaticData::hintTypeNames[hintType].GetForCurrentLanguage(MF_CLEAN); + + std::vector hintMessages = GetAllMessageStrings(MF_CLEAN); + if (hintMessages.size() == 1){ + log["message"] = hintMessages[0]; + } else if (hintMessages.size() > 1){ + log["messages"] = hintMessages; + } + + if (distribution != ""){ + log["distribution"] = distribution; + } + + if (hintType != HINT_TYPE_FOOLISH){ + if (!(StaticData::staticHintInfoMap.contains(ownKey) && + StaticData::staticHintInfoMap[ownKey].targetChecks.size() > 0)){ + if (locations.size() == 1){ + log["location"] = StaticData::GetLocation(locations[0])->GetName();//RANDOTODO change to CustomMessage when VB is done; + } else if (locations.size() > 1){ + //If we have defaults, no need to write more + std::vector locStrings = {}; + for (size_t c = 0; c < locations.size(); c++){ + locStrings.push_back(StaticData::GetLocation(locations[c])->GetName());//RANDOTODO change to CustomMessage when VB is done + } + log["locations"] = locStrings; + } + } + + if (!(StaticData::staticHintInfoMap.contains(ownKey) && + StaticData::staticHintInfoMap[ownKey].targetItems.size() > 0)){ + if (items.size() == 1){ + log["item"] = StaticData::GetItemTable()[items[0]].GetName().GetEnglish();//RANDOTODO change to CustomMessage; + } else if (items.size() > 1){ + std::vector itemStrings = {}; + for (size_t c = 0; c < items.size(); c++){ + itemStrings.push_back(StaticData::GetItemTable()[items[c]].GetName().GetEnglish());//RANDOTODO change to CustomMessage + } + log["items"] = itemStrings; + } + } + + if (itemNamesChosen.size() == 1){ + log["itemNameChosen"] = itemNamesChosen[0]; + } else if (itemNamesChosen.size() > 1){ + std::vector nameNums = {}; + for (size_t c = 0; c < itemNamesChosen.size(); c++){ + nameNums.push_back(itemNamesChosen[c]); + } + log["itemNamesChosen"] = nameNums; + } + } + if (areas.size() == 1){ + log["area"] = StaticData::hintTextTable[StaticData::areaNames[areas[0]]].GetClear().GetForCurrentLanguage(MF_CLEAN); + } else if (areas.size() > 0 && + !(StaticData::staticHintInfoMap.contains(ownKey) && StaticData::staticHintInfoMap[ownKey].targetChecks.size() > 0)){ + // If we got locations from defaults, areas are derived from them and don't need logging + std::vector areaStrings = {}; + for (size_t c = 0; c < areas.size(); c++){ + areaStrings.push_back(StaticData::hintTextTable[StaticData::areaNames[areas[c]]].GetClear().GetForCurrentLanguage(MF_CLEAN)); + } + log["areas"] = areaStrings; + } + + if (areaNamesChosen.size() == 1){ + log["areaNameChosen"] = areaNamesChosen[0]; + } else if (areaNamesChosen.size() > 1){ + std::vector nameNums = {}; + for (size_t c = 0; c < areaNamesChosen.size(); c++){ + nameNums.push_back(areaNamesChosen[c]); + } + log["areaNamesChosen"] = nameNums; + } + + if (trials.size() == 1){ + log["trial"] = ctx->GetTrial(trials[0])->GetName().GetForCurrentLanguage(MF_CLEAN); + } else if (trials.size() > 0){ + std::vector trialStrings = {}; + for (size_t c = 0; c < trials.size(); c++){ + trialStrings.push_back(ctx->GetTrial(trials[c])->GetName().GetForCurrentLanguage(MF_CLEAN)); + } + log["trials"] = trialStrings; + } + + if (hintKeys.size() == 1){ + log["hintKey"] = hintKeys[0]; + } else if (hintKeys.size() > 1){ + std::vector hintKeyNums = {}; + for (size_t c = 0; c < hintKeys.size(); c++){ + hintKeyNums.push_back(hintKeys[c]); + } + log["hintKeys"] = hintKeyNums; + } + + if (hintTextsChosen.size() == 1){ + log["hintTextChosen"] = hintTextsChosen[0]; + } else if (hintTextsChosen.size() > 1){ + std::vector nameNums = {}; + for (size_t c = 0; c < hintTextsChosen.size(); c++){ + nameNums.push_back(hintTextsChosen[c]); + } + log["hintTextsChosen"] = nameNums; + } + + if (num != 0){ + log["num"] = num; + } + + } + return log; +} + +void Hint::logHint(oJson& jsonData){ + auto ctx = Rando::Context::GetInstance(); + std::string logMap = "Static Hints"; + bool staticHint = true; + if (ownKey < RH_GANONDORF_HINT){ + logMap = "Gossip Stone Hints"; + staticHint = false; + } + if (enabled && + (!(staticHint && (hintType == HINT_TYPE_ITEM || hintType == HINT_TYPE_MERCHANT) && ctx->GetOption(RSK_HINT_CLARITY).Is(RO_HINT_CLARITY_CLEAR)))){ + //skip if not enabled or if a static hint with no possible variance + jsonData[logMap][Rando::StaticData::hintNames[ownKey].GetForCurrentLanguage(MF_CLEAN)] = toJSON(); + } +} + +const HintText Hint::GetItemHintText(uint8_t slot, bool mysterious) const { + //RANDOTODO make unreliant on locations, or make Hint accept ItemLocation + auto ctx = Rando::Context::GetInstance(); + RandomizerCheck hintedCheck = locations[slot]; + RandomizerGet targetRG = ctx->GetItemLocation(hintedCheck)->GetPlacedRandomizerGet(); + if (mysterious){ + return StaticData::hintTextTable[RHT_MYSTERIOUS_ITEM]; + } else if (!ctx->GetOption(RSK_HINT_CLARITY).Is(RO_HINT_CLARITY_AMBIGUOUS) && targetRG == RG_ICE_TRAP) { //RANDOTODO store in item hint instead of item + return HintText(CustomMessage({ctx->overrides[hintedCheck].GetTrickName()})); + } else { + return ctx->GetItemLocation(hintedCheck)->GetPlacedItem().GetHint(); + } +} + +const HintText Hint::GetAreaHintText(uint8_t slot) const { + CustomMessage areaText; + if (yourPocket && (areas[slot] == RA_LINKS_POCKET || areas[slot] == RA_NONE)){ + return StaticData::hintTextTable[RHT_YOUR_POCKET]; + } else { + return StaticData::hintTextTable[Rando::StaticData::areaNames[areas[slot]]]; + } +} + + +const CustomMessage Hint::GetItemName(uint8_t slot, bool mysterious) const { + uint8_t nameNum = 0; + if (itemNamesChosen.size() > slot){ + nameNum = itemNamesChosen[slot]; + } + return GetItemHintText(slot, mysterious).GetHintMessage(nameNum); +} + +const CustomMessage Hint::GetAreaName(uint8_t slot) const { + uint8_t nameNum = 0; + if (areaNamesChosen.size() > slot){ + nameNum = areaNamesChosen[slot]; + } + return GetAreaHintText(slot).GetHintMessage(nameNum); +} + + +CustomMessage Hint::GetBridgeReqsText() { + auto ctx = Rando::Context::GetInstance(); + CustomMessage bridgeMessage; + + if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_ALWAYS_OPEN)) { + return StaticData::hintTextTable[RHT_BRIDGE_OPEN_HINT].GetHintMessage(); + } + else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_VANILLA)) { + return StaticData::hintTextTable[RHT_BRIDGE_VANILLA_HINT].GetHintMessage(); + } + else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_STONES)) { + bridgeMessage = StaticData::hintTextTable[RHT_BRIDGE_STONES_HINT].GetHintMessage(); + bridgeMessage.InsertNumber(ctx->GetOption(RSK_RAINBOW_BRIDGE_STONE_COUNT).Value()); + } + else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_MEDALLIONS)) { + bridgeMessage = StaticData::hintTextTable[RHT_BRIDGE_MEDALLIONS_HINT].GetHintMessage(); + bridgeMessage.InsertNumber(ctx->GetOption(RSK_RAINBOW_BRIDGE_MEDALLION_COUNT).Value()); + } + else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_DUNGEON_REWARDS)) { + bridgeMessage = StaticData::hintTextTable[RHT_BRIDGE_REWARDS_HINT].GetHintMessage(); + bridgeMessage.InsertNumber(ctx->GetOption(RSK_RAINBOW_BRIDGE_REWARD_COUNT).Value()); + } + else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_DUNGEONS)) { + bridgeMessage = StaticData::hintTextTable[RHT_BRIDGE_DUNGEONS_HINT].GetHintMessage(); + bridgeMessage.InsertNumber(ctx->GetOption(RSK_RAINBOW_BRIDGE_DUNGEON_COUNT).Value()); + } + else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_TOKENS)) { + bridgeMessage = StaticData::hintTextTable[RHT_BRIDGE_TOKENS_HINT].GetHintMessage(); + bridgeMessage.InsertNumber(ctx->GetOption(RSK_RAINBOW_BRIDGE_TOKEN_COUNT).Value()); + } + else if (ctx->GetOption(RSK_RAINBOW_BRIDGE).Is(RO_BRIDGE_GREG)) { + return StaticData::hintTextTable[RHT_BRIDGE_GREG_HINT].GetHintMessage(); + } + return bridgeMessage; +} + +CustomMessage Hint::GetGanonBossKeyText() { + auto ctx = Rando::Context::GetInstance(); + CustomMessage ganonBossKeyMessage; + + if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_STARTWITH)) { + return StaticData::hintTextTable[RHT_GANON_BK_START_WITH_HINT].GetHintMessage(); + } + else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_VANILLA)) { + return StaticData::hintTextTable[RHT_GANON_BK_VANILLA_HINT].GetHintMessage(); + } + else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_OWN_DUNGEON)) { + return StaticData::hintTextTable[RHT_GANON_BK_OWN_DUNGEON_HINT].GetHintMessage(); + } + else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_ANY_DUNGEON)) { + return StaticData::hintTextTable[RHT_GANON_BK_ANY_DUNGEON_HINT].GetHintMessage(); + } + else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_OVERWORLD)) { + return StaticData::hintTextTable[RHT_GANON_BK_OVERWORLD_HINT].GetHintMessage(); + } + else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_ANYWHERE)) { + return StaticData::hintTextTable[RHT_GANON_BK_ANYWHERE_HINT].GetHintMessage(); + } + else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_KAK_TOKENS)) { + return StaticData::hintTextTable[RHT_GANON_BK_SKULLTULA_HINT].GetHintMessage(); + } + else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_VANILLA)) { + return StaticData::hintTextTable[RHT_LACS_VANILLA_HINT].GetHintMessage(); + } + else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_STONES)) { + ganonBossKeyMessage = StaticData::hintTextTable[RHT_LACS_STONES_HINT].GetHintMessage(); + ganonBossKeyMessage.InsertNumber(ctx->GetOption(RSK_LACS_STONE_COUNT).Value()); + } + else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_MEDALLIONS)) { + ganonBossKeyMessage = StaticData::hintTextTable[RHT_LACS_MEDALLIONS_HINT].GetHintMessage(); + ganonBossKeyMessage.InsertNumber(ctx->GetOption(RSK_LACS_MEDALLION_COUNT).Value()); + } + else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_REWARDS)) { + ganonBossKeyMessage = StaticData::hintTextTable[RHT_LACS_REWARDS_HINT].GetHintMessage(); + ganonBossKeyMessage.InsertNumber(ctx->GetOption(RSK_LACS_REWARD_COUNT).Value()); + } + else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_DUNGEONS)) { + ganonBossKeyMessage = StaticData::hintTextTable[RHT_LACS_DUNGEONS_HINT].GetHintMessage(); + ganonBossKeyMessage.InsertNumber(ctx->GetOption(RSK_LACS_DUNGEON_COUNT).Value()); + } + else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_LACS_TOKENS)) { + ganonBossKeyMessage = StaticData::hintTextTable[RHT_LACS_TOKENS_HINT].GetHintMessage(); + ganonBossKeyMessage.InsertNumber(ctx->GetOption(RSK_LACS_TOKEN_COUNT).Value()); + } + else if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_TRIFORCE_HUNT)) { + return StaticData::hintTextTable[RHT_GANON_BK_TRIFORCE_HINT].GetHintMessage(); + } + return ganonBossKeyMessage; +} + + +void Hint::AddHintedLocation(RandomizerCheck location) { + locations.push_back(location); +} + +std::vector Hint::GetHintedLocations() const { + return locations; } void Hint::SetHintType(HintType type) { hintType = type; } -HintType Hint::GetHintType() { +HintType Hint::GetHintType() const { return hintType; } -void Hint::SetHintedArea(RandomizerArea area) { - hintedArea = area; +void Hint::AddHintedArea(RandomizerArea area) { + areas.push_back(area); } -RandomizerArea Hint::GetHintedArea() { - return hintedArea; +std::vector Hint::GetHintedAreas() const { + return areas; } void Hint::SetDistribution(std::string distributionName) { distribution = distributionName; } -const std::string& Hint::GetDistribution() { +const std::string& Hint::GetDistribution() const { return distribution; } +bool Hint::IsEnabled() const{ + return enabled; +} + +std::vector Hint::GetHintTextKeys() const{ + return hintKeys; +} + +std::vector Hint::GetHintedItems() const{ + return items; +} + +std::vector Hint::GetItemNamesChosen() const{ + return itemNamesChosen; +} + +std::vector Hint::GetHintTextsChosen() const{ + return hintTextsChosen; +} +std::vector Hint::GetAreaTextsChosen() const{ + return areaNamesChosen; +} + +std::vector Hint::GetHintedTrials() const{ + return trials; +} + +int Hint::GetNum(){ + return num; +} void Hint::ResetVariables() { - hintedLocation = RC_UNKNOWN_CHECK; - text = Text{}; - distribution = ""; - hintedArea = RA_NONE; - hintType = HINT_TYPE_STATIC; - addedToPool = false; + ownKey = RH_NONE; + num = 0; + yourPocket = false; + messages = {}; + hintKeys = {}; + locations = {}; + items = {}; + trials = {}; + hintType = HINT_TYPE_HINT_KEY; + areas = {}; + distribution = ""; + enabled = false; + itemNamesChosen = {}; + hintTextsChosen = {}; + areaNamesChosen = {}; } + } \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/hint.h b/soh/soh/Enhancements/randomizer/hint.h index 4b76cd691..dc626ebf9 100644 --- a/soh/soh/Enhancements/randomizer/hint.h +++ b/soh/soh/Enhancements/randomizer/hint.h @@ -1,33 +1,82 @@ #pragma once #include "3drando/text.hpp" +#include "3drando/hints.hpp" +#include "../custom-message/CustomMessageManager.h" #include "randomizerTypes.h" +#include +#include "nlohmann/json.hpp" +using oJson = nlohmann::ordered_json; namespace Rando { class Hint { - public: - Hint(); - Hint(Text text_); - Hint(Text text_, RandomizerCheck hintedLocation_, HintType hintType_, std::string distributionName_, RandomizerArea hintedArea_); - const Text& GetText() const; - RandomizerCheck GetHintedLocation(); - void SetHintedLocation (RandomizerCheck location); - HintType GetHintType(); - void SetHintType (HintType type); - RandomizerArea GetHintedArea(); - void SetHintedArea (RandomizerArea area); - const std::string& GetDistribution(); - void SetDistribution (std::string distribution); - void ResetVariables(); - bool IsAddedToPool(); - void AddToPool(); + public: + Hint(); + Hint(RandomizerHint ownKey_, + HintType hintType_, + std::string distributionName_, + std::vector hintKeys_, + std::vector locations_, + std::vector areas_ = {}, + std::vector trials_ = {}); + Hint(RandomizerHint ownKey_, + HintType hintType_, + std::vector hintKeys_, + std::vector locations_ = {}, + std::vector areas_ = {}, + std::vector trials_ = {}, + bool yourPocket_ = false, + int num_ = 0); + Hint(RandomizerHint ownKey_, std::vector messages_); + Hint(RandomizerHint ownKey_, nlohmann::json json_); + void FillGapsInData(); + void SetLocationsAsHinted() const; + void NamesChosen(); + uint8_t GetNumberOfMessages() const; + const std::vector GetAllMessageStrings(MessageFormat format = MF_AUTO_FORMAT) const ; + const CustomMessage GetHintMessage(MessageFormat format = MF_AUTO_FORMAT, uint8_t id = 0) const ; + const HintText GetHintText(uint8_t id = 0) const; + oJson toJSON(); + void logHint(oJson& jsonData); + const HintText GetItemHintText(uint8_t slot, bool mysterious) const; + const HintText GetAreaHintText(uint8_t slot) const; + const CustomMessage GetItemName(uint8_t slot, bool mysterious = false) const; + const CustomMessage GetAreaName(uint8_t slot) const; + static CustomMessage GetBridgeReqsText(); + static CustomMessage GetGanonBossKeyText(); + void AddHintedLocation (RandomizerCheck location); + std::vector GetHintedLocations() const; + void SetHintType (HintType type); + HintType GetHintType() const; + void AddHintedArea (RandomizerArea area); + std::vector GetHintedAreas() const; + void SetDistribution (std::string distribution); + const std::string& GetDistribution() const; + bool IsEnabled() const; + std::vector GetHintTextKeys() const; + std::vector GetHintedItems() const; + std::vector GetItemNamesChosen() const; + std::vector GetHintTextsChosen() const; + std::vector GetAreaTextsChosen() const; + std::vector GetHintedTrials() const; + int GetNum(); + void ResetVariables(); - private: - Text text = Text(); - RandomizerCheck hintedLocation = RC_UNKNOWN_CHECK; - HintType hintType = HINT_TYPE_STATIC; - RandomizerArea hintedArea = RA_NONE; - std::string distribution = ""; - bool addedToPool = false; + private: + RandomizerHint ownKey = RH_NONE; + HintType hintType = HINT_TYPE_HINT_KEY; + std::string distribution = ""; + std::vector hintKeys = {}; + std::vector locations = {}; + std::vector areas = {}; + std::vector trials = {}; + bool yourPocket = false; + int num = 0; + std::vector messages = {}; + std::vector items = {}; + bool enabled = false; + std::vector itemNamesChosen = {}; + std::vector hintTextsChosen = {}; + std::vector areaNamesChosen = {}; }; } \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/item.cpp b/soh/soh/Enhancements/randomizer/item.cpp index 970d7a347..16396c072 100644 --- a/soh/soh/Enhancements/randomizer/item.cpp +++ b/soh/soh/Enhancements/randomizer/item.cpp @@ -378,7 +378,7 @@ RandomizerHintTextKey Item::GetHintKey() const { } const HintText& Item::GetHint() const { - return ::Hint(hintKey); + return StaticData::hintTextTable[hintKey]; } bool Item::operator==(const Item& right) const { diff --git a/soh/soh/Enhancements/randomizer/item.h b/soh/soh/Enhancements/randomizer/item.h index d1610a7bc..8986d1146 100644 --- a/soh/soh/Enhancements/randomizer/item.h +++ b/soh/soh/Enhancements/randomizer/item.h @@ -5,9 +5,9 @@ #include #include "3drando/text.hpp" -#include "3drando/hint_list.hpp" #include "randomizerTypes.h" #include "soh/Enhancements/item-tables/ItemTableTypes.h" +#include "3drando/hints.hpp" enum ItemType { ITEMTYPE_ITEM, diff --git a/soh/soh/Enhancements/randomizer/item_list.cpp b/soh/soh/Enhancements/randomizer/item_list.cpp index 4541550e8..2b6c42d34 100644 --- a/soh/soh/Enhancements/randomizer/item_list.cpp +++ b/soh/soh/Enhancements/randomizer/item_list.cpp @@ -8,7 +8,7 @@ using namespace Rando; std::array Rando::StaticData::itemTable; -std::unordered_map Rando::StaticData::SpoilerfileItemNameToEnum; +std::unordered_map Rando::StaticData::itemNameToEnum; void Rando::StaticData::InitItemTable() { auto logic = Context::GetInstance()->GetLogic(); @@ -322,15 +322,15 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_MAGIC_DOUBLE] = Item(RG_MAGIC_DOUBLE, Text{ "Enhanced Magic Meter", "Jauge de Magie améliorée", "Verbesserte Magieanzeige" }, ITEMTYPE_ITEM, 0x8A, true, &logic->ProgressiveMagic, RHT_MAGIC_DOUBLE, RG_MAGIC_DOUBLE, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, 0xE8, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); itemTable[RG_TRIFORCE_PIECE] = Item(RG_TRIFORCE_PIECE, Text{ "Triforce Piece", "Triforce Piece", "Triforce Piece" }, ITEMTYPE_ITEM, 0xDF, true, &logic->TriforcePieces, RHT_TRIFORCE_PIECE, RG_TRIFORCE_PIECE, OBJECT_GI_BOMB_2, GID_TRIFORCE_PIECE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); - // Init SpoilerfileItemNameToEnum + // Init itemNameToEnum for (auto& item : itemTable) { // Easiest way to filter out all the empty values from the array, since we still technically want the 0/RG_NONE // entry if (item.GetName().english.empty()) { continue; } - SpoilerfileItemNameToEnum[item.GetName().english] = item.GetRandomizerGet(); - SpoilerfileItemNameToEnum[item.GetName().french] = item.GetRandomizerGet(); + itemNameToEnum[item.GetName().english] = item.GetRandomizerGet(); + itemNameToEnum[item.GetName().french] = item.GetRandomizerGet(); } } diff --git a/soh/soh/Enhancements/randomizer/item_location.cpp b/soh/soh/Enhancements/randomizer/item_location.cpp index 736778786..59bceb8d5 100644 --- a/soh/soh/Enhancements/randomizer/item_location.cpp +++ b/soh/soh/Enhancements/randomizer/item_location.cpp @@ -109,19 +109,19 @@ void ItemLocation::SetAsHintable() { isHintable = true; } -bool ItemLocation::IsHintedAt() const { - return hintedAt; +bool ItemLocation::IsAHintAccessible() const { + return hintAccesible; } -void ItemLocation::SetAsHinted() { - hintedAt = true; +void ItemLocation::SetHintAccesible() { + hintAccesible = true; } -const std::vector& ItemLocation::GetHintedBy() const { +const std::vector& ItemLocation::GetHintedBy() const { return hintedBy; } -void ItemLocation::AddHintedBy(const RandomizerHintKey hintKey) { +void ItemLocation::AddHintedBy(const RandomizerHint hintKey) { hintedBy.push_back(hintKey); } @@ -193,7 +193,7 @@ void ItemLocation::ResetVariables() { placedItem = RG_NONE; delayedItem = RG_NONE; isHintable = false; - hintedAt = false; + hintAccesible = false; hintedBy = {}; price = 0; hasCustomPrice = false; diff --git a/soh/soh/Enhancements/randomizer/item_location.h b/soh/soh/Enhancements/randomizer/item_location.h index a4b60a5d3..dd5ec8a00 100644 --- a/soh/soh/Enhancements/randomizer/item_location.h +++ b/soh/soh/Enhancements/randomizer/item_location.h @@ -33,10 +33,10 @@ class ItemLocation { void SetCustomPrice(uint16_t price_); bool IsHintable() const; void SetAsHintable(); - bool IsHintedAt() const; - void SetAsHinted(); - const std::vector& GetHintedBy() const; - void AddHintedBy(RandomizerHintKey hintKey); + bool IsAHintAccessible() const; + void SetHintAccesible(); + const std::vector& GetHintedBy() const; + void AddHintedBy(RandomizerHint hintKey); bool IsHidden() const; bool IsExcluded() const; void AddExcludeOption(); @@ -52,8 +52,8 @@ class ItemLocation { private: RandomizerCheck rc; - std::vector hintedBy = {}; - bool hintedAt = false; + std::vector hintedBy = {}; + bool hintAccesible = false; bool isHintable = false; bool addedToPool = false; RandomizerGet placedItem = RG_NONE; diff --git a/soh/soh/Enhancements/randomizer/location.cpp b/soh/soh/Enhancements/randomizer/location.cpp index a0783f4ad..24d6ac9cb 100644 --- a/soh/soh/Enhancements/randomizer/location.cpp +++ b/soh/soh/Enhancements/randomizer/location.cpp @@ -1,5 +1,5 @@ #include "location.h" -#include "3drando/hint_list.hpp" +#include "static_data.h" #include RandomizerCheck Rando::Location::GetRandomizerCheck() const { @@ -47,7 +47,7 @@ RandomizerHintTextKey Rando::Location::GetHintKey() const { } HintText* Rando::Location::GetHint() { - return &hintTable[hintKey]; + return &StaticData::hintTextTable[hintKey]; } const std::string& Rando::Location::GetName() const { @@ -90,7 +90,7 @@ uint32_t Rando::Location::Getuint32_t() const { } const HintText& Rando::Location::GetHint() const { - return Hint(hintKey); + return StaticData::hintTextTable[hintKey]; } RandomizerGet Rando::Location::GetVanillaItem() const { diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index c5418dda2..f990bb1fb 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -3,7 +3,6 @@ #define TWO_ACTOR_PARAMS(a, b) (abs(a) << 16) | abs(b) std::array Rando::StaticData::locationTable; -std::unordered_map Rando::StaticData::SpoilerfileCheckNameToEnum; std::multimap, RandomizerCheck> Rando::StaticData::CheckFromActorMultimap; std::vector KF_ShopLocations = { @@ -501,49 +500,49 @@ std::vector Rando::StaticData::overworldLocations = { }; std::vector Rando::StaticData::gossipStoneLocations = { - RC_COLOSSUS_GOSSIP_STONE, - RC_DMC_GOSSIP_STONE, - RC_DMC_UPPER_GROTTO_GOSSIP_STONE, - RC_DMT_GOSSIP_STONE, - RC_DMT_STORMS_GROTTO_GOSSIP_STONE, - RC_DODONGOS_CAVERN_GOSSIP_STONE, - RC_FAIRY_GOSSIP_STONE, - RC_GC_MAZE_GOSSIP_STONE, - RC_GC_MEDIGORON_GOSSIP_STONE, - RC_GV_GOSSIP_STONE, - RC_GY_GOSSIP_STONE, - RC_HC_MALON_GOSSIP_STONE, - RC_HC_ROCK_WALL_GOSSIP_STONE, - RC_HC_STORMS_GROTTO_GOSSIP_STONE, - RC_HF_COW_GROTTO_GOSSIP_STONE, - RC_HF_NEAR_MARKET_GOSSIP_STONE, - RC_HF_OPEN_GROTTO_GOSSIP_STONE, - RC_HF_SOUTHEAST_GOSSIP_STONE, - RC_JABU_GOSSIP_STONE, RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE, RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE, RC_KF_GOSSIP_STONE, - RC_KF_STORMS_GOSSIP_STONE, - RC_KAK_OPEN_GROTTO_GOSSIP_STONE, - RC_LH_LAB_GOSSIP_STONE, - RC_LH_SOUTHEAST_GOSSIP_STONE, - RC_LH_SOUTHWEST_GOSSIP_STONE, + RC_KF_STORMS_GROTTO_GOSSIP_STONE, RC_LW_GOSSIP_STONE, - RC_LW_NEAR_SHORTCUTS_GOSSIP_STONE, + RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE, RC_SFM_MAZE_LOWER_GOSSIP_STONE, RC_SFM_MAZE_UPPER_GOSSIP_STONE, RC_SFM_SARIA_GOSSIP_STONE, + RC_HF_COW_GROTTO_GOSSIP_STONE, + RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE, + RC_HF_OPEN_GROTTO_GOSSIP_STONE, + RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE, RC_TOT_LEFT_CENTER_GOSSIP_STONE, - RC_TOT_LEFT_GOSSIP_STONE, + RC_TOT_LEFTMOST_GOSSIP_STONE, RC_TOT_RIGHT_CENTER_GOSSIP_STONE, - RC_TOT_RIGHT_GOSSIP_STONE, - RC_ZD_GOSSIP_STONE, + RC_TOT_RIGHTMOST_GOSSIP_STONE, + RC_HC_MALON_GOSSIP_STONE, + RC_HC_ROCK_WALL_GOSSIP_STONE, + RC_HC_STORMS_GROTTO_GOSSIP_STONE, + RC_KAK_OPEN_GROTTO_GOSSIP_STONE, + RC_GRAVEYARD_GOSSIP_STONE, + RC_DMT_GOSSIP_STONE, + RC_DMT_STORMS_GROTTO_GOSSIP_STONE, + RC_GC_MAZE_GOSSIP_STONE, + RC_GC_MEDIGORON_GOSSIP_STONE, + RC_DMC_GOSSIP_STONE, + RC_DMC_UPPER_GROTTO_GOSSIP_STONE, RC_ZR_NEAR_DOMAIN_GOSSIP_STONE, RC_ZR_NEAR_GROTTOS_GOSSIP_STONE, RC_ZR_OPEN_GROTTO_GOSSIP_STONE, + RC_ZD_GOSSIP_STONE, + RC_ZF_JABU_GOSSIP_STONE, + RC_ZF_FAIRY_GOSSIP_STONE, + RC_LH_LAB_GOSSIP_STONE, + RC_LH_SOUTHEAST_GOSSIP_STONE, + RC_LH_SOUTHWEST_GOSSIP_STONE, + RC_GV_GOSSIP_STONE, + RC_COLOSSUS_GOSSIP_STONE, + RC_DODONGOS_CAVERN_GOSSIP_STONE, }; -std::vector Rando::StaticData::otherHintLocations = { +std::vector Rando::StaticData::staticHintLocations = { RC_GANONDORF_HINT, RC_SHEIK_HINT_GC, RC_SHEIK_HINT_MQ_GC, @@ -1515,48 +1514,48 @@ void Rando::StaticData::InitLocationTable() { locationTable[RC_ZD_FISH_5] = Location::Base(RC_ZD_FISH_5, RCQUEST_BOTH, RCTYPE_FISH, RCAREA_ZORAS_DOMAIN, ACTOR_EN_FISH, SCENE_ZORAS_DOMAIN, -1 ^ 4, 0x00, "Fish 5", "ZD Fish 5", RHT_ZD_FISH, RG_FISH, { Category::cFish }, SpoilerCollectionCheck::Fish(0xFF, SCENE_ZORAS_DOMAIN), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); - // Gossip Stones - // RandomizerCheck Randomizer Check Quest Area Scene Params Flag Short Name Spoiler name Categories - locationTable[RC_DMC_GOSSIP_STONE] = Location::HintStone(RC_DMC_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 14341, 0x05, "Gossip Stone", "DMC Gossip Stone", {}); - locationTable[RC_DMT_GOSSIP_STONE] = Location::HintStone(RC_DMT_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 14340, 0x04, "Gossip Stone", "DMT Gossip Stone", {}); - locationTable[RC_COLOSSUS_GOSSIP_STONE] = Location::HintStone(RC_COLOSSUS_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 14362, 0x1A, "Gossip Stone", "Colossus Gossip Stone", {}); - locationTable[RC_DODONGOS_CAVERN_GOSSIP_STONE] = Location::HintStone(RC_DODONGOS_CAVERN_GOSSIP_STONE, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, 4372, 0x14, "Gossip Stone", "Dodongo's Cavern Gossip Stone", {}); - locationTable[RC_GV_GOSSIP_STONE] = Location::HintStone(RC_GV_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, 14353, 0x11, "Gossip Stone", "GV Gossip Stone", {}); - locationTable[RC_GC_MAZE_GOSSIP_STONE] = Location::HintStone(RC_GC_MAZE_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, 14357, 0x15, "Maze Gossip Stone", "GC Maze Gossip Stone", {}); - locationTable[RC_GC_MEDIGORON_GOSSIP_STONE] = Location::HintStone(RC_GC_MEDIGORON_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, 14873, 0x19, "Medigoron Gossip Stone", "GC Medigoron Gossip Stone", {}); - locationTable[RC_GY_GOSSIP_STONE] = Location::HintStone(RC_GY_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, 14346, 0x0A, "Gossip Stone", "GY Gossip Stone", {}); - locationTable[RC_HC_MALON_GOSSIP_STONE] = Location::HintStone(RC_HC_MALON_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, 14610, 0x12, "Malon Gossip Stone", "HC Malon Gossip Stone", {}); - locationTable[RC_HC_ROCK_WALL_GOSSIP_STONE] = Location::HintStone(RC_HC_ROCK_WALL_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, 14347, 0x0B, "Rock Wall Gossip Stone", "HC Rock Wall Gossip Stone", {}); - locationTable[RC_HC_STORMS_GROTTO_GOSSIP_STONE] = Location::HintStone(RC_HC_STORMS_GROTTO_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, 14355, 0x13, "Storms Grotto Gossip Stone", "HC Storms Grotto Gossip Stone", {}); - locationTable[RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE] = Location::HintStone(RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, 14623, 0x1F, "Deku Tree Left Gossip Stone", "KF Deku Tree Left Gossip Stone", {}); - locationTable[RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE] = Location::HintStone(RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, 14880, 0x20, "Deku Tree Right Gossip Stone", "KF Deku Tree Right Gossip Stone", {}); - locationTable[RC_KF_GOSSIP_STONE] = Location::HintStone(RC_KF_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, 14366, 0x1E, "Gossip Stone", "KF Gossip Stone", {}); - locationTable[RC_KF_STORMS_GOSSIP_STONE] = Location::HintStone(RC_KF_STORMS_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_GROTTOS, -22988, 0x3C, "Storms Gossip Stone", "KF Storms Gossip Stone", {}); - locationTable[RC_LH_LAB_GOSSIP_STONE] = Location::HintStone(RC_LH_LAB_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, 14339, 0x03, "Lab Gossip Stone", "LH Lab Gossip Stone", {}); - locationTable[RC_LH_SOUTHEAST_GOSSIP_STONE] = Location::HintStone(RC_LH_SOUTHEAST_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, 14863, 0x0F, "Southeast Gossip Stone", "LH Southeast Gossip Stone", {}); - locationTable[RC_LH_SOUTHWEST_GOSSIP_STONE] = Location::HintStone(RC_LH_SOUTHWEST_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, 14600, 0x08, "Southwest Gossip Stone", "LH Southwest Gossip Stone", {}); - locationTable[RC_LW_GOSSIP_STONE] = Location::HintStone(RC_LW_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 14365, 0x1D, "Gossip Stone", "LW Gossip Stone", {}); - locationTable[RC_SFM_MAZE_LOWER_GOSSIP_STONE] = Location::HintStone(RC_SFM_MAZE_LOWER_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, 14358, 0x16, "Maze Lower Gossip Stone", "SFM Maze Lower Gossip Stone", {}); - locationTable[RC_SFM_MAZE_UPPER_GOSSIP_STONE] = Location::HintStone(RC_SFM_MAZE_UPPER_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, 14615, 0x17, "Maze Upper Gossip Stone", "SFM Maze Upper Gossip Stone", {}); - locationTable[RC_SFM_SARIA_GOSSIP_STONE] = Location::HintStone(RC_SFM_SARIA_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, 14876, 0x1C, "Saria Gossip Stone", "SFM Saria Gossip Stone", {}); - locationTable[RC_TOT_LEFT_GOSSIP_STONE] = Location::HintStone(RC_TOT_LEFT_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_MARKET, SCENE_ID_MAX, 0x00, 0x06, "ToT Left Gossip Stone", "ToT Left Gossip Stone", {}); - locationTable[RC_TOT_RIGHT_GOSSIP_STONE] = Location::HintStone(RC_TOT_RIGHT_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_MARKET, SCENE_ID_MAX, 0x00, 0x07, "ToT Right Gossip Stone", "ToT Right Gossip Stone", {}); - locationTable[RC_TOT_RIGHT_CENTER_GOSSIP_STONE] = Location::HintStone(RC_TOT_RIGHT_CENTER_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_MARKET, SCENE_ID_MAX, 0x00, 0x10, "ToT Right Center Gossip Stone", "ToT Right Center Gossip Stone", {}); - locationTable[RC_TOT_LEFT_CENTER_GOSSIP_STONE] = Location::HintStone(RC_TOT_LEFT_CENTER_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_MARKET, SCENE_ID_MAX, 0x00, 0x0E, "ToT Left Center Gossip Stone", "ToT Left Center Gossip Stone", {}); - locationTable[RC_ZD_GOSSIP_STONE] = Location::HintStone(RC_ZD_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, 14345, 0x09, "Gossip Stone", "ZD Gossip Stone", {}); - locationTable[RC_FAIRY_GOSSIP_STONE] = Location::HintStone(RC_FAIRY_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, 0x00, 0x01, "Fairy Gossip Stone", "Fairy Gossip Stone", {}); - locationTable[RC_JABU_GOSSIP_STONE] = Location::HintStone(RC_JABU_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, 0x00, 0x02, "Jabu Gossip Stone", "Jabu Gossip Stone", {}); - locationTable[RC_ZR_NEAR_GROTTOS_GOSSIP_STONE] = Location::HintStone(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, 14605, 0x0D, "Near Grottos Gossip Stone", "ZR Near Grottos Gossip Stone", {}); - locationTable[RC_ZR_NEAR_DOMAIN_GOSSIP_STONE] = Location::HintStone(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, 14860, 0x0C, "Near Domain Gossip Stone", "ZR Near Domain Gossip Stone", {}); - locationTable[RC_HF_COW_GROTTO_GOSSIP_STONE] = Location::HintStone(RC_HF_COW_GROTTO_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, 14363, 0x1B, "Cow Grotto Gossip Stone", "HF Cow Grotto Gossip Stone", {}); - locationTable[RC_HF_NEAR_MARKET_GOSSIP_STONE] = Location::HintStone(RC_HF_NEAR_MARKET_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, -22944, 0x30, "Near Market Gossip Stone", "HF Near Market Gossip Stone", {}); - locationTable[RC_HF_SOUTHEAST_GOSSIP_STONE] = Location::HintStone(RC_HF_SOUTHEAST_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, -22978, 0x32, "Southeast Gossip Stone", "HF Southeast Gossip Stone", {}); - locationTable[RC_HF_OPEN_GROTTO_GOSSIP_STONE] = Location::HintStone(RC_HF_OPEN_GROTTO_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, -22947, 0x33, "Open Grotto Gossip Stone", "HF Open Grotto Gossip Stone", {}); - locationTable[RC_KAK_OPEN_GROTTO_GOSSIP_STONE] = Location::HintStone(RC_KAK_OPEN_GROTTO_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_GROTTOS, -22984, 0x38, "Open Grotto Gossip Stone", "Kak Open Grotto Gossip Stone", {}); - locationTable[RC_ZR_OPEN_GROTTO_GOSSIP_STONE] = Location::HintStone(RC_ZR_OPEN_GROTTO_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_GROTTOS, -22985, 0x39, "Open Grotto Gossip Stone", "ZR Open Grotto Gossip Stone", {}); - locationTable[RC_LW_NEAR_SHORTCUTS_GOSSIP_STONE] = Location::HintStone(RC_LW_NEAR_SHORTCUTS_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_GROTTOS, -22964, 0x34, "Near Shortcuts Gossip Stone", "LW Near Shortcuts Gossip Stone", {}); - locationTable[RC_DMT_STORMS_GROTTO_GOSSIP_STONE] = Location::HintStone(RC_DMT_STORMS_GROTTO_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_GROTTOS, -23255, 0x37, "Storms Grotto Gossip Stone", "DMT Storms Grotto Gossip Stone", {}); - locationTable[RC_DMC_UPPER_GROTTO_GOSSIP_STONE] = Location::HintStone(RC_DMC_UPPER_GROTTO_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_GROTTOS, -23802, 0x3A, "Upper Grotto Gossip Stone", "DMC Upper Grotto Gossip Stone", {}); + // Gossip Stones RANDOTODO work towards removing and replacing with event access + // RandomizerCheck Randomizer Check Quest Area Scene Params Flag Short Name Spoiler name Categories + locationTable[RC_DMC_GOSSIP_STONE] = Location::HintStone(RC_DMC_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 14341, 0x05, "Gossip Stone", "DMC Gossip Stone", {}); + locationTable[RC_DMT_GOSSIP_STONE] = Location::HintStone(RC_DMT_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 14340, 0x04, "Gossip Stone", "DMT Gossip Stone", {}); + locationTable[RC_COLOSSUS_GOSSIP_STONE] = Location::HintStone(RC_COLOSSUS_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 14362, 0x1A, "Gossip Stone", "Colossus Gossip Stone", {}); + locationTable[RC_DODONGOS_CAVERN_GOSSIP_STONE] = Location::HintStone(RC_DODONGOS_CAVERN_GOSSIP_STONE, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, 4372, 0x14, "Gossip Stone", "Dodongo's Cavern Gossip Stone", {}); + locationTable[RC_GV_GOSSIP_STONE] = Location::HintStone(RC_GV_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, 14353, 0x11, "Gossip Stone", "GV Gossip Stone", {}); + locationTable[RC_GC_MAZE_GOSSIP_STONE] = Location::HintStone(RC_GC_MAZE_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, 14357, 0x15, "Maze Gossip Stone", "GC Maze Gossip Stone", {}); + locationTable[RC_GC_MEDIGORON_GOSSIP_STONE] = Location::HintStone(RC_GC_MEDIGORON_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, 14873, 0x19, "Medigoron Gossip Stone", "GC Medigoron Gossip Stone", {}); + locationTable[RC_GRAVEYARD_GOSSIP_STONE] = Location::HintStone(RC_GRAVEYARD_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, 14346, 0x0A, "Gossip Stone", "GY Gossip Stone", {}); + locationTable[RC_HC_MALON_GOSSIP_STONE] = Location::HintStone(RC_HC_MALON_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, 14610, 0x12, "Malon Gossip Stone", "HC Malon Gossip Stone", {}); + locationTable[RC_HC_ROCK_WALL_GOSSIP_STONE] = Location::HintStone(RC_HC_ROCK_WALL_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, 14347, 0x0B, "Rock Wall Gossip Stone", "HC Rock Wall Gossip Stone", {}); + locationTable[RC_HC_STORMS_GROTTO_GOSSIP_STONE] = Location::HintStone(RC_HC_STORMS_GROTTO_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, 14355, 0x13, "Storms Grotto Gossip Stone", "HC Storms Grotto Gossip Stone", {}); + locationTable[RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE] = Location::HintStone(RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, 14623, 0x1F, "Deku Tree Left Gossip Stone", "KF Deku Tree Left Gossip Stone", {}); + locationTable[RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE] = Location::HintStone(RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, 14880, 0x20, "Deku Tree Right Gossip Stone", "KF Deku Tree Right Gossip Stone", {}); + locationTable[RC_KF_GOSSIP_STONE] = Location::HintStone(RC_KF_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, 14366, 0x1E, "Gossip Stone", "KF Gossip Stone", {}); + locationTable[RC_KF_STORMS_GROTTO_GOSSIP_STONE] = Location::HintStone(RC_KF_STORMS_GROTTO_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_GROTTOS, -22988, 0x3C, "Storms Gossip Stone", "KF Storms Gossip Stone", {}); + locationTable[RC_LH_LAB_GOSSIP_STONE] = Location::HintStone(RC_LH_LAB_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, 14339, 0x03, "Lab Gossip Stone", "LH Lab Gossip Stone", {}); + locationTable[RC_LH_SOUTHEAST_GOSSIP_STONE] = Location::HintStone(RC_LH_SOUTHEAST_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, 14863, 0x0F, "Southeast Gossip Stone", "LH Southeast Gossip Stone", {}); + locationTable[RC_LH_SOUTHWEST_GOSSIP_STONE] = Location::HintStone(RC_LH_SOUTHWEST_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, 14600, 0x08, "Southwest Gossip Stone", "LH Southwest Gossip Stone", {}); + locationTable[RC_LW_GOSSIP_STONE] = Location::HintStone(RC_LW_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 14365, 0x1D, "Gossip Stone", "LW Gossip Stone", {}); + locationTable[RC_SFM_MAZE_LOWER_GOSSIP_STONE] = Location::HintStone(RC_SFM_MAZE_LOWER_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, 14358, 0x16, "Maze Lower Gossip Stone", "SFM Maze Lower Gossip Stone", {}); + locationTable[RC_SFM_MAZE_UPPER_GOSSIP_STONE] = Location::HintStone(RC_SFM_MAZE_UPPER_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, 14615, 0x17, "Maze Upper Gossip Stone", "SFM Maze Upper Gossip Stone", {}); + locationTable[RC_SFM_SARIA_GOSSIP_STONE] = Location::HintStone(RC_SFM_SARIA_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, 14876, 0x1C, "Saria Gossip Stone", "SFM Saria Gossip Stone", {}); + locationTable[RC_TOT_LEFTMOST_GOSSIP_STONE] = Location::HintStone(RC_TOT_LEFTMOST_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_MARKET, SCENE_ID_MAX, 0x00, 0x06, "ToT Left Gossip Stone", "ToT Left Gossip Stone", {}); + locationTable[RC_TOT_RIGHTMOST_GOSSIP_STONE] = Location::HintStone(RC_TOT_RIGHTMOST_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_MARKET, SCENE_ID_MAX, 0x00, 0x07, "ToT Right Gossip Stone", "ToT Right Gossip Stone", {}); + locationTable[RC_TOT_RIGHT_CENTER_GOSSIP_STONE] = Location::HintStone(RC_TOT_RIGHT_CENTER_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_MARKET, SCENE_ID_MAX, 0x00, 0x10, "ToT Right Center Gossip Stone", "ToT Right Center Gossip Stone", {}); + locationTable[RC_TOT_LEFT_CENTER_GOSSIP_STONE] = Location::HintStone(RC_TOT_LEFT_CENTER_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_MARKET, SCENE_ID_MAX, 0x00, 0x0E, "ToT Left Center Gossip Stone", "ToT Left Center Gossip Stone", {}); + locationTable[RC_ZD_GOSSIP_STONE] = Location::HintStone(RC_ZD_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, 14345, 0x09, "Gossip Stone", "ZD Gossip Stone", {}); + locationTable[RC_ZF_FAIRY_GOSSIP_STONE] = Location::HintStone(RC_ZF_FAIRY_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, 0x00, 0x01, "Fairy Gossip Stone", "Fairy Gossip Stone", {}); + locationTable[RC_ZF_JABU_GOSSIP_STONE] = Location::HintStone(RC_ZF_JABU_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, 0x00, 0x02, "Jabu Gossip Stone", "Jabu Gossip Stone", {}); + locationTable[RC_ZR_NEAR_GROTTOS_GOSSIP_STONE] = Location::HintStone(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, 14605, 0x0D, "Near Grottos Gossip Stone", "ZR Near Grottos Gossip Stone", {}); + locationTable[RC_ZR_NEAR_DOMAIN_GOSSIP_STONE] = Location::HintStone(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, 14860, 0x0C, "Near Domain Gossip Stone", "ZR Near Domain Gossip Stone", {}); + locationTable[RC_HF_COW_GROTTO_GOSSIP_STONE] = Location::HintStone(RC_HF_COW_GROTTO_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, 14363, 0x1B, "Cow Grotto Gossip Stone", "HF Cow Grotto Gossip Stone", {}); + locationTable[RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE] = Location::HintStone(RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, -22944, 0x30, "Near Market Gossip Stone", "HF Near Market Gossip Stone", {}); + locationTable[RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE] = Location::HintStone(RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, -22978, 0x32, "Southeast Gossip Stone", "HF Southeast Gossip Stone", {}); + locationTable[RC_HF_OPEN_GROTTO_GOSSIP_STONE] = Location::HintStone(RC_HF_OPEN_GROTTO_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, -22947, 0x33, "Open Grotto Gossip Stone", "HF Open Grotto Gossip Stone", {}); + locationTable[RC_KAK_OPEN_GROTTO_GOSSIP_STONE] = Location::HintStone(RC_KAK_OPEN_GROTTO_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_GROTTOS, -22984, 0x38, "Open Grotto Gossip Stone", "Kak Open Grotto Gossip Stone", {}); + locationTable[RC_ZR_OPEN_GROTTO_GOSSIP_STONE] = Location::HintStone(RC_ZR_OPEN_GROTTO_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_GROTTOS, -22985, 0x39, "Open Grotto Gossip Stone", "ZR Open Grotto Gossip Stone", {}); + locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE] = Location::HintStone(RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_GROTTOS, -22964, 0x34, "Near Shortcuts Gossip Stone", "LW Near Shortcuts Gossip Stone", {}); + locationTable[RC_DMT_STORMS_GROTTO_GOSSIP_STONE] = Location::HintStone(RC_DMT_STORMS_GROTTO_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_GROTTOS, -23255, 0x37, "Storms Grotto Gossip Stone", "DMT Storms Grotto Gossip Stone", {}); + locationTable[RC_DMC_UPPER_GROTTO_GOSSIP_STONE] = Location::HintStone(RC_DMC_UPPER_GROTTO_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_GROTTOS, -23802, 0x3A, "Upper Grotto Gossip Stone", "DMC Upper Grotto Gossip Stone", {}); // Other Hints locationTable[RC_GANONDORF_HINT] = Location::OtherHint(RC_GANONDORF_HINT, RCQUEST_BOTH, RCTYPE_GOSSIP_STONE, RCAREA_GANONS_CASTLE, ACTOR_EN_GANON_MANT, SCENE_GANON_BOSS, "Ganondorf Hint", "Ganondorf Hint"); @@ -1572,12 +1571,12 @@ void Rando::StaticData::InitLocationTable() { locationTable[RC_TRIFORCE_COMPLETED] = Location::Reward(RC_TRIFORCE_COMPLETED, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_MARKET, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, 0x00, "Completed Triforce", "Completed Triforce", RHT_NONE, RG_NONE, {}, SpoilerCollectionCheck::None(), SpoilerCollectionCheckGroup::GROUP_NO_GROUP); // clang-format on - // Init SpoilerfileCheckNameToEnum - SpoilerfileCheckNameToEnum["Invalid Location"] = RC_UNKNOWN_CHECK; - SpoilerfileCheckNameToEnum["Link's Pocket"] = RC_LINKS_POCKET; + // Init locationNameToEnum + locationNameToEnum["Invalid Location"] = RC_UNKNOWN_CHECK; + locationNameToEnum["Link's Pocket"] = RC_LINKS_POCKET; for (auto& location : locationTable) { - SpoilerfileCheckNameToEnum[location.GetName()] = location.GetRandomizerCheck(); + locationNameToEnum[location.GetName()] = location.GetRandomizerCheck(); CheckFromActorMultimap.emplace(std::make_tuple((int16_t)location.GetActorID(), (int16_t)location.GetScene(), location.GetActorParams()), location.GetRandomizerCheck()); } } diff --git a/soh/soh/Enhancements/randomizer/option_descriptions.cpp b/soh/soh/Enhancements/randomizer/option_descriptions.cpp index e50846005..d3f1fa8e4 100644 --- a/soh/soh/Enhancements/randomizer/option_descriptions.cpp +++ b/soh/soh/Enhancements/randomizer/option_descriptions.cpp @@ -503,10 +503,13 @@ void Settings::CreateOptionDescriptions() { "Reading the Temple of Time altar as child will tell you the locations of the Spiritual Stones.\n" "Reading the Temple of Time altar as adult will tell you the locations of the Medallions, as well as the " "conditions for building the Rainbow Bridge and getting the Boss Key for Ganon's Castle."; - mOptionDescriptions[RSK_LIGHT_ARROWS_HINT] = - "Talking to Ganondorf in his boss room or Sheik inside Ganon's Castle (when trials are enabled) will tell you " - "the location of the Light Arrows." - "If this option is enabled and Ganondorf is reachable without Light Arrows, Gossip Stones will never hint the " + mOptionDescriptions[RSK_GANONDORF_HINT] = + "Talking to Ganondorf in his boss room will tell you the location of the Light Arrows and Master Sword." + "If this option is enabled and Ganondorf is reachable without these items, Gossip Stones will never hint the " + "appropriote items.";//RANDOTODO make this hint text about no dupe hints a global hint for static hints. Add to navi? + mOptionDescriptions[RSK_SHEIK_LA_HINT] = + "Talking to Sheik inside Ganon's Castle will tell you the location of the Light Arrows." + "If this option is enabled and Sheik is reachable without Light Arrows, Gossip Stones will never hint the " "Light Arrows."; mOptionDescriptions[RSK_DAMPES_DIARY_HINT] = "Reading the diary of Dampé the gravekeeper as adult will tell you the location of one of the Hookshots."; @@ -546,7 +549,7 @@ void Settings::CreateOptionDescriptions() { mOptionDescriptions[RSK_BLUE_FIRE_ARROWS] = "Ice Arrows act like Blue Fire, making them able to melt red ice. " "Item placement logic will respect this option, so it might be required to use this to progress."; - mOptionDescriptions[RSK_LIGHT_ARROWS_HINT] = + mOptionDescriptions[RSK_SUNLIGHT_ARROWS] = "Light Arrows can be used to light up the sun switches instead of using the Mirror Shield. " "Item placement logic will respect this option, so it might be required to use this to progress."; mOptionDescriptions[RSK_LOGIC_RULES] = diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 99d8961a5..868a9dea3 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -10,6 +10,7 @@ #include #include "3drando/rando_main.hpp" #include "3drando/random.hpp" +#include "3drando/custom_messages.hpp" #include "../../UIWidgets.hpp" #ifndef IMGUI_DEFINE_MATH_OPERATORS #define IMGUI_DEFINE_MATH_OPERATORS @@ -37,12 +38,12 @@ #include "settings.h" #include "soh/util.h" #include "fishsanity.h" +#include "randomizerTypes.h" extern "C" uint32_t ResourceMgr_IsGameMasterQuest(); extern "C" uint32_t ResourceMgr_IsSceneMasterQuest(s16 sceneNum); extern std::map rcAreaNames; -extern std::array hintTypeNames; using json = nlohmann::json; using namespace std::literals::string_literals; @@ -136,8 +137,8 @@ Randomizer::Randomizer() { SpoilerfileAreaNameToEnum["the Graveyard"] = RCAREA_GRAVEYARD; SpoilerfileAreaNameToEnum["Haunted Wasteland"] = RCAREA_WASTELAND; SpoilerfileAreaNameToEnum["outside Ganon's Castle"] = RCAREA_HYRULE_CASTLE; - for (int c = 0; c < hintTypeNames.size(); c++) { - SpoilerfileHintTypeNameToEnum[hintTypeNames[c]] = (HintType)c; + for (int c = 0; c < Rando::StaticData::hintTypeNames.size(); c++) { + SpoilerfileHintTypeNameToEnum[Rando::StaticData::hintTypeNames[(HintType)c].GetEnglish(MF_CLEAN)] = (HintType)c; } } @@ -240,187 +241,10 @@ void Randomizer::LoadHintMessages() { CustomMessageManager::Instance->ClearMessageTable(Randomizer::hintMessageTableID); CustomMessageManager::Instance->AddCustomMessageTable(Randomizer::hintMessageTableID); - CustomMessageManager::Instance->CreateMessage( - Randomizer::hintMessageTableID, TEXT_ALTAR_CHILD, - CustomMessage(ctx->GetHint(RH_ALTAR_CHILD)->GetText(), TEXTBOX_TYPE_BLUE)); - CustomMessageManager::Instance->CreateMessage( - Randomizer::hintMessageTableID, TEXT_ALTAR_ADULT, - CustomMessage(ctx->GetHint(RH_ALTAR_ADULT)->GetText(), TEXTBOX_TYPE_BLUE)); - CustomMessageManager::Instance->CreateMessage( - Randomizer::hintMessageTableID, TEXT_GANONDORF, - CustomMessage(ctx->GetHint(RH_GANONDORF_HINT)->GetText())); - CustomMessageManager::Instance->CreateMessage( - Randomizer::hintMessageTableID, TEXT_GANONDORF_NOHINT, - CustomMessage(ctx->GetHint(RH_GANONDORF_NOHINT)->GetText())); - CustomMessageManager::Instance->CreateMessage( - Randomizer::hintMessageTableID, TEXT_SHEIK_NEED_HOOK, - CustomMessage("{{message}}", "{{message}}", "{{message}}")); - CustomMessageManager::Instance->CreateMessage( - Randomizer::hintMessageTableID, TEXT_SHEIK_HAVE_HOOK, - CustomMessage("{{message}}", "{{message}}", "{{message}}")); - CustomMessageManager::Instance->CreateMessage( - Randomizer::hintMessageTableID, TEXT_SARIAS_SONG_FACE_TO_FACE, - CustomMessage(ctx->GetHint(RH_SARIA)->GetText(), TEXTBOX_TYPE_BLUE)); - - for (int i : Rando::StaticData::gossipStoneLocations) { - RandomizerHintKey rhk = RandomizerHintKey(i - RC_COLOSSUS_GOSSIP_STONE + 1); - CustomMessageManager::Instance->CreateMessage( - Randomizer::hintMessageTableID, i, CustomMessage(ctx->GetHint(rhk)->GetText())); - } - //Extra Hints CustomMessageManager::Instance->ClearMessageTable(Randomizer::randoMiscHintsTableID); CustomMessageManager::Instance->AddCustomMessageTable(Randomizer::randoMiscHintsTableID); - CustomMessageManager::Instance->CreateMessage( - Randomizer::randoMiscHintsTableID, TEXT_SKULLTULA_PEOPLE_IM_CURSED, - CustomMessage("Yeaaarrgh! I'm cursed!!^Please save me by destroying&%r{{params}} Spiders of the Curse%w&and I will give you my&%g{{item1}}%w!", - "Yeaaarrgh! Ich bin verflucht!^Bitte rette mich, indem du %r{{params}} Skulltulas&%wzerstörst und ich werde dir dafür&%g{{item1}} %wgeben!", - "Yeaaarrgh! Je suis maudit!^Détruit encore %r{{params}} Araignées de&la Malédiction%w et j'aurai quelque&chose à te donner!&%g({{item1}})") - ); - CustomMessageManager::Instance->CreateMessage( - Randomizer::randoMiscHintsTableID, TEXT_DAMPES_DIARY, - CustomMessage(ctx->GetHint(RH_DAMPES_DIARY)->GetText()) - ); - CustomMessageManager::Instance->CreateMessage( - Randomizer::randoMiscHintsTableID, TEXT_CHEST_GAME_PROCEED, - CustomMessage(ctx->GetHint(RH_GREG_RUPEE)->GetText()) - ); - CustomMessageManager::Instance->CreateMessage( - Randomizer::randoMiscHintsTableID, TEXT_FROGS_UNDERWATER, - CustomMessage(ctx->GetHint(RH_FROGS)->GetText().GetEnglish(), - ctx->GetHint(RH_FROGS)->GetText().GetGerman(), - ctx->GetHint(RH_FROGS)->GetText().GetFrench(), TEXTBOX_TYPE_BLUE) - ); - CustomMessageManager::Instance->CreateMessage(Randomizer::randoMiscHintsTableID, TEXT_WARP_MINUET_OF_FOREST, - CustomMessage(ctx->GetHint(RH_MINUET_WARP_LOC)->GetText().GetEnglish(), - ctx->GetHint(RH_MINUET_WARP_LOC)->GetText().GetGerman(), - ctx->GetHint(RH_MINUET_WARP_LOC)->GetText().GetFrench())); - CustomMessageManager::Instance->CreateMessage(Randomizer::randoMiscHintsTableID, TEXT_WARP_BOLERO_OF_FIRE, - CustomMessage(ctx->GetHint(RH_BOLERO_WARP_LOC)->GetText().GetEnglish(), - ctx->GetHint(RH_BOLERO_WARP_LOC)->GetText().GetGerman(), - ctx->GetHint(RH_BOLERO_WARP_LOC)->GetText().GetFrench())); - CustomMessageManager::Instance->CreateMessage(Randomizer::randoMiscHintsTableID, TEXT_WARP_SERENADE_OF_WATER, - CustomMessage(ctx->GetHint(RH_SERENADE_WARP_LOC)->GetText().GetEnglish(), - ctx->GetHint(RH_SERENADE_WARP_LOC)->GetText().GetGerman(), - ctx->GetHint(RH_SERENADE_WARP_LOC)->GetText().GetFrench())); - CustomMessageManager::Instance->CreateMessage(Randomizer::randoMiscHintsTableID, TEXT_WARP_REQUIEM_OF_SPIRIT, - CustomMessage(ctx->GetHint(RH_REQUIEM_WARP_LOC)->GetText().GetEnglish(), - ctx->GetHint(RH_REQUIEM_WARP_LOC)->GetText().GetGerman(), - ctx->GetHint(RH_REQUIEM_WARP_LOC)->GetText().GetFrench())); - - CustomMessageManager::Instance->CreateMessage( - Randomizer::randoMiscHintsTableID, TEXT_SARIAS_SONG_FOREST_SOUNDS, - CustomMessage("{{message}}", "{{message}}", "{{message}}", TEXTBOX_TYPE_BLUE) - ); - - CustomMessageManager::Instance->CreateMessage( - Randomizer::randoMiscHintsTableID, TEXT_BIGGORON_BETTER_AT_SMITHING, - CustomMessage("Arrrrrre you here to claim my finest&%g{{item1}}%w?&Shoooooow me your %rClaim Check.%w", - "", - "") - ); - - CustomMessageManager::Instance->CreateMessage( - Randomizer::randoMiscHintsTableID, TEXT_GHOST_SHOP_CARD_HAS_POINTS, - CustomMessage("You have %g\x1E\x01%r Poe Points%w!&Reach 1000 and you'll get a&%g{{item1}}%w!", - "", - "") - ); - - CustomMessageManager::Instance->CreateMessage( - Randomizer::randoMiscHintsTableID, TEXT_ANJU_PLEASE_BRING_MY_CUCCOS_BACK, - CustomMessage("You! Please!&Bring my Cucco's back to my pen!&I'll give you my %g{{item1}}%w!", - "", - "") - ); - - CustomMessageManager::Instance->CreateMessage( - Randomizer::randoMiscHintsTableID, TEXT_MALON_OBSTICLE_COURSE, - CustomMessage("How about trying the %rObsticle Course?%w&If you beat my time I'll let you keep&my favourite cow Elsie and&her toy %g{{item1}}%w!^" - "Challenge the %rObsticle Course?&\x1B&%gLet's go&No thanks%w", - "", - "") - ); - - CustomMessageManager::Instance->CreateMessage( - Randomizer::randoMiscHintsTableID, TEXT_MALON_HOW_IS_EPONA_DOING, - CustomMessage("@! You should come back &with Epona and try to beat my time&on the %rObsticle Course%w!^If you beat my time, I'll give you&my favourite %rcow%w Elsie and&her toy %g{{item1}}%w!", - "", - "") - ); - - CustomMessageManager::Instance->CreateMessage( - Randomizer::randoMiscHintsTableID, TEXT_MALON_EVERYONE_TURNING_EVIL, - CustomMessage("@? Is that you? ^If I ran the ranch, I'd build an &%rObsticle Course%w, and whoever gets&the best time would win a %rcow%w!^Elsie loves sharing her %g{{item1}}%w&with new people, It'll be fun!^...But Ingo won't let me...", - "", - "") - ); - - CustomMessageManager::Instance->CreateMessage( - Randomizer::randoMiscHintsTableID, TEXT_MALON_INGO_MUST_HAVE_BEEN_TEMPTED, - CustomMessage("@! You should come back in&the morning and try to beat my time&on the %rObsticle Course%w!^If you beat my time, I'll give you&my favourite %rcow%w Elsie and&her toy %g{{item1}}%w!", - "", - "") - ); - - CustomMessageManager::Instance->CreateMessage( - Randomizer::randoMiscHintsTableID, TEXT_HBA_NOT_ON_HORSE, - CustomMessage("Hey, rookie!&Come back on your %rhorse%w&and take on the&%rHorseback Archery%w challenge!^Impress me with a high score of 1000&to win a %g{{item1}}%w&or score 1500 for my&%g{{item2}}%w!", - "", - "") - ); - - CustomMessageManager::Instance->CreateMessage( - Randomizer::randoMiscHintsTableID, TEXT_HBA_INITIAL_EXPLAINATION, - CustomMessage("Hey, rookie!&Want to take on the&%rHorseback Archery%w challenge?^Impress me with a high score of 1000&to win a %g{{item1}}%w&or score 1500 for my&%g{{item2}}%w!\x0B", - "", - "") - ); - - CustomMessageManager::Instance->CreateMessage( - Randomizer::randoMiscHintsTableID, TEXT_HBA_ALREADY_HAVE_1000, - CustomMessage("Hey, newcomer!&Want to take on the&%rHorseback Archery%w challenge?^Prove yourself to be a horsemaster&by scoring 1500 points to win &my %g{{item1}}%w!\x0B", - "", - "") - ); - - CustomMessageManager::Instance->CreateMessage( - Randomizer::randoMiscHintsTableID, TEXT_GF_HBA_SIGN, - CustomMessage("%rHorseback Archery%w Range Prizes:&1000: %g{{item1}}%w&1500: %g{{item2}}%w^@'s Record: %g\x1E\x00%w", - "", - "") - ); - - CustomMessageManager::Instance->CreateMessage( - Randomizer::randoMiscHintsTableID, TEXT_MALON_OBSTICLE_COURSE, - CustomMessage("How about trying your skill on the %rObsticle Course?%w& If you beat my time I'll let you keep my favourite cow Elsie and& her toy %g{{item1}}%w!&x1B&%gLet's go&No thanks%w", - "", - "") - ); - - CustomMessageManager::Instance->CreateMessage( - Randomizer::randoMiscHintsTableID, TEXT_MALON_EVERYONE_TURNING_EVIL, - CustomMessage("@? Is that you? &If I ran the ranch, I'd build an %rObsticle Course%w, and whoever gets the best time would win a cow!& Elsie loves sharing her %g{{item1}}%w&with new people, It'll be fun!&...But Ingo won't let me...", - "", - "") - ); - - CustomMessageManager::Instance->CreateMessage( - Randomizer::randoMiscHintsTableID, TEXT_MALON_INGO_MUST_HAVE_BEEN_TEMPTED, - CustomMessage("@! You should come back in the morning and try to beat my time on the %rObsticle Course%w!&If you beat my time, I'll let you keep Elsie and& her toy %g{{item1}}%w!", - "", - "") - ); - - CustomMessageManager::Instance->CreateMessage(Randomizer::randoMiscHintsTableID, TEXT_WARP_NOCTURNE_OF_SHADOW, - CustomMessage(ctx->GetHint(RH_NOCTURNE_WARP_LOC)->GetText().GetEnglish(), - ctx->GetHint(RH_NOCTURNE_WARP_LOC)->GetText().GetGerman(), - ctx->GetHint(RH_NOCTURNE_WARP_LOC)->GetText().GetFrench())); - CustomMessageManager::Instance->CreateMessage(Randomizer::randoMiscHintsTableID, TEXT_WARP_PRELUDE_OF_LIGHT, - CustomMessage(ctx->GetHint(RH_PRELUDE_WARP_LOC)->GetText().GetEnglish(), - ctx->GetHint(RH_PRELUDE_WARP_LOC)->GetText().GetGerman(), - ctx->GetHint(RH_PRELUDE_WARP_LOC)->GetText().GetFrench())); // Bow Shooting Gallery reminder CustomMessageManager::Instance->CreateMessage(Randomizer::hintMessageTableID, TEXT_SHOOTING_GALLERY_MAN_COME_BACK_WITH_BOW, @@ -428,19 +252,12 @@ void Randomizer::LoadHintMessages() { "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.")); - // Fishing pond pole hint - CustomMessageManager::Instance->CreateMessage( - Randomizer::randoMiscHintsTableID, TEXT_FISHING_POND_START, - CustomMessage(ctx->GetHint(RH_FISHING_POLE)->GetText().GetEnglish(), - ctx->GetHint(RH_FISHING_POLE)->GetText().GetEnglish(), - ctx->GetHint(RH_FISHING_POLE)->GetText().GetFrench()) - ); - CustomMessageManager::Instance->CreateMessage( - Randomizer::randoMiscHintsTableID, TEXT_FISHING_POND_START_MET, - CustomMessage(ctx->GetHint(RH_FISHING_POLE)->GetText().GetEnglish(), - ctx->GetHint(RH_FISHING_POLE)->GetText().GetEnglish(), - ctx->GetHint(RH_FISHING_POLE)->GetText().GetFrench()) - ); + // Warp Song Mysterious text + CustomMessageManager::Instance->CreateMessage(Randomizer::hintMessageTableID, TEXT_WARP_MINUET_OF_FOREST, + CustomMessage("Warp to&#a mysterious place?#&" + CustomMessages::TWO_WAY_CHOICE() + "#OK&No#", + "Zu&#ein mysteriöser Ort#?&" + CustomMessages::TWO_WAY_CHOICE() + "#OK&No#", + "Se téléporter vers&#un endroit mystérieux#?&" + CustomMessages::TWO_WAY_CHOICE() + "#OK!&Non#", + {QM_RED, QM_GREEN})); // Lake Hylia water level system CustomMessageManager::Instance->CreateMessage(Randomizer::hintMessageTableID, TEXT_LAKE_HYLIA_WATER_SWITCH_SIGN, @@ -493,67 +310,38 @@ void Randomizer::LoadMerchantMessages() { // Prices have a chance of being 0, and the "sell" message below doesn't really make sense for a free item, so adding a "free" variation here CustomMessageManager::Instance->CreateMessage(Randomizer::merchantMessageTableID, TEXT_SCRUB_RANDOM_FREE, - CustomMessage("\x12\x38\x82" "All right! You win! In return for&sparing me, I will give you a&%g{{item}}%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{{item}}%w geben!\x07\x10\xA3", - "\x12\x38\x82" "J'me rends! Laisse-moi partir et en&échange, je te donne un &%g{{item}}%w! Vas-y prends le!\x07\x10\xA3")); + CustomMessage("\x12\x38\x82" "All right! You win! In return for&sparing me, I will give you a&%g[[item]]%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[[item]]%w geben!\x07\x10\xA3", + "\x12\x38\x82" "J'me rends! Laisse-moi partir et en&échange, je te donne un &%g[[item]]%w! Vas-y prends le!\x07\x10\xA3")); CustomMessageManager::Instance->CreateMessage(Randomizer::merchantMessageTableID, TEXT_SCRUB_RANDOM, - CustomMessage("\x12\x38\x82" "All right! You win! In return for&sparing me, I will sell you a&%g{{item}}%w!&%r{{price}} Rupees%w it is!\x07\x10\xA3", - "\x12\x38\x82" "Aufgeben! Ich verkaufe dir einen&%g{{item}}%w&für %r{{price}} Rubine%w!\x07\x10\xA3", - "\x12\x38\x82" "J'abandonne! Tu veux bien m'acheter&un %g{{item}}%w?&Ça fera %r{{price}} Rubis%w!\x07\x10\xA3")); + CustomMessage("\x12\x38\x82" "All right! You win! In return for&sparing me, I will sell you a&%g[[item]]%w!&%r[[price]] Rupees%w it is!\x07\x10\xA3", + "\x12\x38\x82" "Aufgeben! Ich verkaufe dir einen&%g[[item]]%w&für %r[[price]] Rubine%w!\x07\x10\xA3", + "\x12\x38\x82" "J'abandonne! Tu veux bien m'acheter&un %g[[item]]%w?&Ça fera %r[[price]] Rubis%w!\x07\x10\xA3")); + + //Carpet Salesman CustomMessageManager::Instance->CreateMessage( - Randomizer::merchantMessageTableID, TEXT_BEAN_SALESMAN_BUY_FOR_10, - CustomMessage(ctx->GetHint(RH_BEAN_SALESMAN)->GetText().GetEnglish(), - ctx->GetHint(RH_BEAN_SALESMAN)->GetText().GetGerman(), - ctx->GetHint(RH_BEAN_SALESMAN)->GetText().GetFrench())); + Randomizer::merchantMessageTableID, TEXT_CARPET_SALESMAN_2, + 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!")); + + // Each shop item has two messages, one for when the cursor is over it, and one for when you select it and are + // prompted buy/don't buy + CustomMessageManager::Instance->CreateMessage( + Randomizer::merchantMessageTableID, TEXT_SHOP_ITEM_RANDOM, + CustomMessage("\x08%r[[item]] [[price]] Rupees&%wSpecial deal! ONE LEFT!&Get it while it lasts!\x0A\x02", + "\x08%r[[item]] [[price]] Rubine&%wSonderangebot! NUR NOCH EINES VERFÜGBAR!&Beeilen Sie sich!\x0A\x02", + "\x08%r[[item]] [[price]] Rubis&%wOffre spéciale! DERNIER EN STOCK!&Faites vite!\x0A\x02")); + CustomMessageManager::Instance->CreateMessage( + Randomizer::merchantMessageTableID, TEXT_SHOP_ITEM_RANDOM_CONFIRM, + CustomMessage("\x08[[item]] [[price]] Rupees\x09&&\x1B%gBuy&Don't buy%w\x09\x02", + "\x08[[item]] [[price]] Rubine\x09&&\x1B%gKaufen&Nicht kaufen%w\x09\x02", + "\x08[[item]] [[price]] Rubis\x09&&\x1B%gAcheter&Ne pas acheter%w\x09\x02")); CustomMessageManager::Instance->CreateMessage( Randomizer::merchantMessageTableID, TEXT_BEAN_SALESMAN_BUY_FOR_100, CustomMessage("I never thought I'd say this, but I'm &selling the last %rMagic Bean%w. %r99%w Rupees...\x1B&%gYes&No%w", - "\x1B&%gJa&Nein%w", - "Je te vends mon dernier %rHaricot&magique%w pour %r99 Rubis%w.\x1B&%gAcheter&Ne pas acheter%w")); - - - //Setup for merchant text boxes - //Medigoron - //RANDOTODO: Implement obscure/ambiguous hints - CustomMessageManager::Instance->CreateMessage( - Randomizer::merchantMessageTableID, TEXT_MEDIGORON, - CustomMessage(ctx->GetHint(RH_MEDIGORON)->GetText().GetEnglish(), - ctx->GetHint(RH_MEDIGORON)->GetText().GetGerman(), - ctx->GetHint(RH_MEDIGORON)->GetText().GetFrench())); - - //Granny Shop - //RANDOTODO: Implement obscure/ambiguous hints - CustomMessageManager::Instance->CreateMessage( - Randomizer::merchantMessageTableID, TEXT_GRANNYS_SHOP, - CustomMessage(ctx->GetHint(RH_GRANNYS_SHOP)->GetText().GetEnglish(), - ctx->GetHint(RH_GRANNYS_SHOP)->GetText().GetGerman(), - ctx->GetHint(RH_GRANNYS_SHOP)->GetText().GetFrench())); - - //Carpet Salesman - //RANDOTODO: Implement obscure/ambiguous hints - CustomMessageManager::Instance->CreateMessage( - Randomizer::merchantMessageTableID, TEXT_CARPET_SALESMAN_1, - CustomMessage(ctx->GetHint(RH_WASTELAND_BOMBCHU_SALESMAN)->GetText().GetEnglish(), - ctx->GetHint(RH_WASTELAND_BOMBCHU_SALESMAN)->GetText().GetGerman(), - ctx->GetHint(RH_WASTELAND_BOMBCHU_SALESMAN)->GetText().GetFrench())); - CustomMessageManager::Instance->CreateMessage( - Randomizer::merchantMessageTableID, TEXT_CARPET_SALESMAN_2, - CustomMessage(ctx->GetHint(RH_WASTELAND_BOMBCHU_SALESMAN_POST)->GetText().GetEnglish(), - ctx->GetHint(RH_WASTELAND_BOMBCHU_SALESMAN_POST)->GetText().GetGerman(), - ctx->GetHint(RH_WASTELAND_BOMBCHU_SALESMAN_POST)->GetText().GetFrench())); - - // Each shop item has two messages, one for when the cursor is over it, and one for when you select it and are - // prompted buy/don't buy - CustomMessageManager::Instance->CreateMessage( - Randomizer::merchantMessageTableID, TEXT_SHOP_ITEM_RANDOM, - CustomMessage("\x08%r{{item}} {{price}} Rupees&%wSpecial deal! ONE LEFT!&Get it while it lasts!\x0A\x02", - "\x08%r{{item}} {{price}} Rubine&%wSonderangebot! NUR NOCH EINES VERFÜGBAR!&Beeilen Sie sich!\x0A\x02", - "\x08%r{{item}} {{price}} Rubis&%wOffre spéciale! DERNIER EN STOCK!&Faites vite!\x0A\x02")); - CustomMessageManager::Instance->CreateMessage( - Randomizer::merchantMessageTableID, TEXT_SHOP_ITEM_RANDOM_CONFIRM, - CustomMessage("\x08{{item}} {{price}} Rupees\x09&&\x1B%gBuy&Don't buy%w\x09\x02", - "\x08{{item}} {{price}} Rubine\x09&&\x1B%gKaufen&Nicht kaufen%w\x09\x02", - "\x08{{item}} {{price}} Rubis\x09&&\x1B%gAcheter&Ne pas acheter%w\x09\x02")); + "\x1B&%gJa&Nein%w", + "Je te vends mon dernier %rHaricot&magique%w pour %r99 Rubis%w.\x1B&%gAcheter&Ne pas acheter%w")); } bool Randomizer::IsTrialRequired(RandomizerInf trial) { @@ -1654,7 +1442,7 @@ Rando::Location* Randomizer::GetCheckObjectFromActor(s16 actorId, s16 sceneNum, case SCENE_TEMPLE_OF_TIME_EXTERIOR_RUINS: switch (actorParams) { case 14342: - specialRc = RC_TOT_LEFT_GOSSIP_STONE; + specialRc = RC_TOT_LEFTMOST_GOSSIP_STONE; break; case 14599: specialRc = RC_TOT_LEFT_CENTER_GOSSIP_STONE; @@ -1663,7 +1451,7 @@ Rando::Location* Randomizer::GetCheckObjectFromActor(s16 actorId, s16 sceneNum, specialRc = RC_TOT_RIGHT_CENTER_GOSSIP_STONE; break; case 15120: - specialRc = RC_TOT_RIGHT_GOSSIP_STONE; + specialRc = RC_TOT_RIGHTMOST_GOSSIP_STONE; break; } break; @@ -1702,11 +1490,11 @@ Rando::Location* Randomizer::GetCheckObjectFromActor(s16 actorId, s16 sceneNum, switch (actorParams) { case 15362: case 14594: - specialRc = RC_JABU_GOSSIP_STONE; + specialRc = RC_ZF_JABU_GOSSIP_STONE; break; case 14849: case 14337: - specialRc = RC_FAIRY_GOSSIP_STONE; + specialRc = RC_ZF_FAIRY_GOSSIP_STONE; break; } break; @@ -2601,109 +2389,51 @@ void RandomizerSettingsWindow::UpdateElement() { } } -CustomMessage Randomizer::ReplaceWithItemName(CustomMessage message, std::string&& toReplace, RandomizerCheck hintedCheck){ - auto ctx = Rando::Context::GetInstance(); - RandomizerGet targetRG = ctx->GetItemLocation(hintedCheck)->GetPlacedRandomizerGet(); - std::array itemName; - if (targetRG == RG_ICE_TRAP) { - targetRG = ctx->overrides[hintedCheck].LooksLike(); - itemName = { - ctx->overrides[hintedCheck].GetTrickName().english, - ctx->overrides[hintedCheck].GetTrickName().french, - ctx->overrides[hintedCheck].GetTrickName().english - }; - } else { - itemName = { - Rando::StaticData::RetrieveItem(targetRG).GetName().english, - Rando::StaticData::RetrieveItem(targetRG).GetName().french, - Rando::StaticData::RetrieveItem(targetRG).GetName().english, - }; - } - message.Replace(std::move(toReplace), std::move(itemName[0]), std::move(itemName[1]), std::move(itemName[2])); - return message; -} - - -CustomMessage Randomizer::GetMiscHintMessage(TextIDs textToGet, RandomizerCheck hintedCheck, RandomizerCheck otherCheck) { - CustomMessage messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::randoMiscHintsTableID, textToGet); - messageEntry = ReplaceWithItemName(messageEntry, "{{item1}}", hintedCheck); - if (otherCheck != RC_UNKNOWN_CHECK){ - messageEntry = ReplaceWithItemName(messageEntry, "{{item2}}", otherCheck); - } - return messageEntry; -} - -CustomMessage Randomizer::GetCursedSkullMessage(s16 params, RandomizerCheck hintedCheck) { - auto ctx = Rando::Context::GetInstance(); - CustomMessage messageEntry = GetMiscHintMessage(TEXT_SKULLTULA_PEOPLE_IM_CURSED, hintedCheck); - messageEntry.Replace("{{params}}", std::to_string(params*10)); - return messageEntry; -} - CustomMessage Randomizer::GetSheikMessage(s16 scene, u16 originalTextId) { auto ctx = Rando::Context::GetInstance(); - CustomMessage messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::hintMessageTableID, originalTextId); + CustomMessage messageEntry; switch (scene) { case SCENE_TEMPLE_OF_TIME: - if (originalTextId == TEXT_SHEIK_NEED_HOOK) { - messageEntry.Replace("{{message}}", + if (!CHECK_DUNGEON_ITEM(DUNGEON_KEY_BOSS, SCENE_GANONS_TOWER)) { + messageEntry = CustomMessage( "@,&meet me at %gGanon's Castle%w&once you obtain the %rkey to his lair%w.", "@, wir treffen uns bei %gGanons Schloß%w,&sobald Du den %rSchlüssel zu&seinem Verließ%w hast.", "Retrouve-moi au %gChâteau de Ganon%w une&fois que tu auras obtenu la&Mrclé de son repaire%w."); } else { - messageEntry.Replace("{{message}}", + messageEntry = 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 (originalTextId == TEXT_SHEIK_NEED_HOOK) { - //If MS shuffle is on, Sheik will hint both MS and LA as long as Link doesn't have both, to prevent hint lockout. - //Otherwise, she'll only give LA hint so only LA is required to move on. - bool needRequirements = GetRandoSettingValue(RSK_SHUFFLE_MASTER_SWORD) ? - (!CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_MASTER) || INV_CONTENT(ITEM_ARROW_LIGHT) != ITEM_ARROW_LIGHT) : - (INV_CONTENT(ITEM_ARROW_LIGHT) != ITEM_ARROW_LIGHT); - if (needRequirements) { - messageEntry.Replace("{{message}}", ctx->GetHint(RH_SHEIK_LIGHT_ARROWS)->GetText().GetEnglish().c_str(), ctx->GetHint(RH_SHEIK_LIGHT_ARROWS)->GetText().GetEnglish().c_str(), ctx->GetHint(RH_SHEIK_LIGHT_ARROWS)->GetText().GetFrench().c_str()); - } else { - messageEntry.Replace("{{message}}", "You are still ill-equipped to&face %rGanondorf%w." + if (ctx->GetOption(RSK_SHEIK_LA_HINT) && INV_CONTENT(ITEM_ARROW_LIGHT) != ITEM_ARROW_LIGHT) { + messageEntry = ctx->GetHint(RH_SHEIK_HINT)->GetHintMessage(MF_AUTO_FORMAT); + } 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)) { + messageEntry = 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 deine 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)) { - messageEntry.Replace("{{message}}", + } else if (!Flags_GetEventChkInf(EVENTCHKINF_DISPELLED_GANONS_TOWER_BARRIER)){ + messageEntry = 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." - ); - - } else { - messageEntry.Replace("{{message}}", + ); + } else { + messageEntry = 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."); - } } break; } return messageEntry; } -CustomMessage Randomizer::GetSariaMessage(u16 originalTextId) { - if (originalTextId == TEXT_SARIA_SFM || (originalTextId >= TEXT_SARIAS_SONG_FACE_TO_FACE && originalTextId <= TEXT_SARIAS_SONG_CHANNELING_POWER)) { - CustomMessage messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::hintMessageTableID, TEXT_SARIAS_SONG_FACE_TO_FACE); - CustomMessage messageEntry2 = messageEntry; - std::string code = originalTextId == TEXT_SARIA_SFM ? "" : "\x0B"; - messageEntry2.Replace("$C", std::move(code)); - return messageEntry2; - } -} - CustomMessage Randomizer::GetFishingPondOwnerMessage(u16 originalTextId) { - CustomMessage hintMessageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::randoMiscHintsTableID, TEXT_FISHING_POND_START); + auto ctx = Rando::Context::GetInstance(); CustomMessage messageEntry = CustomMessage( "Sorry, but the pond is closed.&I've lost my good %rfishing pole%w...&Can't go fishing without it!", "", @@ -2711,7 +2441,7 @@ CustomMessage Randomizer::GetFishingPondOwnerMessage(u16 originalTextId) { ); if (Rando::Context::GetInstance()->GetOption(RSK_FISHING_POLE_HINT)) { - messageEntry = messageEntry + hintMessageEntry; + messageEntry = messageEntry + CustomMessage(ctx->GetHint(RH_FISHING_POLE)->GetHintMessage()); } // if the fishing pond guy doesnt remember me i will cry :( @@ -2723,61 +2453,38 @@ CustomMessage Randomizer::GetFishingPondOwnerMessage(u16 originalTextId) { ) + messageEntry; } - messageEntry.Format(); + messageEntry.Format(); //RANDOTODO why is this needed when it's not elsewhere.... return messageEntry; } CustomMessage Randomizer::GetMerchantMessage(RandomizerInf randomizerInf, u16 textId, bool mysterious) { - auto ctx = Rando::Context::GetInstance(); + auto ctx = Rando::Context::GetInstance(); //RANDOTODO If scrubs are allowed to have ambiguous hints, they need to be RandomiserHint objects for logging CustomMessage messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::merchantMessageTableID, textId); RandomizerCheck rc = GetCheckFromRandomizerInf(randomizerInf); RandomizerGet shopItemGet = ctx->GetItemLocation(rc)->GetPlacedRandomizerGet(); - std::array shopItemName; + CustomMessage shopItemName; if (mysterious) { - shopItemName = { - "mysterious item", - "mysteriösen Gegenstand", - "objet mystérieux" - }; + shopItemName = Rando::StaticData::hintTextTable[RHT_MYSTERIOUS_ITEM].GetHintMessage(); // TODO: This should eventually be replaced with a full fledged trick model & trick name system } else if (shopItemGet == RG_ICE_TRAP) { shopItemGet = ctx->overrides[rc].LooksLike(); - shopItemName = { - std::string(ctx->overrides[rc].GetTrickName().english), - std::string(ctx->overrides[rc].GetTrickName().french), - std::string(ctx->overrides[rc].GetTrickName().english) - }; + shopItemName = CustomMessage(ctx->overrides[rc].GetTrickName()); } else { auto shopItem = Rando::StaticData::RetrieveItem(shopItemGet); - shopItemName = { - shopItem.GetName().english, - shopItem.GetName().french, - shopItem.GetName().english, - }; + shopItemName = {shopItem.GetName()}; } u16 shopItemPrice = ctx->GetItemLocation(rc)->GetPrice(); if (textId == TEXT_SCRUB_RANDOM && shopItemPrice == 0) { messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::merchantMessageTableID, TEXT_SCRUB_RANDOM_FREE); - } else if (textId == TEXT_GRANNYS_SHOP) { - // Capitalize the first letter for the item in Granny's text as the item is the first word presented - for (auto &itemName : shopItemName) { - itemName[0] = std::toupper(itemName[0]); - } } - messageEntry.Replace("{{item}}", std::move(shopItemName[0]), std::move(shopItemName[1]), std::move(shopItemName[2])); - messageEntry.Replace("{{price}}", std::to_string(shopItemPrice)); + messageEntry.Replace("[[item]]", shopItemName); + messageEntry.Replace("[[price]]", std::to_string(shopItemPrice)); return messageEntry; } -static const char* mapGetItemHints[3][2] = { - { " It's ordinary.", " It's masterful!" }, - { "&Sieht aus wie immer.", " &Man kann darauf die Worte&%r\"Master Quest\"%w entziffern..." }, - { "&Elle vous semble %rordinaire%w.", "&Étrange... les mots %r\"Master&Quest\"%w sont gravés dessus." }, -}; - CustomMessage Randomizer::GetMapGetItemMessageWithHint(GetItemEntry itemEntry) { CustomMessage messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::getItemMessageTableID, itemEntry.getItemId); int sceneNum; @@ -2818,11 +2525,11 @@ CustomMessage Randomizer::GetMapGetItemMessageWithHint(GetItemEntry itemEntry) { (GetRandoSettingValue(RSK_MQ_DUNGEON_RANDOM) == RO_MQ_DUNGEONS_SET_NUMBER && GetRandoSettingValue(RSK_MQ_DUNGEON_COUNT) == 12) ) { - messageEntry.Replace("{{typeHint}}", ""); + messageEntry.Replace("[[typeHint]]", ""); } else if (ResourceMgr_IsSceneMasterQuest(sceneNum)) { - messageEntry.Replace("{{typeHint}}", mapGetItemHints[0][1], mapGetItemHints[1][1], mapGetItemHints[2][1]); + messageEntry.Replace("[[typeHint]]", Rando::StaticData::hintTextTable[RHT_DUNGEON_MASTERFUL].GetHintMessage()); } else { - messageEntry.Replace("{{typeHint}}", mapGetItemHints[0][0], mapGetItemHints[1][0], mapGetItemHints[2][0]); + messageEntry.Replace("[[typeHint]]", Rando::StaticData::hintTextTable[RHT_DUNGEON_ORDINARY].GetHintMessage()); } return messageEntry; @@ -2848,16 +2555,16 @@ void CreateRupeeMessages() { for (u8 rupee : rupees) { switch (rupee) { case TEXT_BLUE_RUPEE: - rupeeText = "\x05\x03 5 {{rupee}}\x05\x00"; + rupeeText = "\x05\x03 5 [[rupee]]\x05\x00"; break; case TEXT_RED_RUPEE: - rupeeText = "\x05\x01 20 {{rupee}}\x05\x00"; + rupeeText = "\x05\x01 20 [[rupee]]\x05\x00"; break; case TEXT_PURPLE_RUPEE: - rupeeText = "\x05\x05 50 {{rupee}}\x05\x00"; + rupeeText = "\x05\x05 50 [[rupee]]\x05\x00"; break; case TEXT_HUGE_RUPEE: - rupeeText = "\x05\x06 200 {{rupee}}\x05\x00"; + rupeeText = "\x05\x06 200 [[rupee]]\x05\x00"; break; } customMessageManager->CreateMessage( @@ -2869,37 +2576,38 @@ void CreateRupeeMessages() { CustomMessage Randomizer::GetRupeeMessage(u16 rupeeTextId) { CustomMessage messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::rupeeMessageTableID, rupeeTextId); - messageEntry.Replace("{{rupee}}", RandomElement(englishRupeeNames), - RandomElement(germanRupeeNames), RandomElement(frenchRupeeNames)); + messageEntry.Replace("[[rupee]]", CustomMessage(RandomElement(englishRupeeNames), + RandomElement(germanRupeeNames), + RandomElement(frenchRupeeNames))); return messageEntry; } void CreateTriforcePieceMessages() { CustomMessage TriforcePieceMessages[NUM_TRIFORCE_PIECE_MESSAGES] = { - { "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!" }, + { "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!" }, - { "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!" }, + { "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!" }, - { "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é!" }, + { "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é!" }, - { "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é!" }, + { "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é!" }, { "You completed the %yTriforce of&Courage%w! %gGG%w!", "Das %yTriforce des Mutes%w! Du hast&alle Splitter gefunden. %gGut gemacht%w!", "Vous avez complété la %yTriforce&du Courage%w! %gFélicitations%w!" }, - { "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!" }, + { "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!" }, }; CustomMessageManager* customMessageManager = CustomMessageManager::Instance; customMessageManager->AddCustomMessageTable(Randomizer::triforcePieceMessageTableID); @@ -2932,9 +2640,9 @@ CustomMessage Randomizer::GetTriforcePieceMessage() { CustomMessage messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::triforcePieceMessageTableID, messageIndex); - messageEntry.Replace("{{current}}", std::to_string(current), std::to_string(current), std::to_string(current)); - messageEntry.Replace("{{remaining}}", std::to_string(remaining), std::to_string(remaining), std::to_string(remaining)); - messageEntry.Replace("{{required}}", std::to_string(required), std::to_string(required), std::to_string(required)); + messageEntry.Replace("[[current]]", std::to_string(current)); + messageEntry.Replace("[[remaining]]", std::to_string(remaining)); + messageEntry.Replace("[[required]]", std::to_string(required)); return messageEntry; } @@ -3156,11 +2864,11 @@ void CreateFireTempleGoronMessages() { "je&ressemble à n'importe quel Goron?", }, { - "How long has it been, do you know?^%r{{days}}%w days!?^Oh no, and it's %r\x1F%w?&I have to check on my " + "How long has it been, do you know?^%r[[days]]%w days!?^Oh no, and it's %r\x1F%w?&I have to check on my " "cake!!", - "Weißt du zufällig, wie viele Tage&vergangen sind?^%r{{days}}%w Tage!?^Oh je, und es ist %r\x1F%w Uhr? " + "Weißt du zufällig, wie viele Tage&vergangen sind?^%r[[days]]%w Tage!?^Oh je, und es ist %r\x1F%w Uhr? " "Ich&muss dringend nach meinem Kuchen&sehen!!!", - "Cela fait combien de temps que&je suis enfermé ici?&Non mais je ne vais pas crier.^COMBIEN?! %r{{days}}%w " + "Cela fait combien de temps que&je suis enfermé ici?&Non mais je ne vais pas crier.^COMBIEN?! %r[[days]]%w " "JOURS!?^En plus il est %r\x1F%w...&Il faut vraiment que je rentre...", }, { @@ -3182,11 +2890,11 @@ void CreateFireTempleGoronMessages() { "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 " - "pressed it %b{{a_btn}}%w times.^Wow.", + "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...", + "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 " @@ -3223,8 +2931,8 @@ void CreateFireTempleGoronMessages() { CustomMessage Randomizer::GetGoronMessage(u16 index) { CustomMessage messageEntry = CustomMessageManager::Instance->RetrieveMessage(customMessageTableID, goronIDs[index]); - messageEntry.Replace("{{days}}", std::to_string(gSaveContext.totalDays)); - messageEntry.Replace("{{a_btn}}", std::to_string(gSaveContext.sohStats.count[COUNT_BUTTON_PRESSES_A])); + messageEntry.Replace("[[days]]", std::to_string(gSaveContext.totalDays)); + messageEntry.Replace("[[a_btn]]", std::to_string(gSaveContext.sohStats.count[COUNT_BUTTON_PRESSES_A])); return messageEntry; } @@ -3377,45 +3085,45 @@ void Randomizer::CreateCustomMessages() { "Vous obtenez la %rClé d'or %wdu&%rChâteau de Ganon%w!"), GIMESSAGE(RG_DEKU_TREE_MAP, ITEM_DUNGEON_MAP, - "You found the %gDeku Tree &%wMap!{{typeHint}}", - "Du erhältst die %rKarte%w für den&%gDeku-Baum%w!{{typeHint}}", - "Vous obtenez la %rCarte %wde&l'%gArbre Mojo%w!{{typeHint}}"), + "You found the %gDeku Tree &%wMap![[typeHint]]", + "Du erhältst die %rKarte%w für den&%gDeku-Baum%w![[typeHint]]", + "Vous obtenez la %rCarte %wde&l'%gArbre Mojo%w![[typeHint]]"), GIMESSAGE(RG_DODONGOS_CAVERN_MAP, ITEM_DUNGEON_MAP, - "You found the %rDodongo's Cavern &%wMap!{{typeHint}}", - "Du erhältst die %rKarte%w für&%rDodongos Höhle%w!{{typeHint}}", - "Vous obtenez la %rCarte %wde la&%rCaverne Dodongo%w!{{typeHint}}"), + "You found the %rDodongo's Cavern &%wMap![[typeHint]]", + "Du erhältst die %rKarte%w für&%rDodongos Höhle%w![[typeHint]]", + "Vous obtenez la %rCarte %wde la&%rCaverne Dodongo%w![[typeHint]]"), GIMESSAGE(RG_JABU_JABUS_BELLY_MAP, ITEM_DUNGEON_MAP, - "You found the %bJabu Jabu's Belly &%wMap!{{typeHint}}", - "Du erhältst die %rKarte%w für&%bJabu-Jabus Bauch%w!{{typeHint}}", - "Vous obtenez la %rCarte %wdu &%bVentre de Jabu-Jabu%w!{{typeHint}}"), + "You found the %bJabu Jabu's Belly &%wMap![[typeHint]]", + "Du erhältst die %rKarte%w für&%bJabu-Jabus Bauch%w![[typeHint]]", + "Vous obtenez la %rCarte %wdu &%bVentre de Jabu-Jabu%w![[typeHint]]"), GIMESSAGE(RG_FOREST_TEMPLE_MAP, ITEM_DUNGEON_MAP, - "You found the %gForest Temple &%wMap!{{typeHint}}", - "Du erhältst die %rKarte%w für den&%gWaldtempel%w!{{typeHint}}", - "Vous obtenez la %rCarte %wdu &%gTemple de la Forêt%w!{{typeHint}}"), + "You found the %gForest Temple &%wMap![[typeHint]]", + "Du erhältst die %rKarte%w für den&%gWaldtempel%w![[typeHint]]", + "Vous obtenez la %rCarte %wdu &%gTemple de la Forêt%w![[typeHint]]"), GIMESSAGE(RG_FIRE_TEMPLE_MAP, ITEM_DUNGEON_MAP, - "You found the %rFire Temple &%wMap!{{typeHint}}", - "Du erhältst die %rKarte%w für den&%rFeuertempel%w!{{typeHint}}", - "Vous obtenez la %rCarte %wdu &%rTemple du Feu%w!{{typeHint}}"), + "You found the %rFire Temple &%wMap![[typeHint]]", + "Du erhältst die %rKarte%w für den&%rFeuertempel%w![[typeHint]]", + "Vous obtenez la %rCarte %wdu &%rTemple du Feu%w![[typeHint]]"), GIMESSAGE(RG_WATER_TEMPLE_MAP, ITEM_DUNGEON_MAP, - "You found the %bWater Temple &%wMap!{{typeHint}}", - "Du erhältst die %rKarte%w für den&%bWassertempel%w!{{typeHint}}", - "Vous obtenez la %rCarte %wdu &%bTemple de l'Eau%w!{{typeHint}}"), + "You found the %bWater Temple &%wMap![[typeHint]]", + "Du erhältst die %rKarte%w für den&%bWassertempel%w![[typeHint]]", + "Vous obtenez la %rCarte %wdu &%bTemple de l'Eau%w![[typeHint]]"), GIMESSAGE(RG_SPIRIT_TEMPLE_MAP, ITEM_DUNGEON_MAP, - "You found the %ySpirit Temple &%wMap!{{typeHint}}", - "Du erhältst die %rKarte%w für den&%yGeistertempel%w!{{typeHint}}", - "Vous obtenez la %rCarte %wdu &%yTemple de l'Esprit%w!{{typeHint}}"), + "You found the %ySpirit Temple &%wMap![[typeHint]]", + "Du erhältst die %rKarte%w für den&%yGeistertempel%w![[typeHint]]", + "Vous obtenez la %rCarte %wdu &%yTemple de l'Esprit%w![[typeHint]]"), GIMESSAGE(RG_SHADOW_TEMPLE_MAP, ITEM_DUNGEON_MAP, - "You found the %pShadow Temple &%wMap!{{typeHint}}", - "Du erhältst die %rKarte%w für den&%pSchattentempel%w!{{typeHint}}", - "Vous obtenez la %rCarte %wdu &%pTemple de l'Ombre%w!{{typeHint}}"), + "You found the %pShadow Temple &%wMap![[typeHint]]", + "Du erhältst die %rKarte%w für den&%pSchattentempel%w![[typeHint]]", + "Vous obtenez la %rCarte %wdu &%pTemple de l'Ombre%w![[typeHint]]"), GIMESSAGE(RG_BOTTOM_OF_THE_WELL_MAP, ITEM_DUNGEON_MAP, - "You found the %pBottom of the &Well %wMap!{{typeHint}}", - "Du erhältst die %rKarte%w für den&%pGrund des Brunnens%w!{{typeHint}}", - "Vous obtenez la %rCarte %wdu &%pPuits%w!{{typeHint}}"), + "You found the %pBottom of the &Well %wMap![[typeHint]]", + "Du erhältst die %rKarte%w für den&%pGrund des Brunnens%w![[typeHint]]", + "Vous obtenez la %rCarte %wdu &%pPuits%w![[typeHint]]"), GIMESSAGE(RG_ICE_CAVERN_MAP, ITEM_DUNGEON_MAP, - "You found the %cIce Cavern &%wMap!{{typeHint}}", - "Du erhältst die %rKarte%w für die&%cEishöhle%w!{{typeHint}}", - "Vous obtenez la %rCarte %wde &la %cCaverne Polaire%w!{{typeHint}}"), + "You found the %cIce Cavern &%wMap![[typeHint]]", + "Du erhältst die %rKarte%w für die&%cEishöhle%w![[typeHint]]", + "Vous obtenez la %rCarte %wde &la %cCaverne Polaire%w![[typeHint]]"), GIMESSAGE(RG_DEKU_TREE_COMPASS, ITEM_COMPASS, "You found the %gDeku Tree &%wCompass!", diff --git a/soh/soh/Enhancements/randomizer/randomizer.h b/soh/soh/Enhancements/randomizer/randomizer.h index 5f567cd54..866f4cd7f 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.h +++ b/soh/soh/Enhancements/randomizer/randomizer.h @@ -59,13 +59,9 @@ class Randomizer { ItemObtainability GetItemObtainabilityFromRandomizerCheck(RandomizerCheck randomizerCheck); ItemObtainability GetItemObtainabilityFromRandomizerGet(RandomizerGet randomizerCheck); CustomMessage GetSheikMessage(s16 scene, u16 originalTextId); - CustomMessage ReplaceWithItemName(CustomMessage message, std::string&& toReplace, RandomizerCheck hintedCheck); - CustomMessage GetMiscHintMessage(TextIDs textToGet, RandomizerCheck hintedCheck, RandomizerCheck otherCheck = RC_UNKNOWN_CHECK); - CustomMessage GetSariaMessage(u16 originalTextId); CustomMessage GetFishingPondOwnerMessage(u16 originalTextId); CustomMessage GetMerchantMessage(RandomizerInf randomizerInf, u16 textId, bool mysterious = false); RandomizerCheck GetCheckFromActor(s16 actorId, s16 sceneNum, s16 actorParams); - CustomMessage GetCursedSkullMessage(s16 params, RandomizerCheck hintedCheck); CustomMessage GetGoronMessage(u16 index); CustomMessage GetMapGetItemMessageWithHint(GetItemEntry itemEntry); static void CreateCustomMessages(); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 91906d127..5e651e807 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -38,14 +38,18 @@ typedef enum { } RandomizerCheckStatus; typedef enum { - HINT_TYPE_STATIC, + HINT_TYPE_HINT_KEY, + HINT_TYPE_AREA, + HINT_TYPE_ITEM, HINT_TYPE_TRIAL, - HINT_TYPE_WOTH, // Way of the Hero - HINT_TYPE_BARREN, HINT_TYPE_ENTRANCE, HINT_TYPE_ITEM_AREA, - HINT_TYPE_ITEM_LOCATION, - HINT_TYPE_JUNK, + HINT_TYPE_MERCHANT, + HINT_TYPE_ALTAR_CHILD, + HINT_TYPE_ALTAR_ADULT, + HINT_TYPE_WOTH, // Way of the Hero + HINT_TYPE_FOOLISH, + HINT_TYPE_MESSAGE, HINT_TYPE_MAX } HintType; @@ -90,24 +94,34 @@ typedef enum { RA_MAX } RandomizerArea; +typedef enum { + TK_LIGHT_TRIAL, + TK_FOREST_TRIAL, + TK_FIRE_TRIAL, + TK_WATER_TRIAL, + TK_SPIRIT_TRIAL, + TK_SHADOW_TRIAL, + TK_MAX +} TrialKey; + // Check types based on main settings typedef enum { - RCTYPE_STANDARD, // Base set of rando checks - RCTYPE_SKULL_TOKEN, // Gold Skulltulas - RCTYPE_COW, // Cows - RCTYPE_ADULT_TRADE, // Adult trade quest checks - RCTYPE_FROG_SONG, // Frog song purple rupee checks - RCTYPE_MAP_COMPASS, // Maps/Compasses - RCTYPE_SMALL_KEY, // Small Keys - RCTYPE_GF_KEY, // Gerudo Fortress Keys - RCTYPE_BOSS_KEY, // Boss Keys - RCTYPE_GANON_BOSS_KEY, // Ganon's boss key - RCTYPE_SHOP, // shops - RCTYPE_SCRUB, // scrubs - RCTYPE_MERCHANT, // merchants - RCTYPE_CHEST_GAME, // todo replace this once we implement it, just using it to exclude for now - RCTYPE_LINKS_POCKET, // todo this feels hacky - RCTYPE_GOSSIP_STONE, + RCTYPE_STANDARD, // Base set of rando checks + RCTYPE_SKULL_TOKEN, // Gold Skulltulas + RCTYPE_COW, // Cows + RCTYPE_ADULT_TRADE, // Adult trade quest checks + RCTYPE_FROG_SONG, // Frog song purple rupee checks + RCTYPE_MAP_COMPASS, // Maps/Compasses + RCTYPE_SMALL_KEY, // Small Keys + RCTYPE_GF_KEY, // Gerudo Fortress Keys + RCTYPE_BOSS_KEY, // Boss Keys + RCTYPE_GANON_BOSS_KEY, // Ganon's boss key + RCTYPE_SHOP, // shops + RCTYPE_SCRUB, // scrubs + RCTYPE_MERCHANT, // merchants + RCTYPE_CHEST_GAME, // RANDOTODO replace this once we implement it, just using it to exclude for now + RCTYPE_LINKS_POCKET, // RANDOTODO this feels hacky, replace with better starting items + RCTYPE_GOSSIP_STONE, // RANDOTODO make these into event access RCTYPE_SONG_LOCATION, // Song locations RCTYPE_BOSS_HEART_OR_OTHER_REWARD, // Boss heart container or lesser dungeon rewards (lens, ice arrow) RCTYPE_DUNGEON_REWARD, // Dungeon rewards (blue warps) @@ -1388,46 +1402,46 @@ typedef enum { RC_PIERRE, RC_DELIVER_RUTOS_LETTER, RC_MASTER_SWORD_PEDESTAL, - RC_COLOSSUS_GOSSIP_STONE, - RC_DMC_GOSSIP_STONE, - RC_DMC_UPPER_GROTTO_GOSSIP_STONE, - RC_DMT_GOSSIP_STONE, - RC_DMT_STORMS_GROTTO_GOSSIP_STONE, - RC_DODONGOS_CAVERN_GOSSIP_STONE, - RC_FAIRY_GOSSIP_STONE, - RC_GC_MAZE_GOSSIP_STONE, - RC_GC_MEDIGORON_GOSSIP_STONE, - RC_GV_GOSSIP_STONE, - RC_GY_GOSSIP_STONE, - RC_HC_MALON_GOSSIP_STONE, - RC_HC_ROCK_WALL_GOSSIP_STONE, - RC_HC_STORMS_GROTTO_GOSSIP_STONE, - RC_HF_COW_GROTTO_GOSSIP_STONE, - RC_HF_NEAR_MARKET_GOSSIP_STONE, - RC_HF_OPEN_GROTTO_GOSSIP_STONE, - RC_HF_SOUTHEAST_GOSSIP_STONE, - RC_JABU_GOSSIP_STONE, RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE, RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE, RC_KF_GOSSIP_STONE, - RC_KF_STORMS_GOSSIP_STONE, - RC_KAK_OPEN_GROTTO_GOSSIP_STONE, - RC_LH_LAB_GOSSIP_STONE, - RC_LH_SOUTHEAST_GOSSIP_STONE, - RC_LH_SOUTHWEST_GOSSIP_STONE, + RC_KF_STORMS_GROTTO_GOSSIP_STONE, RC_LW_GOSSIP_STONE, - RC_LW_NEAR_SHORTCUTS_GOSSIP_STONE, + RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE, RC_SFM_MAZE_LOWER_GOSSIP_STONE, RC_SFM_MAZE_UPPER_GOSSIP_STONE, RC_SFM_SARIA_GOSSIP_STONE, + RC_HF_COW_GROTTO_GOSSIP_STONE, + RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE, + RC_HF_OPEN_GROTTO_GOSSIP_STONE, + RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE, RC_TOT_LEFT_CENTER_GOSSIP_STONE, - RC_TOT_LEFT_GOSSIP_STONE, + RC_TOT_LEFTMOST_GOSSIP_STONE, RC_TOT_RIGHT_CENTER_GOSSIP_STONE, - RC_TOT_RIGHT_GOSSIP_STONE, - RC_ZD_GOSSIP_STONE, + RC_TOT_RIGHTMOST_GOSSIP_STONE, + RC_HC_MALON_GOSSIP_STONE, + RC_HC_ROCK_WALL_GOSSIP_STONE, + RC_HC_STORMS_GROTTO_GOSSIP_STONE, + RC_KAK_OPEN_GROTTO_GOSSIP_STONE, + RC_GRAVEYARD_GOSSIP_STONE, + RC_DMT_GOSSIP_STONE, + RC_DMT_STORMS_GROTTO_GOSSIP_STONE, + RC_GC_MAZE_GOSSIP_STONE, + RC_GC_MEDIGORON_GOSSIP_STONE, + RC_DMC_GOSSIP_STONE, + RC_DMC_UPPER_GROTTO_GOSSIP_STONE, RC_ZR_NEAR_DOMAIN_GOSSIP_STONE, RC_ZR_NEAR_GROTTOS_GOSSIP_STONE, RC_ZR_OPEN_GROTTO_GOSSIP_STONE, + RC_ZD_GOSSIP_STONE, + RC_ZF_JABU_GOSSIP_STONE, + RC_ZF_FAIRY_GOSSIP_STONE, + RC_LH_LAB_GOSSIP_STONE, + RC_LH_SOUTHEAST_GOSSIP_STONE, + RC_LH_SOUTHWEST_GOSSIP_STONE, + RC_GV_GOSSIP_STONE, + RC_COLOSSUS_GOSSIP_STONE, + RC_DODONGOS_CAVERN_GOSSIP_STONE, RC_KF_STORMS_GROTTO_BEEHIVE_LEFT, RC_KF_STORMS_GROTTO_BEEHIVE_RIGHT, RC_LW_NEAR_SHORTCUTS_GROTTO_BEEHIVE_LEFT, @@ -1996,75 +2010,83 @@ typedef enum { typedef enum { RH_NONE, - RH_COLOSSUS_GOSSIP_STONE, - RH_DMC_GOSSIP_STONE, - RH_DMC_UPPER_GROTTO_GOSSIP_STONE, - RH_DMT_GOSSIP_STONE, - RH_DMT_STORMS_GROTTO_GOSSIP_STONE, - RH_DODONGOS_CAVERN_GOSSIP_STONE, - RH_ZF_FAIRY_GOSSIP_STONE, - RH_GC_MAZE_GOSSIP_STONE, - RH_GC_MEDIGORON_GOSSIP_STONE, - RH_GV_GOSSIP_STONE, - RH_GRAVEYARD_GOSSIP_STONE, - RH_HC_MALON_GOSSIP_STONE, - RH_HC_ROCK_WALL_GOSSIP_STONE, - RH_HC_STORMS_GROTTO_GOSSIP_STONE, + RH_KF_DEKU_TREE_LEFT_GOSSIP_STONE, + RH_KF_DEKU_TREE_RIGHT_GOSSIP_STONE, + RH_KF_GOSSIP_STONE, + RH_KF_STORMS_GROTTO_GOSSIP_STONE, + RH_LW_GOSSIP_STONE, + RH_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE, + RH_SFM_MAZE_NEAR_LW_GOSSIP_STONE, + RH_SFM_MAZE_CENTER_GOSSIP_STONE, + RH_SFM_SARIA_GOSSIP_STONE, RH_HF_COW_GROTTO_GOSSIP_STONE, RH_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE, RH_HF_OPEN_GROTTO_GOSSIP_STONE, RH_HF_SOUTHEAST_GROTTO_GOSSIP_STONE, - RH_ZF_JABU_GOSSIP_STONE, - RH_KF_DEKU_TREE_GOSSIP_STONE_LEFT, - RH_KF_DEKU_TREE_GOSSIP_STONE_RIGHT, - RH_KF_GOSSIP_STONE, - RH_KF_STORMS_GROTTO_GOSSIP_STONE, + RH_TOT_LEFT_CENTER_GOSSIP_STONE, + RH_TOT_LEFTMOST_GOSSIP_STONE, + RH_TOT_RIGHT_CENTER_GOSSIP_STONE, + RH_TOT_RIGHTMOST_GOSSIP_STONE, + RH_HC_MALON_GOSSIP_STONE, + RH_HC_ROCK_WALL_GOSSIP_STONE, + RH_HC_STORMS_GROTTO_GOSSIP_STONE, RH_KAK_OPEN_GROTTO_GOSSIP_STONE, - RH_LH_LAB_GOSSIP_STONE, - RH_LH_SOUTHEAST_GOSSIP_STONE, - RH_LH_SOUTHWEST_GOSSIP_STONE, - RH_LW_GOSSIP_STONE, - RH_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE, - RH_SFM_MAZE_GOSSIP_STONE_LOWER, - RH_SFM_MAZE_GOSSIP_STONE_UPPER, - RH_SFM_SARIA_GOSSIP_STONE, - RH_TOT_GOSSIP_STONE_LEFT_CENTER, - RH_TOT_GOSSIP_STONE_LEFT, - RH_TOT_GOSSIP_STONE_RIGHT_CENTER, - RH_TOT_GOSSIP_STONE_RIGHT, - RH_ZD_GOSSIP_STONE, + RH_GRAVEYARD_GOSSIP_STONE, + RH_DMT_GOSSIP_STONE, + RH_DMT_STORMS_GROTTO_GOSSIP_STONE, + RH_GC_MAZE_GOSSIP_STONE, + RH_GC_MEDIGORON_GOSSIP_STONE, + RH_DMC_GOSSIP_STONE, + RH_DMC_UPPER_GROTTO_GOSSIP_STONE, RH_ZR_NEAR_DOMAIN_GOSSIP_STONE, RH_ZR_NEAR_GROTTOS_GOSSIP_STONE, RH_ZR_OPEN_GROTTO_GOSSIP_STONE, + RH_ZD_GOSSIP_STONE, + RH_ZF_JABU_GOSSIP_STONE, + RH_ZF_FAIRY_GOSSIP_STONE, + RH_LH_LAB_GOSSIP_STONE, + RH_LH_SOUTHEAST_GOSSIP_STONE, + RH_LH_SOUTHWEST_GOSSIP_STONE, + RH_GV_GOSSIP_STONE, + RH_COLOSSUS_GOSSIP_STONE, + RH_DODONGOS_CAVERN_GOSSIP_STONE, RH_GANONDORF_HINT, - RH_GANONDORF_NOHINT, + RH_GANONDORF_JOKE, + RH_SHEIK_HINT, RH_DAMPES_DIARY, RH_GREG_RUPEE, - RH_BEAN_SALESMAN, - RH_MEDIGORON, - RH_GRANNYS_SHOP, - RH_WASTELAND_BOMBCHU_SALESMAN, - RH_WASTELAND_BOMBCHU_SALESMAN_POST, RH_ALTAR_CHILD, RH_ALTAR_ADULT, - RH_SARIA, + RH_SARIA_HINT, RH_FISHING_POLE, - RH_SHEIK_LIGHT_ARROWS, RH_MINUET_WARP_LOC, RH_BOLERO_WARP_LOC, RH_SERENADE_WARP_LOC, RH_REQUIEM_WARP_LOC, RH_NOCTURNE_WARP_LOC, RH_PRELUDE_WARP_LOC, - RH_FROGS, + RH_MEDIGORON, + RH_CARPET_SALESMAN, + RH_BEAN_SALESMAN, + RH_GRANNY, + RH_HBA_HINT, + RH_MALON_HINT, + RH_CHICKENS_HINT, + RH_BIG_POES_HINT, + RH_BIGGORON_HINT, + RH_FROGS_HINT, + RH_KAK_10_SKULLS_HINT, + RH_KAK_20_SKULLS_HINT, + RH_KAK_30_SKULLS_HINT, + RH_KAK_40_SKULLS_HINT, + RH_KAK_50_SKULLS_HINT, + RH_KAK_100_SKULLS_HINT, RH_MAX, -} RandomizerHintKey; +} RandomizerHint; typedef enum { RHT_NONE, - RHT_PREFIX, RHT_WAY_OF_THE_HERO, - RHT_PLUNDERING, RHT_FOOLISH, RHT_CAN_BE_FOUND_AT, RHT_HOARDS, @@ -3163,7 +3185,6 @@ typedef enum { RHT_BUY_RED_POTION_50, RHT_TRIFORCE, RHT_HINT, - RHT_HINT_MYSTERIOUS, RHT_TYCOON_WALLET, RHT_CHILD_WALLET, RHT_HOOKSHOT, @@ -3208,6 +3229,8 @@ typedef enum { RHT_BRONZE_SCALE, RHT_FISHING_POLE, RHT_EPONA, + RHT_HINT_MYSTERIOUS, + RHT_MYSTERIOUS_ITEM, // Entrances RHT_DESERT_COLOSSUS_TO_COLOSSUS_GROTTO, RHT_GV_GROTTO_LEDGE_TO_GV_OCTOROK_GROTTO, @@ -3367,60 +3390,69 @@ typedef enum { // Trials RHT_SIX_TRIALS, RHT_ZERO_TRIALS, - RHT_FOUR_TO_FIVE_TRIALS, - RHT_ONE_TO_THREE_TRIALS, + RHT_TRIAL_OFF, + RHT_TRIAL_ON, + RHT_LIGHT_TRIAL, + RHT_FOREST_TRIAL, + RHT_FIRE_TRIAL, + RHT_WATER_TRIAL, + RHT_SPIRIT_TRIAL, + RHT_SHADOW_TRIAL, // Altar - RHT_SPIRITUAL_STONE_TEXT_START, + RHT_CHILD_ALTAR_STONES, RHT_CHILD_ALTAR_TEXT_END_DOTOPEN, RHT_CHILD_ALTAR_TEXT_END_DOTSONGONLY, RHT_CHILD_ALTAR_TEXT_END_DOTCLOSED, - RHT_ADULT_ALTAR_TEXT_START, + RHT_ADULT_ALTAR_MEDALLIONS, RHT_ADULT_ALTAR_TEXT_END, - // Validation Line - RHT_VALIDATION_LINE, - // Light Arrow Location - RHT_LIGHT_ARROW_LOCATION_HINT, - RHT_SHEIK_LIGHT_ARROW_HINT, - // Master Sword Location - RHT_MASTER_SWORD_LOCATION_HINT, - RHT_SHEIK_MASTER_SWORD_LOCATION_HINT, - // Your Pocket - RHT_YOUR_POCKET, - // Other Hints - RHT_DAMPE_DIARY01, - RHT_DAMPE_DIARY02, - RHT_GREG_HINT01, - RHT_GREG_HINT02, - RHT_SARIA_TEXT01, - RHT_SARIA_TEXT02, - RHT_WARP_TO, - RHT_WARP_CHOICE, - RHT_FROGS_HINT01, - RHT_FROGS_HINT02, - RHT_FISHING_POLE_HINT01, - RHT_FISHING_POLE_HINT02, - // Ganon Line - RHT_GANON_LINE01, - RHT_GANON_LINE02, - RHT_GANON_LINE03, - RHT_GANON_LINE04, - RHT_GANON_LINE05, - RHT_GANON_LINE06, - RHT_GANON_LINE07, - RHT_GANON_LINE08, - RHT_GANON_LINE09, - RHT_GANON_LINE10, - RHT_GANON_LINE11, - // Merchants - RHT_BEAN_SALESMAN_FIRST, - RHT_BEAN_SALESMAN_SECOND, - RHT_MEDIGORON_DIALOG_FIRST, - RHT_MEDIGORON_DIALOG_SECOND, + // Static Item Hints + RHT_GANONDORF_HINT_LA_ONLY, + RHT_GANONDORF_HINT_MS_ONLY, + RHT_GANONDORF_HINT_LA_AND_MS, + RHT_SHEIK_HINT_LA_ONLY, + RHT_DAMPE_DIARY, + RHT_GREG_HINT, + RHT_SARIA_TALK_HINT, + RHT_SARIA_SONG_HINT, + RHT_FISHING_POLE_HINT, + // Static Entrance Hints + RHT_WARP_SONG, + // Static Location Hints + RHT_MEDIGORON_HINT, RHT_CARPET_SALESMAN_DIALOG_FIRST, RHT_CARPET_SALESMAN_DIALOG_MYSTERIOUS, RHT_CARPET_SALESMAN_DIALOG_HINTED, - RHT_CARPET_SALESMAN_DIALOG_FINAL, - RHT_GRANNY_DIALOG, + RHT_BEAN_SALESMAN_HINT, + RHT_GRANNY_HINT, + RHT_HBA_HINT_SIGN, + RHT_HBA_HINT_NOT_ON_HORSE, + RHT_HBA_HINT_INITIAL, + RHT_HBA_HINT_HAVE_1000, + RHT_MALON_HINT_HOW_IS_EPONA, + RHT_MALON_HINT_OBSTICLE_COURSE, + RHT_MALON_HINT_TURNING_EVIL, + RHT_MALON_HINT_INGO_TEMPTED, + RHT_CHICKENS_HINT, + RHT_BIG_POES_HINT, + RHT_BIGGORON_HINT, + RHT_FROGS_HINT, + RHT_SKULLS_HINT, + // Ganon Line + RHT_GANON_JOKE01, + RHT_GANON_JOKE02, + RHT_GANON_JOKE03, + RHT_GANON_JOKE04, + RHT_GANON_JOKE05, + RHT_GANON_JOKE06, + RHT_GANON_JOKE07, + RHT_GANON_JOKE08, + RHT_GANON_JOKE09, + RHT_GANON_JOKE10, + RHT_GANON_JOKE11, + // Misc utilities + RHT_YOUR_POCKET, + RHT_DUNGEON_ORDINARY, + RHT_DUNGEON_MASTERFUL, RHT_MAX } RandomizerHintTextKey; @@ -3553,7 +3585,8 @@ typedef enum { RSK_ICE_TRAPS, RSK_GOSSIP_STONE_HINTS, RSK_TOT_ALTAR_HINT, - RSK_LIGHT_ARROWS_HINT, + RSK_GANONDORF_HINT, + RSK_SHEIK_LA_HINT, RSK_DAMPES_DIARY_HINT, RSK_GREG_HINT, RSK_SARIA_HINT, @@ -3583,7 +3616,6 @@ typedef enum { RSK_SKIP_CHILD_ZELDA, RSK_STARTING_CONSUMABLES, RSK_FULL_WALLETS, - RSK_LANGUAGE, RSK_SHUFFLE_CHEST_MINIGAME, RSK_CUCCO_COUNT, RSK_BIG_POE_COUNT, @@ -4095,3 +4127,5 @@ typedef enum { TH_MESSAGE_FINISHED, TH_MESSAGE_SURPLUS, } TriforceHuntMessages; + + diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index b664b0898..f00179ef7 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -158,7 +158,8 @@ void Settings::CreateOptions() { mOptions[RSK_HINT_CLARITY] = Option::U8("Hint Clarity", {"Obscure", "Ambiguous", "Clear"}, OptionCategory::Setting, "gRandomizeHintClarity", mOptionDescriptions[RSK_HINT_CLARITY], WidgetType::Combobox, RO_HINT_CLARITY_CLEAR, true, IMFLAG_INDENT); mOptions[RSK_HINT_DISTRIBUTION] = Option::U8("Hint Distribution", {"Useless", "Balanced", "Strong", "Very Strong"}, OptionCategory::Setting, "gRandomizeHintDistribution", mOptionDescriptions[RSK_HINT_DISTRIBUTION], WidgetType::Combobox, RO_HINT_DIST_BALANCED, true, IMFLAG_UNINDENT); mOptions[RSK_TOT_ALTAR_HINT] = Option::Bool("ToT Altar Hint", {"Off", "On"}, OptionCategory::Setting, "gRandomizeAltarHint", mOptionDescriptions[RSK_TOT_ALTAR_HINT], WidgetType::Checkbox, RO_GENERIC_ON, false, IMFLAG_INDENT); - mOptions[RSK_LIGHT_ARROWS_HINT] = Option::Bool("Light Arrow Hint", {"Off", "On"}, OptionCategory::Setting, "gRandomizeLAHint", mOptionDescriptions[RSK_LIGHT_ARROWS_HINT], WidgetType::Checkbox, RO_GENERIC_ON, false, IMFLAG_NONE); + mOptions[RSK_GANONDORF_HINT] = Option::Bool("Ganondorf Hint", {"Off", "On"}, OptionCategory::Setting, "gRandomizeGanondorfHint", mOptionDescriptions[RSK_GANONDORF_HINT], WidgetType::Checkbox, RO_GENERIC_ON, false, IMFLAG_NONE); + mOptions[RSK_SHEIK_LA_HINT] = Option::Bool("Sheik Light Arrow Hint", {"Off", "On"}, OptionCategory::Setting, "gRandomizeSheikLAHint", mOptionDescriptions[RSK_SHEIK_LA_HINT], WidgetType::Checkbox, RO_GENERIC_ON, false, IMFLAG_NONE); mOptions[RSK_DAMPES_DIARY_HINT] = Option::Bool("Dampe's Diary Hint", "gRandomizeDampeHint", mOptionDescriptions[RSK_DAMPES_DIARY_HINT], IMFLAG_NONE); mOptions[RSK_GREG_HINT] = Option::Bool("Greg the Green Rupee Hint", "gRandomizeGregHint", mOptionDescriptions[RSK_GREG_HINT], IMFLAG_NONE); mOptions[RSK_SARIA_HINT] = Option::Bool("Saria's Hint", "gRandomizeSariaHint", mOptionDescriptions[RSK_SARIA_HINT], IMFLAG_NONE); @@ -208,8 +209,6 @@ void Settings::CreateOptions() { mOptions[RSK_ALL_LOCATIONS_REACHABLE] = Option::Bool("All Locations Reachable", {"Off", "On"}, OptionCategory::Setting, "gRandomizeAllLocationsReachable", mOptionDescriptions[RSK_ALL_LOCATIONS_REACHABLE], WidgetType::Checkbox, RO_GENERIC_ON); mOptions[RSK_SKULLS_SUNS_SONG] = Option::Bool("Night Skulltula's Expect Sun's Song", "gRandomizeGsExpectSunsSong", mOptionDescriptions[RSK_SKULLS_SUNS_SONG]); mOptions[RSK_DAMAGE_MULTIPLIER] = Option::U8("Damage Multiplier", {"x1/2", "x1", "x2", "x4", "x8", "x16", "OHKO"}, OptionCategory::Setting, "", "", WidgetType::Slider, RO_DAMAGE_MULTIPLIER_DEFAULT); - - mOptions[RSK_LANGUAGE] = Option::U8("Language", {"English", "German", "French"}, OptionCategory::Setting, "gLanguages", "", WidgetType::Combobox, LANGUAGE_ENG); // clang-format on mExcludeLocationsOptionsGroups.reserve(SPOILER_COLLECTION_GROUP_COUNT); @@ -729,7 +728,8 @@ void Settings::CreateOptions() { }, false, WidgetContainerType::SECTION); mOptionGroups[RSG_EXTRA_HINTS_IMGUI] = OptionGroup::SubGroup("Extra Hints", { &mOptions[RSK_TOT_ALTAR_HINT], - &mOptions[RSK_LIGHT_ARROWS_HINT], + &mOptions[RSK_GANONDORF_HINT], + &mOptions[RSK_SHEIK_LA_HINT], &mOptions[RSK_DAMPES_DIARY_HINT], &mOptions[RSK_GREG_HINT], &mOptions[RSK_SARIA_HINT], @@ -956,7 +956,8 @@ void Settings::CreateOptions() { &mOptions[RSK_HINT_CLARITY], &mOptions[RSK_HINT_DISTRIBUTION], &mOptions[RSK_TOT_ALTAR_HINT], - &mOptions[RSK_LIGHT_ARROWS_HINT], + &mOptions[RSK_GANONDORF_HINT], + &mOptions[RSK_SHEIK_LA_HINT], &mOptions[RSK_DAMPES_DIARY_HINT], &mOptions[RSK_GREG_HINT], &mOptions[RSK_SARIA_HINT], @@ -1173,7 +1174,8 @@ void Settings::CreateOptions() { { "Miscellaneous Settings:Gossip Stone Hints", RSK_GOSSIP_STONE_HINTS }, { "Miscellaneous Settings:Hint Clarity", RSK_HINT_CLARITY }, { "Miscellaneous Settings:ToT Altar Hint", RSK_TOT_ALTAR_HINT }, - { "Miscellaneous Settings:Light Arrow Hint", RSK_LIGHT_ARROWS_HINT }, + { "Miscellaneous Settings:Ganondorf Hint", RSK_GANONDORF_HINT }, + { "Miscellaneous Settings:Sheik Light Arrow Hint", RSK_SHEIK_LA_HINT }, { "Miscellaneous Settings:Dampe's Diary Hint", RSK_DAMPES_DIARY_HINT }, { "Miscellaneous Settings:Greg the Rupee Hint", RSK_GREG_HINT }, { "Miscellaneous Settings:Saria's Hint", RSK_SARIA_HINT }, @@ -2280,7 +2282,8 @@ void Settings::ParseJson(nlohmann::json spoilerFileJson) { case RSK_SUNLIGHT_ARROWS: case RSK_BOMBCHUS_IN_LOGIC: case RSK_TOT_ALTAR_HINT: - case RSK_LIGHT_ARROWS_HINT: + case RSK_GANONDORF_HINT: + case RSK_SHEIK_LA_HINT: case RSK_DAMPES_DIARY_HINT: case RSK_GREG_HINT: case RSK_SARIA_HINT: @@ -2644,7 +2647,7 @@ void Settings::ParseJson(nlohmann::json spoilerFileJson) { ctx->AddExcludedOptions(); for (auto it = jsonExcludedLocations.begin(); it != jsonExcludedLocations.end(); ++it) { - const RandomizerCheck rc = StaticData::SpoilerfileCheckNameToEnum[it.value()]; + const RandomizerCheck rc = Rando::StaticData::locationNameToEnum[it.value()]; ctx->GetItemLocation(rc)->GetExcludedOption()->SetSelectedIndex(RO_GENERIC_ON); } diff --git a/soh/soh/Enhancements/randomizer/static_data.cpp b/soh/soh/Enhancements/randomizer/static_data.cpp new file mode 100644 index 000000000..524ab4700 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/static_data.cpp @@ -0,0 +1,307 @@ +#include +#include "static_data.h" +#include + +namespace Rando { + +std::unordered_map StaticData::hintTypeNames = { + {HINT_TYPE_HINT_KEY, CustomMessage("Message")}, + {HINT_TYPE_AREA, CustomMessage("Area")}, + {HINT_TYPE_ITEM, CustomMessage("Item")}, + {HINT_TYPE_TRIAL, CustomMessage("Trial")}, + {HINT_TYPE_ENTRANCE, CustomMessage("Entrance")}, + {HINT_TYPE_ITEM_AREA, CustomMessage("Item Area")}, + {HINT_TYPE_MERCHANT, CustomMessage("Merchant")}, + {HINT_TYPE_ALTAR_CHILD, CustomMessage("Child Altar")}, + {HINT_TYPE_ALTAR_ADULT, CustomMessage("Adult Altar")}, + {HINT_TYPE_WOTH, CustomMessage("Way of the Hero")}, + {HINT_TYPE_FOOLISH, CustomMessage("Foolish")}, + {HINT_TYPE_MESSAGE, CustomMessage("Hardcoded Message")} +}; + +//RANDOTODO When dynamic grotto check names are done, apply it to these hints +//RANDOTODO Translations +std::unordered_map StaticData::hintNames = { + {RH_NONE, CustomMessage("ERROR HINT")}, + {RH_KF_DEKU_TREE_LEFT_GOSSIP_STONE, CustomMessage("KF Left Near Deku Gossip Stone")}, //RANDOTODO find cardinal direction + {RH_KF_DEKU_TREE_RIGHT_GOSSIP_STONE, CustomMessage("KF Right Near Deku Gossip Stone")}, + {RH_KF_GOSSIP_STONE, CustomMessage("KF Gossip Stone")}, + {RH_KF_STORMS_GROTTO_GOSSIP_STONE, CustomMessage("KF Storms Grotto Gossip Stone")}, + {RH_LW_GOSSIP_STONE, CustomMessage("LW Gossip Stone")}, + {RH_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE, CustomMessage("LW Near Shortcuts Grotto Gossip Stone")}, + {RH_SFM_MAZE_NEAR_LW_GOSSIP_STONE, CustomMessage("SFM Near LW Gossip Stone")}, + {RH_SFM_MAZE_CENTER_GOSSIP_STONE, CustomMessage("SFM Center Gossip Stone")}, + {RH_SFM_SARIA_GOSSIP_STONE, CustomMessage("SFM Near Saria Gossip Stone")}, + {RH_HF_COW_GROTTO_GOSSIP_STONE, CustomMessage("HF Cow Grotto Gossip Stone")}, + {RH_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE, CustomMessage("HF Near Market Grotto Gossip Stone")}, + {RH_HF_OPEN_GROTTO_GOSSIP_STONE, CustomMessage("HF Open Grotto Gossip Stone")}, + {RH_HF_SOUTHEAST_GROTTO_GOSSIP_STONE, CustomMessage("HF Southeast Grotto Gossip Stone")}, + {RH_TOT_LEFT_CENTER_GOSSIP_STONE, CustomMessage("Market Left Center Gossip Stone")}, + {RH_TOT_LEFTMOST_GOSSIP_STONE, CustomMessage("Market Leftmost Center Gossip Stone")}, + {RH_TOT_RIGHT_CENTER_GOSSIP_STONE, CustomMessage("Market Right Center Gossip Stone")}, + {RH_TOT_RIGHTMOST_GOSSIP_STONE, CustomMessage("Market Rightmost Gossip Stone")}, + {RH_HC_MALON_GOSSIP_STONE, CustomMessage("HC Near Malon Gossip Stone")}, + {RH_HC_ROCK_WALL_GOSSIP_STONE, CustomMessage("HC Rock Wall Gossip Stone")}, + {RH_HC_STORMS_GROTTO_GOSSIP_STONE, CustomMessage("HC Storm Grotto Gossip Stone")}, + {RH_KAK_OPEN_GROTTO_GOSSIP_STONE, CustomMessage("Kak Open Grotto Gossip Stone")}, + {RH_GRAVEYARD_GOSSIP_STONE, CustomMessage("Graveyard Gossip Stone")}, + {RH_DMT_GOSSIP_STONE, CustomMessage("DMT Gossip Stone")}, + {RH_DMT_STORMS_GROTTO_GOSSIP_STONE, CustomMessage("DMT Storms Grotto Gossip Stone")}, + {RH_GC_MAZE_GOSSIP_STONE, CustomMessage("GC Maze Gossip Stone")}, + {RH_GC_MEDIGORON_GOSSIP_STONE, CustomMessage("GC Medigoron Gossip Stone")}, + {RH_DMC_GOSSIP_STONE, CustomMessage("DMC Gossip Stone")}, + {RH_DMC_UPPER_GROTTO_GOSSIP_STONE, CustomMessage("DMC Upper Grotto Gossip Stone")}, + {RH_ZR_NEAR_DOMAIN_GOSSIP_STONE, CustomMessage("ZR Near Domain Gossip Stone")}, + {RH_ZR_NEAR_GROTTOS_GOSSIP_STONE, CustomMessage("ZR Near Grottos Gossip Stone")}, + {RH_ZR_OPEN_GROTTO_GOSSIP_STONE, CustomMessage("ZR Open Grotto Gossip Stone")}, + {RH_ZD_GOSSIP_STONE, CustomMessage("ZD Gossip Stone")}, + {RH_ZF_JABU_GOSSIP_STONE, CustomMessage("ZF Near Jabu Gossip Stone")}, + {RH_ZF_FAIRY_GOSSIP_STONE, CustomMessage("ZF Near Fairy Gossip Stone")}, + {RH_LH_LAB_GOSSIP_STONE, CustomMessage("LH Near Lab Gossip Stone")}, + {RH_LH_SOUTHEAST_GOSSIP_STONE, CustomMessage("LH Southeast Gossip Stone")}, + {RH_LH_SOUTHWEST_GOSSIP_STONE, CustomMessage("LH Southwest Gossip Stone")}, + {RH_GV_GOSSIP_STONE, CustomMessage("Gerudo Valley Gossip Stone")}, + {RH_COLOSSUS_GOSSIP_STONE, CustomMessage("Desert Collosus Gossip Stone")}, + {RH_DODONGOS_CAVERN_GOSSIP_STONE, CustomMessage("Dodongo's Cavern Gossip Stone")}, + {RH_GANONDORF_HINT, CustomMessage("Ganondorf Hint")}, + {RH_GANONDORF_JOKE, CustomMessage("Ganondorf Joke")}, + {RH_SHEIK_HINT, CustomMessage("Sheik in Ganons Castle Hint")}, + {RH_DAMPES_DIARY, CustomMessage("Dampe's Diary Hint")}, + {RH_GREG_RUPEE, CustomMessage("Treasure Chest Game Greg Hint")}, + {RH_ALTAR_CHILD, CustomMessage("ToT Altar as Child")}, + {RH_ALTAR_ADULT, CustomMessage("ToT Altar as Adult")}, + {RH_SARIA_HINT, CustomMessage("Saria's Magic Hint")}, + {RH_FISHING_POLE, CustomMessage("Fishing Pole Hint")}, + {RH_MINUET_WARP_LOC, CustomMessage("Minuet of Forest Destination")}, + {RH_BOLERO_WARP_LOC, CustomMessage("Bolero of Fire Destination")}, + {RH_SERENADE_WARP_LOC, CustomMessage("Serenade of Water Destination")}, + {RH_REQUIEM_WARP_LOC, CustomMessage("Requiem of Spirit Destination")}, + {RH_NOCTURNE_WARP_LOC, CustomMessage("Nocturne of Shadow Destination")}, + {RH_PRELUDE_WARP_LOC, CustomMessage("Prelude of Light Destination")}, + {RH_MEDIGORON, CustomMessage("Medigoron Hint")}, + {RH_CARPET_SALESMAN, CustomMessage("Carpet Salseman Hint")}, + {RH_BEAN_SALESMAN, CustomMessage("Bean Salseman Hint")}, + {RH_GRANNY, CustomMessage("Granny Hint")}, + {RH_HBA_HINT, CustomMessage("Horseback Archery Hint")}, + {RH_MALON_HINT, CustomMessage("Malon Hint")}, + {RH_CHICKENS_HINT, CustomMessage("Anju's Child Chickens Hint")}, + {RH_BIG_POES_HINT, CustomMessage("Big Poe Reward Hint")}, + {RH_BIGGORON_HINT, CustomMessage("Biggoron Claim Check Hint")}, + {RH_FROGS_HINT, CustomMessage("Final Frogs in River Hint")}, + {RH_KAK_10_SKULLS_HINT, CustomMessage("10 Skulls Hint")}, + {RH_KAK_20_SKULLS_HINT, CustomMessage("20 Skulls Hint")}, + {RH_KAK_30_SKULLS_HINT, CustomMessage("30 Skulls Hint")}, + {RH_KAK_40_SKULLS_HINT, CustomMessage("40 Skulls Hint")}, + {RH_KAK_50_SKULLS_HINT, CustomMessage("50 Skulls Hint")}, + {RH_KAK_100_SKULLS_HINT, CustomMessage("100 Skulls Hint")} +}; + +std::unordered_map StaticData::gossipStoneCheckToHint { + {RC_COLOSSUS_GOSSIP_STONE, RH_COLOSSUS_GOSSIP_STONE}, + {RC_DMC_GOSSIP_STONE, RH_DMC_GOSSIP_STONE}, + {RC_DMC_UPPER_GROTTO_GOSSIP_STONE, RH_DMC_UPPER_GROTTO_GOSSIP_STONE}, + {RC_DMT_GOSSIP_STONE, RH_DMT_GOSSIP_STONE}, + {RC_DMT_STORMS_GROTTO_GOSSIP_STONE, RH_DMT_STORMS_GROTTO_GOSSIP_STONE}, + {RC_DODONGOS_CAVERN_GOSSIP_STONE, RH_DODONGOS_CAVERN_GOSSIP_STONE}, + {RC_ZF_FAIRY_GOSSIP_STONE, RH_ZF_FAIRY_GOSSIP_STONE}, + {RC_GC_MAZE_GOSSIP_STONE, RH_GC_MAZE_GOSSIP_STONE}, + {RC_GC_MEDIGORON_GOSSIP_STONE, RH_GC_MEDIGORON_GOSSIP_STONE}, + {RC_GV_GOSSIP_STONE, RH_GV_GOSSIP_STONE}, + {RC_GRAVEYARD_GOSSIP_STONE, RH_GRAVEYARD_GOSSIP_STONE}, + {RC_HC_MALON_GOSSIP_STONE, RH_HC_MALON_GOSSIP_STONE}, + {RC_HC_ROCK_WALL_GOSSIP_STONE, RH_HC_ROCK_WALL_GOSSIP_STONE}, + {RC_HC_STORMS_GROTTO_GOSSIP_STONE, RH_HC_STORMS_GROTTO_GOSSIP_STONE}, + {RC_HF_COW_GROTTO_GOSSIP_STONE, RH_HF_COW_GROTTO_GOSSIP_STONE}, + {RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE, RH_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE}, + {RC_HF_OPEN_GROTTO_GOSSIP_STONE, RH_HF_OPEN_GROTTO_GOSSIP_STONE}, + {RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE, RH_HF_SOUTHEAST_GROTTO_GOSSIP_STONE}, + {RC_ZF_JABU_GOSSIP_STONE, RH_ZF_JABU_GOSSIP_STONE}, + {RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE, RH_KF_DEKU_TREE_LEFT_GOSSIP_STONE}, + {RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE, RH_KF_DEKU_TREE_RIGHT_GOSSIP_STONE}, + {RC_KF_GOSSIP_STONE, RH_KF_GOSSIP_STONE}, + {RC_KF_STORMS_GROTTO_GOSSIP_STONE, RH_KF_STORMS_GROTTO_GOSSIP_STONE}, + {RC_KAK_OPEN_GROTTO_GOSSIP_STONE, RH_KAK_OPEN_GROTTO_GOSSIP_STONE}, + {RC_LH_LAB_GOSSIP_STONE, RH_LH_LAB_GOSSIP_STONE}, + {RC_LH_SOUTHEAST_GOSSIP_STONE, RH_LH_SOUTHEAST_GOSSIP_STONE}, + {RC_LH_SOUTHWEST_GOSSIP_STONE, RH_LH_SOUTHWEST_GOSSIP_STONE}, + {RC_LW_GOSSIP_STONE, RH_LW_GOSSIP_STONE}, + {RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE, RH_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE}, + {RC_SFM_MAZE_LOWER_GOSSIP_STONE, RH_SFM_MAZE_NEAR_LW_GOSSIP_STONE}, + {RC_SFM_MAZE_UPPER_GOSSIP_STONE, RH_SFM_MAZE_CENTER_GOSSIP_STONE}, + {RC_SFM_SARIA_GOSSIP_STONE, RH_SFM_SARIA_GOSSIP_STONE}, + {RC_TOT_LEFT_CENTER_GOSSIP_STONE, RH_TOT_LEFT_CENTER_GOSSIP_STONE}, + {RC_TOT_LEFTMOST_GOSSIP_STONE, RH_TOT_LEFTMOST_GOSSIP_STONE}, + {RC_TOT_RIGHT_CENTER_GOSSIP_STONE, RH_TOT_RIGHT_CENTER_GOSSIP_STONE}, + {RC_TOT_RIGHTMOST_GOSSIP_STONE, RH_TOT_RIGHTMOST_GOSSIP_STONE}, + {RC_ZD_GOSSIP_STONE, RH_ZD_GOSSIP_STONE}, + {RC_ZR_NEAR_DOMAIN_GOSSIP_STONE, RH_ZR_NEAR_DOMAIN_GOSSIP_STONE}, + {RC_ZR_NEAR_GROTTOS_GOSSIP_STONE, RH_ZR_NEAR_GROTTOS_GOSSIP_STONE}, + {RC_ZR_OPEN_GROTTO_GOSSIP_STONE, RH_ZR_OPEN_GROTTO_GOSSIP_STONE} +}; + +std::unordered_map StaticData::areaNames = { //RANDOTODO resolve None in area + {RA_NONE, RHT_LINKS_POCKET}, //explicit none in area hints usually means it's a starting item, so say Link's pocket + {RA_LINKS_POCKET, RHT_LINKS_POCKET}, + {RA_KOKIRI_FOREST, RHT_KOKIRI_FOREST}, + {RA_THE_LOST_WOODS, RHT_THE_LOST_WOODS}, + {RA_SACRED_FOREST_MEADOW, RHT_SACRED_FOREST_MEADOW}, + {RA_HYRULE_FIELD, RHT_HYRULE_FIELD}, + {RA_LAKE_HYLIA, RHT_LAKE_HYLIA}, + {RA_GERUDO_VALLEY, RHT_GERUDO_VALLEY}, + {RA_GERUDO_FORTRESS, RHT_GERUDO_FORTRESS}, + {RA_HAUNTED_WASTELAND, RHT_HAUNTED_WASTELAND}, + {RA_DESERT_COLOSSUS, RHT_DESERT_COLOSSUS}, + {RA_THE_MARKET, RHT_THE_MARKET}, + {RA_TEMPLE_OF_TIME, RHT_TEMPLE_OF_TIME}, + {RA_HYRULE_CASTLE, RHT_HYRULE_CASTLE}, + {RA_OUTSIDE_GANONS_CASTLE, RHT_OUTSIDE_GANONS_CASTLE}, + {RA_CASTLE_GROUNDS, RHT_CASTLE_GROUNDS}, + {RA_KAKARIKO_VILLAGE, RHT_KAKARIKO_VILLAGE}, + {RA_THE_GRAVEYARD, RHT_THE_GRAVEYARD}, + {RA_DEATH_MOUNTAIN_TRAIL, RHT_DEATH_MOUNTAIN_TRAIL}, + {RA_GORON_CITY, RHT_GORON_CITY}, + {RA_DEATH_MOUNTAIN_CRATER, RHT_DEATH_MOUNTAIN_CRATER}, + {RA_ZORAS_RIVER, RHT_ZORAS_RIVER}, + {RA_ZORAS_DOMAIN, RHT_ZORAS_DOMAIN}, + {RA_ZORAS_FOUNTAIN, RHT_ZORAS_FOUNTAIN}, + {RA_LON_LON_RANCH, RHT_LON_LON_RANCH}, + {RA_DEKU_TREE, RHT_DEKU_TREE}, + {RA_DODONGOS_CAVERN, RHT_DODONGOS_CAVERN}, + {RA_JABU_JABUS_BELLY, RHT_JABU_JABUS_BELLY}, + {RA_FOREST_TEMPLE, RHT_FOREST_TEMPLE}, + {RA_FIRE_TEMPLE, RHT_FIRE_TEMPLE}, + {RA_WATER_TEMPLE, RHT_WATER_TEMPLE}, + {RA_SPIRIT_TEMPLE, RHT_SPIRIT_TEMPLE}, + {RA_SHADOW_TEMPLE, RHT_SHADOW_TEMPLE}, + {RA_BOTTOM_OF_THE_WELL, RHT_BOTTOM_OF_THE_WELL}, + {RA_ICE_CAVERN, RHT_ICE_CAVERN}, + {RA_GERUDO_TRAINING_GROUND, RHT_GERUDO_TRAINING_GROUND}, + {RA_GANONS_CASTLE, RHT_GANONS_CASTLE} +}; + +std::unordered_map StaticData::trialData = { + {TK_LIGHT_TRIAL, RHT_LIGHT_TRIAL}, + {TK_FOREST_TRIAL, RHT_FOREST_TRIAL}, + {TK_FIRE_TRIAL, RHT_FIRE_TRIAL}, + {TK_WATER_TRIAL, RHT_WATER_TRIAL}, + {TK_SHADOW_TRIAL, RHT_SHADOW_TRIAL}, + {TK_SPIRIT_TRIAL, RHT_SPIRIT_TRIAL} +}; + +std::unordered_map StaticData::staticHintInfoMap = { + // RH_GANONDORF_HINT is special cased due to being different based on master sword shuffle + // Altar hints are special cased due to special hint marking rules + // warp song hints are special cased due to entrences not being done properly yet + // Ganondorf Joke is special Cased as the text is random + {RH_SHEIK_HINT, StaticHintInfo(HINT_TYPE_AREA, {RHT_SHEIK_HINT_LA_ONLY}, RSK_SHEIK_LA_HINT, true, {}, {RG_LIGHT_ARROWS}, {RC_SHEIK_HINT_GC, RC_SHEIK_HINT_MQ_GC}, true)}, + {RH_DAMPES_DIARY, StaticHintInfo(HINT_TYPE_AREA, {RHT_DAMPE_DIARY}, RSK_DAMPES_DIARY_HINT, true, {}, {RG_PROGRESSIVE_HOOKSHOT}, {RC_DAMPE_HINT})}, + {RH_GREG_RUPEE, StaticHintInfo(HINT_TYPE_AREA, {RHT_GREG_HINT}, RSK_GREG_HINT, true, {}, {RG_GREG_RUPEE}, {RC_GREG_HINT})}, + {RH_SARIA_HINT, StaticHintInfo(HINT_TYPE_AREA, {RHT_SARIA_TALK_HINT, RHT_SARIA_SONG_HINT}, RSK_SARIA_HINT, true, {}, {RG_PROGRESSIVE_MAGIC_METER}, {RC_SARIA_SONG_HINT, RC_SONG_FROM_SARIA}, true)}, + {RH_FISHING_POLE, StaticHintInfo(HINT_TYPE_AREA, {RHT_FISHING_POLE_HINT}, RSK_FISHING_POLE_HINT, true, {}, {RG_FISHING_POLE}, {RC_FISHING_POLE_HINT}, true)}, + {RH_MEDIGORON, StaticHintInfo(HINT_TYPE_MERCHANT, {RHT_MEDIGORON_HINT}, RSK_SHUFFLE_MERCHANTS, (uint8_t)RO_SHUFFLE_MERCHANTS_ON_HINT, {RC_GC_MEDIGORON})}, + {RH_GRANNY, StaticHintInfo(HINT_TYPE_MERCHANT, {RHT_GRANNY_HINT}, RSK_SHUFFLE_MERCHANTS, (uint8_t)RO_SHUFFLE_MERCHANTS_ON_HINT, {RC_KAK_GRANNYS_SHOP})}, + {RH_CARPET_SALESMAN, StaticHintInfo(HINT_TYPE_MERCHANT, {RHT_CARPET_SALESMAN_DIALOG_HINTED}, RSK_SHUFFLE_MERCHANTS, (uint8_t)RO_SHUFFLE_MERCHANTS_ON_HINT, {RC_WASTELAND_BOMBCHU_SALESMAN})}, + {RH_BEAN_SALESMAN, StaticHintInfo(HINT_TYPE_MERCHANT, {RHT_BEAN_SALESMAN_HINT}, RSK_SHUFFLE_MAGIC_BEANS, true, {RC_ZR_MAGIC_BEAN_SALESMAN})}, + {RH_HBA_HINT, StaticHintInfo(HINT_TYPE_ITEM, {RHT_HBA_HINT_SIGN, RHT_HBA_HINT_NOT_ON_HORSE, RHT_HBA_HINT_INITIAL, RHT_HBA_HINT_HAVE_1000}, RSK_HBA_HINT, true, {RC_GF_HBA_1000_POINTS, RC_GF_HBA_1500_POINTS})}, + {RH_MALON_HINT, StaticHintInfo(HINT_TYPE_ITEM, {RHT_MALON_HINT_TURNING_EVIL, RHT_MALON_HINT_HOW_IS_EPONA, RHT_MALON_HINT_OBSTICLE_COURSE, RHT_MALON_HINT_INGO_TEMPTED},RSK_MALON_HINT, true, {RC_KF_LINKS_HOUSE_COW})}, + {RH_BIG_POES_HINT, StaticHintInfo(HINT_TYPE_ITEM, {RHT_BIG_POES_HINT}, RSK_BIG_POES_HINT, true, {RC_MARKET_10_BIG_POES})}, + {RH_CHICKENS_HINT, StaticHintInfo(HINT_TYPE_ITEM, {RHT_CHICKENS_HINT}, RSK_CHICKENS_HINT, true, {RC_KAK_ANJU_AS_CHILD})}, + {RH_BIGGORON_HINT, StaticHintInfo(HINT_TYPE_ITEM, {RHT_BIGGORON_HINT}, RSK_BIGGORON_HINT, true, {RC_DMT_TRADE_CLAIM_CHECK})}, + {RH_FROGS_HINT, StaticHintInfo(HINT_TYPE_ITEM, {RHT_FROGS_HINT}, RSK_FROGS_HINT, true, {RC_ZR_FROGS_OCARINA_GAME})}, + {RH_KAK_10_SKULLS_HINT, StaticHintInfo(HINT_TYPE_ITEM, {RHT_SKULLS_HINT}, RSK_KAK_10_SKULLS_HINT, true, {RC_KAK_10_GOLD_SKULLTULA_REWARD}, {}, {}, false, 10)}, + {RH_KAK_20_SKULLS_HINT, StaticHintInfo(HINT_TYPE_ITEM, {RHT_SKULLS_HINT}, RSK_KAK_20_SKULLS_HINT, true, {RC_KAK_20_GOLD_SKULLTULA_REWARD}, {}, {}, false, 20)}, + {RH_KAK_30_SKULLS_HINT, StaticHintInfo(HINT_TYPE_ITEM, {RHT_SKULLS_HINT}, RSK_KAK_30_SKULLS_HINT, true, {RC_KAK_30_GOLD_SKULLTULA_REWARD}, {}, {}, false, 30)}, + {RH_KAK_40_SKULLS_HINT, StaticHintInfo(HINT_TYPE_ITEM, {RHT_SKULLS_HINT}, RSK_KAK_40_SKULLS_HINT, true, {RC_KAK_40_GOLD_SKULLTULA_REWARD}, {}, {}, false, 40)}, + {RH_KAK_50_SKULLS_HINT, StaticHintInfo(HINT_TYPE_ITEM, {RHT_SKULLS_HINT}, RSK_KAK_50_SKULLS_HINT, true, {RC_KAK_50_GOLD_SKULLTULA_REWARD}, {}, {}, false, 50)}, + {RH_KAK_100_SKULLS_HINT, StaticHintInfo(HINT_TYPE_ITEM, {RHT_SKULLS_HINT}, RSK_KAK_100_SKULLS_HINT, true, {RC_KAK_100_GOLD_SKULLTULA_REWARD}, {}, {}, false, 100)} +}; + +std::unordered_map StaticData::PopulateTranslationMap(std::unordered_map input){ + std::unordered_map output = {}; + for (const auto& [key, message] : input) { + std::vector strings = message.GetAllMessages(); + for (std::string string: strings){ + if (output.contains(string)){ + if (output[string] != key){ + SPDLOG_DEBUG("\tREPEATED STRING IN " + message.GetEnglish(MF_CLEAN) + "\n\n"); //RANDOTODO should this cause an error of some kind? + } + } else { + output[string] = key; + } + } + } + return output; +} + +std::unordered_map StaticData::PopulateTranslationMap(std::unordered_map input){ + std::unordered_map output = {}; + for (const auto& [key, text] : input) { + std::vector strings = hintTextTable[text].GetClear().GetAllMessages(); + for (std::string string: strings){ + if (output.contains(string)){ + if (output[string] != key){ + SPDLOG_DEBUG("\tREPEATED STRING WITH " + string + "\n\n"); //RANDOTODO should this cause an error of some kind? + } + } else { + output[string] = key; + } + } + } + return output; +} + +std::unordered_map StaticData::hintNameToEnum = {}; +std::unordered_map StaticData::hintTypeNameToEnum = {}; +std::unordered_map StaticData::areaNameToEnum = {}; +std::unordered_map StaticData::trialNameToEnum = {}; +std::unordered_map StaticData::locationNameToEnum = {}; //is filled in context based on location table, not touching that because of VB + +std::unordered_map StaticData::stoneParamsToHint{ + {0x1, RH_ZF_FAIRY_GOSSIP_STONE}, + {0x2, RH_ZF_JABU_GOSSIP_STONE}, + {0x3, RH_LH_LAB_GOSSIP_STONE}, + {0x4, RH_DMT_GOSSIP_STONE}, + {0x5, RH_DMC_GOSSIP_STONE}, + {0x6, RH_TOT_LEFTMOST_GOSSIP_STONE}, + {0x7, RH_TOT_LEFT_CENTER_GOSSIP_STONE}, + {0x8, RH_LH_SOUTHWEST_GOSSIP_STONE}, + {0x9, RH_ZD_GOSSIP_STONE}, + {0xA, RH_GRAVEYARD_GOSSIP_STONE}, + {0xB, RH_HC_ROCK_WALL_GOSSIP_STONE}, + {0xC, RH_ZR_NEAR_DOMAIN_GOSSIP_STONE}, + {0xD, RH_ZR_NEAR_GROTTOS_GOSSIP_STONE}, + {0xE, RH_TOT_RIGHT_CENTER_GOSSIP_STONE }, + {0xF, RH_LH_SOUTHEAST_GOSSIP_STONE}, + {0x10, RH_TOT_RIGHTMOST_GOSSIP_STONE }, + {0x11, RH_GV_GOSSIP_STONE}, + {0x12, RH_HC_MALON_GOSSIP_STONE}, + {0x13, RH_HC_STORMS_GROTTO_GOSSIP_STONE}, + {0x14, RH_DODONGOS_CAVERN_GOSSIP_STONE}, + {0x15, RH_GC_MAZE_GOSSIP_STONE}, + {0x16, RH_SFM_MAZE_NEAR_LW_GOSSIP_STONE}, + {0x17, RH_SFM_MAZE_CENTER_GOSSIP_STONE}, + //generic grottos all use 0x18, grottoChestParamsToHint is used for conversion + {0x19, RH_GC_MEDIGORON_GOSSIP_STONE}, + {0x1A, RH_COLOSSUS_GOSSIP_STONE}, + {0x1B, RH_HF_COW_GROTTO_GOSSIP_STONE}, + {0x1C, RH_SFM_SARIA_GOSSIP_STONE}, + {0x1D, RH_LW_GOSSIP_STONE}, + {0x1E, RH_KF_GOSSIP_STONE}, + {0x1F, RH_KF_DEKU_TREE_LEFT_GOSSIP_STONE}, + {0x20, RH_KF_DEKU_TREE_RIGHT_GOSSIP_STONE}, +}; + +std::unordered_map StaticData::grottoChestParamsToHint{ + {22944, RH_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE}, + {22978, RH_HF_SOUTHEAST_GROTTO_GOSSIP_STONE}, + {22947, RH_HF_OPEN_GROTTO_GOSSIP_STONE}, + {22964, RH_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE}, + {23255, RH_DMT_STORMS_GROTTO_GOSSIP_STONE}, + {22984, RH_KAK_OPEN_GROTTO_GOSSIP_STONE}, + {22985, RH_ZR_OPEN_GROTTO_GOSSIP_STONE}, + {23802, RH_DMC_UPPER_GROTTO_GOSSIP_STONE}, + {22988, RH_KF_STORMS_GROTTO_GOSSIP_STONE} +}; + +std::array StaticData::hintTextTable = {}; +} \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/static_data.h b/soh/soh/Enhancements/randomizer/static_data.h index 0e5ba4c03..44e1ff1ff 100644 --- a/soh/soh/Enhancements/randomizer/static_data.h +++ b/soh/soh/Enhancements/randomizer/static_data.h @@ -22,25 +22,47 @@ class StaticData { public: static void InitItemTable(); + static void HintTable_Init(); + static void HintTable_Init_Item(); + static void HintTable_Init_Exclude_Overworld(); + static void HintTable_Init_Exclude_Dungeon(); static Item& RetrieveItem(const RandomizerGet rgid); static Item& ItemFromGIID(const int giid); - static std::array& GetItemTable(); + static std::array& GetItemTable();// is there a reason this is a function and not just an exposed table? static void InitLocationTable(); static Location* GetLocation(RandomizerCheck locKey); static std::array& GetLocationTable(); - static std::unordered_map SpoilerfileCheckNameToEnum; - static std::unordered_map SpoilerfileItemNameToEnum; + static std::unordered_map PopulateTranslationMap(std::unordered_map input); + static std::unordered_map PopulateTranslationMap(std::unordered_map input); static std::multimap, RandomizerCheck> CheckFromActorMultimap; static std::vector overworldLocations; static std::vector dungeonRewardLocations; static std::vector> shopLocationLists; static std::vector scrubLocations; static std::vector gossipStoneLocations; - static std::vector otherHintLocations; + static std::vector staticHintLocations; static std::vector pondFishLocations; static std::vector overworldFishLocations; static std::array, 17> randomizerFishingPondFish; static std::unordered_map randomizerGrottoFishMap; + static std::vector oldVerHintOrder; + static uint16_t oldVerGossipStoneStart; + static std::unordered_map locationNameToEnum; + static std::unordered_map itemNameToEnum; + static std::unordered_map hintNames; + static std::unordered_map hintNameToEnum; + static std::unordered_map hintTypeNames; + static std::unordered_map hintTypeNameToEnum; + static std::unordered_map gossipStoneCheckToHint; + static std::unordered_map areaNames; + static std::unordered_map areaNameToEnum; + static std::unordered_map trialData; + static std::unordered_map trialNameToEnum; + static std::unordered_map staticHintInfoMap; + static std::unordered_map stoneParamsToHint; + static std::unordered_map grottoChestParamsToHint; + static std::array hintTextTable; + StaticData(); ~StaticData(); }; diff --git a/soh/soh/Enhancements/randomizer/trial.cpp b/soh/soh/Enhancements/randomizer/trial.cpp index d3fc99951..1110d37d8 100644 --- a/soh/soh/Enhancements/randomizer/trial.cpp +++ b/soh/soh/Enhancements/randomizer/trial.cpp @@ -1,12 +1,21 @@ #include "trial.h" +#include "static_data.h" namespace Rando { -TrialInfo::TrialInfo(Text name_) : name(std::move(name_)) {} +TrialInfo::TrialInfo(RandomizerHintTextKey nameKey_, TrialKey trialKey_) : nameKey(std::move(nameKey_)), trialKey(std::move(trialKey_)) {} TrialInfo::TrialInfo() = default; TrialInfo::~TrialInfo() = default; -Text TrialInfo::GetName() const { - return name; +CustomMessage TrialInfo::GetName() const { + return StaticData::hintTextTable[nameKey].GetHintMessage(); +} + +RandomizerHintTextKey TrialInfo::GetNameKey() const { + return nameKey; +} + +TrialKey TrialInfo::GetTrialKey() const { + return trialKey; } bool TrialInfo::IsSkipped() const { @@ -26,12 +35,9 @@ void TrialInfo::SetAsSkipped() { } Trials::Trials() { - mTrials[FOREST_TRIAL] = TrialInfo(Text{"the Forest Trial", "l'épreuve de la Forêt", "la prueba del bosque"}); - mTrials[FIRE_TRIAL] = TrialInfo(Text{"the Fire Trial", "l'épreuve du Feu", "la prueba del fuego"}); - mTrials[WATER_TRIAL] = TrialInfo(Text{"the Water Trial", "l'épreuve de l'Eau", "la prueba del agua"}); - mTrials[SPIRIT_TRIAL] = TrialInfo(Text{"the Spirit Trial", "l'épreuve de l'Esprit", "la prueba del espíritu"}); - mTrials[SHADOW_TRIAL] = TrialInfo(Text{"the Shadow Trial", "l'épreuve de l'Ombre", "la prueba de las sombras"}); - mTrials[LIGHT_TRIAL] = TrialInfo(Text{"the Light Trial", "l'épreuve de la Lumière", "la prueba de la luz"}); + for (const auto trial : StaticData::trialData){ + mTrials[trial.first] = TrialInfo(trial.second, static_cast(trial.first)); + } } Trials::~Trials() = default; @@ -51,10 +57,10 @@ void Trials::RequireAll() { } } -std::array Trials::GetTrialList() { - std::array trialList{}; +std::vector Trials::GetTrialList() { + std::vector trialList{}; for (size_t i = 0; i < mTrials.size(); i++) { - trialList[i] = &mTrials[i]; + trialList.push_back(&mTrials[i]); } return trialList; } @@ -62,6 +68,7 @@ std::array Trials::GetTrialList() { size_t Trials::GetTrialListSize() const { return mTrials.size(); } + void Trials::ParseJson(nlohmann::json spoilerFileJson) { nlohmann::json trialsJson = spoilerFileJson["requiredTrials"]; for (auto it = trialsJson.begin(); it != trialsJson.end(); ++it) { @@ -75,4 +82,13 @@ void Trials::ParseJson(nlohmann::json spoilerFileJson) { } } } + +std::unordered_map Trials::GetAllTrialHintHeys() const { + std::unordered_map output = {}; + for (auto trial: mTrials){ + output[(uint32_t)trial.GetTrialKey()] = trial.GetNameKey(); + } + return output; +} + } // namespace Rando \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/trial.h b/soh/soh/Enhancements/randomizer/trial.h index 9e282f45d..2cc483898 100644 --- a/soh/soh/Enhancements/randomizer/trial.h +++ b/soh/soh/Enhancements/randomizer/trial.h @@ -1,36 +1,31 @@ #pragma once -#include "3drando/text.hpp" - -#include +#include "randomizerTypes.h" +#include "../custom-message/CustomMessageManager.h" #include +#include "static_data.h" +#include namespace Rando { class TrialInfo { public: - explicit TrialInfo(Text name_); + explicit TrialInfo(RandomizerHintTextKey nameKey_, TrialKey key_); TrialInfo(); ~TrialInfo(); - Text GetName() const; + CustomMessage GetName() const; + RandomizerHintTextKey GetNameKey() const; + TrialKey GetTrialKey() const; bool IsSkipped() const; bool IsRequired() const; void SetAsRequired(); void SetAsSkipped(); private: - Text name; + RandomizerHintTextKey nameKey; + TrialKey trialKey; bool skipped = true; }; -typedef enum { - LIGHT_TRIAL, - FOREST_TRIAL, - FIRE_TRIAL, - WATER_TRIAL, - SPIRIT_TRIAL, - SHADOW_TRIAL, -} TrialKey; - class Trials { public: Trials(); @@ -38,10 +33,11 @@ class Trials { TrialInfo* GetTrial(TrialKey key); void SkipAll(); void RequireAll(); - std::array GetTrialList(); + std::vector GetTrialList(); size_t GetTrialListSize() const; void ParseJson(nlohmann::json spoilerFileJson); + std::unordered_map GetAllTrialHintHeys() const; private: - std::array mTrials; + std::array mTrials; }; } \ No newline at end of file diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 2222d0007..f8c292b59 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -348,8 +348,9 @@ OTRGlobals::OTRGlobals() { loader->RegisterResourceFactory(std::make_shared(), RESOURCE_FORMAT_BINARY, "RawJson", static_cast(SOH::ResourceType::SOH_RawJson), 0); gSaveStateMgr = std::make_shared(); - gRandoContext = Rando::Context::CreateInstance(); gRandoContext->InitStaticData(); + gRandoContext = Rando::Context::CreateInstance(); + Rando::StaticData::InitItemTable();//RANDOTODO make this not rely on context's logic so it can be initialised in InitStaticData gRandoContext->AddExcludedOptions(); gRandoContext->GetSettings()->CreateOptions(); gRandomizer = std::make_shared(); @@ -2245,8 +2246,8 @@ extern "C" float OTRGetDimensionFromRightEdge(float v) { return (SCREEN_WIDTH / 2 + SCREEN_HEIGHT / 2 * OTRGetAspectRatio() - (SCREEN_WIDTH - v)); } -f32 floorf(f32 x); -f32 ceilf(f32 x); +f32 floorf(f32 x);// RANDOTODO False positive error "allowing all exceptions is incompatible with previous function" +f32 ceilf(f32 x); // This gets annoying extern "C" int16_t OTRGetRectDimensionFromLeftEdge(float v) { return ((int)floorf(OTRGetDimensionFromLeftEdge(v))); @@ -2316,15 +2317,7 @@ extern "C" int GetEquipNowMessage(char* buffer, char* src, const int maxBufferSi "%w\x02"); customMessage.Format(); - std::string postfix; - - if (gSaveContext.language == LANGUAGE_FRA) { - postfix = customMessage.GetFrench(); - } else if (gSaveContext.language == LANGUAGE_GER) { - postfix = customMessage.GetGerman(); - } else { - postfix = customMessage.GetEnglish(); - } + std::string postfix = customMessage.GetForCurrentLanguage(); std::string str; std::string FixedBaseStr(src); int RemoveControlChar = FixedBaseStr.find_first_of("\x02"); @@ -2478,6 +2471,7 @@ extern "C" int CustomMessage_RetrieveIfExists(PlayState* play) { CustomMessage messageEntry; s16 actorParams = 0; if (IS_RANDO) { + auto ctx = Rando::Context::GetInstance(); Player* player = GET_PLAYER(play); if (textId == TEXT_RANDOMIZER_CUSTOM_ITEM) { if (player->getItemEntry.getItemId == RG_ICE_TRAP) { @@ -2526,39 +2520,45 @@ extern "C" int CustomMessage_RetrieveIfExists(PlayState* play) { (Randomizer_GetSettingValue(RSK_GOSSIP_STONE_HINTS) == RO_GOSSIP_STONES_NEED_STONE && CHECK_QUEST_ITEM(QUEST_STONE_OF_AGONY)))) { Actor* stone = GET_PLAYER(play)->targetActor; - actorParams = stone->params; - - // if we're in a generic grotto - if (play->sceneNum == SCENE_GROTTOS && actorParams == 14360) { + RandomizerHint stoneHint = RH_NONE; + s16 hintParams = stone->params & 0xFF; + + if (Rando::StaticData::stoneParamsToHint.contains(hintParams)){ + stoneHint = Rando::StaticData::stoneParamsToHint[hintParams]; + } else if (hintParams == 0x18){ // look for the chest in the actorlist to determine // which grotto we're in int numOfActorLists = sizeof(play->actorCtx.actorLists) / sizeof(play->actorCtx.actorLists[0]); for (int i = 0; i < numOfActorLists; i++) { if (play->actorCtx.actorLists[i].length) { - if (play->actorCtx.actorLists[i].head->id == 10) { - // set the params for the hint check to be negative chest params - actorParams = 0 - play->actorCtx.actorLists[i].head->params; + if (play->actorCtx.actorLists[i].head->id == 10 && + Rando::StaticData::grottoChestParamsToHint.contains(play->actorCtx.actorLists[i].head->params)) { + //use the chest params to find the stone hint + stoneHint = Rando::StaticData::grottoChestParamsToHint[play->actorCtx.actorLists[i].head->params]; } } } } - - RandomizerCheck hintCheck = - Randomizer_GetCheckFromActor(stone->id, play->sceneNum, actorParams); - - messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::hintMessageTableID, hintCheck); + if (stoneHint == RH_NONE){ + messageEntry = CustomMessage("INVALID STONE. PARAMS: " + std::to_string(hintParams)); + } else { + messageEntry = ctx->GetHint(stoneHint)->GetHintMessage(MF_AUTO_FORMAT); + } } else if ((textId == TEXT_ALTAR_CHILD || textId == TEXT_ALTAR_ADULT)) { // rando hints at altar - messageEntry = (LINK_IS_ADULT) - ? CustomMessageManager::Instance->RetrieveMessage(Randomizer::hintMessageTableID, TEXT_ALTAR_ADULT) - : CustomMessageManager::Instance->RetrieveMessage(Randomizer::hintMessageTableID, TEXT_ALTAR_CHILD); + messageEntry = (LINK_IS_ADULT) ? ctx->GetHint(RH_ALTAR_ADULT)->GetHintMessage() : ctx->GetHint(RH_ALTAR_CHILD)->GetHintMessage(MF_AUTO_FORMAT); } else if (textId == TEXT_GANONDORF) { - if ((INV_CONTENT(ITEM_ARROW_LIGHT) == ITEM_ARROW_LIGHT && CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_MASTER)) || - !Randomizer_GetSettingValue(RSK_LIGHT_ARROWS_HINT)) { - messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::hintMessageTableID, TEXT_GANONDORF_NOHINT); - } else { - messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::hintMessageTableID, TEXT_GANONDORF); + if (ctx->GetOption(RSK_GANONDORF_HINT)){ + if (ctx->GetOption(RSK_SHUFFLE_MASTER_SWORD) && !CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_MASTER)){ + messageEntry = INV_CONTENT(ITEM_ARROW_LIGHT) == ITEM_ARROW_LIGHT ? + ctx->GetHint(RH_GANONDORF_HINT)->GetHintMessage(MF_AUTO_FORMAT, 1): + ctx->GetHint(RH_GANONDORF_HINT)->GetHintMessage(MF_AUTO_FORMAT, 2); + } else { + messageEntry = INV_CONTENT(ITEM_ARROW_LIGHT) == ITEM_ARROW_LIGHT ? + ctx->GetHint(RH_GANONDORF_JOKE)->GetHintMessage(MF_AUTO_FORMAT): + ctx->GetHint(RH_GANONDORF_HINT)->GetHintMessage(MF_AUTO_FORMAT, 0); + } } } else if (textId == TEXT_SHEIK_NEED_HOOK || textId == TEXT_SHEIK_HAVE_HOOK) { messageEntry = OTRGlobals::Instance->gRandomizer->GetSheikMessage(gPlayState->sceneNum, textId); @@ -2585,74 +2585,131 @@ extern "C" int CustomMessage_RetrieveIfExists(PlayState* play) { } else if (CVarGetInteger("gRandoRelevantNavi", 1) && textId >= TEXT_NAVI_DEKU_TREE_SUMMONS && textId <= TEXT_NAVI_TRY_TO_KEEP_MOVING) { u16 naviTextId = Random(0, NUM_NAVI_MESSAGES); messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::NaviRandoMessageTableID, naviTextId); - } else if (Randomizer_GetSettingValue(RSK_SHUFFLE_MAGIC_BEANS) && textId == TEXT_BEAN_SALESMAN_BUY_FOR_10) { - messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::merchantMessageTableID, TEXT_BEAN_SALESMAN_BUY_FOR_10); - } else if (Randomizer_GetSettingValue(RSK_SHUFFLE_MERCHANTS) != RO_SHUFFLE_MERCHANTS_OFF && (textId == TEXT_MEDIGORON || - (textId == TEXT_GRANNYS_SHOP && !Flags_GetRandomizerInf(RAND_INF_MERCHANTS_GRANNYS_SHOP) && - (Randomizer_GetSettingValue(RSK_SHUFFLE_ADULT_TRADE) || INV_CONTENT(ITEM_CLAIM_CHECK) == ITEM_CLAIM_CHECK)) || - (textId == TEXT_CARPET_SALESMAN_1 && !Flags_GetRandomizerInf(RAND_INF_MERCHANTS_CARPET_SALESMAN)) || - (textId == TEXT_CARPET_SALESMAN_2 && !Flags_GetRandomizerInf(RAND_INF_MERCHANTS_CARPET_SALESMAN)))) { + } + else if (textId == TEXT_BEAN_SALESMAN_BUY_FOR_10 && ctx->GetOption(RSK_SHUFFLE_MAGIC_BEANS)) { + messageEntry = ctx->GetHint(RH_BEAN_SALESMAN)->GetHintMessage(MF_AUTO_FORMAT); + } + else if (textId == TEXT_BEAN_SALESMAN_BUY_FOR_100) { + messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::merchantMessageTableID, TEXT_BEAN_SALESMAN_BUY_FOR_100); + } + else if (textId == TEXT_GRANNYS_SHOP && !Flags_GetRandomizerInf(RAND_INF_MERCHANTS_GRANNYS_SHOP) && Randomizer_GetSettingValue(RSK_SHUFFLE_MERCHANTS) != RO_SHUFFLE_MERCHANTS_OFF && + (ctx->GetOption(RSK_SHUFFLE_ADULT_TRADE) || INV_CONTENT(ITEM_CLAIM_CHECK) == ITEM_CLAIM_CHECK)){ + messageEntry = messageEntry = ctx->GetHint(RH_GRANNY)->GetHintMessage(MF_AUTO_FORMAT); + } + else if (textId == TEXT_MEDIGORON && Randomizer_GetSettingValue(RSK_SHUFFLE_MERCHANTS) != RO_SHUFFLE_MERCHANTS_OFF){ + messageEntry = messageEntry = ctx->GetHint(RH_MEDIGORON)->GetHintMessage(MF_AUTO_FORMAT); + } + else if (textId == TEXT_CARPET_SALESMAN_1 && Randomizer_GetSettingValue(RSK_SHUFFLE_MERCHANTS) != RO_SHUFFLE_MERCHANTS_OFF){ + messageEntry = messageEntry = ctx->GetHint(RH_CARPET_SALESMAN)->GetHintMessage(MF_AUTO_FORMAT); + } + else if (textId == TEXT_CARPET_SALESMAN_2 && Randomizer_GetSettingValue(RSK_SHUFFLE_MERCHANTS) != RO_SHUFFLE_MERCHANTS_OFF){ messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::merchantMessageTableID, textId); - } else if (Randomizer_GetSettingValue(RSK_BOMBCHUS_IN_LOGIC) && - (textId == TEXT_BUY_BOMBCHU_10_DESC || textId == TEXT_BUY_BOMBCHU_10_PROMPT)) { + } + else if ((textId == TEXT_BUY_BOMBCHU_10_DESC || textId == TEXT_BUY_BOMBCHU_10_PROMPT) + && ctx->GetOption(RSK_BOMBCHUS_IN_LOGIC)) { messageEntry = CustomMessageManager::Instance->RetrieveMessage(customMessageTableID, textId); - } else if (textId == TEXT_SKULLTULA_PEOPLE_IM_CURSED) { + } + else if (textId == TEXT_SKULLTULA_PEOPLE_IM_CURSED) { actorParams = GET_PLAYER(play)->targetActor->params; - RandomizerSettingKey rsk = (RandomizerSettingKey)(RSK_KAK_10_SKULLS_HINT + (actorParams - 1)); - if (Randomizer_GetSettingValue(rsk)) { - messageEntry = OTRGlobals::Instance->gRandomizer->GetCursedSkullMessage(actorParams, - OTRGlobals::Instance->gRandomizer->GetCheckFromActor(ACTOR_EN_SSH, SCENE_HOUSE_OF_SKULLTULA, actorParams)); + if (actorParams == 1 && ctx->GetOption(RSK_KAK_10_SKULLS_HINT)){ + messageEntry = ctx->GetHint(RH_KAK_10_SKULLS_HINT)->GetHintMessage(MF_AUTO_FORMAT); + } else if (actorParams == 2 && ctx->GetOption(RSK_KAK_20_SKULLS_HINT)){ + messageEntry = ctx->GetHint(RH_KAK_20_SKULLS_HINT)->GetHintMessage(MF_AUTO_FORMAT); + } else if (actorParams == 3 && ctx->GetOption(RSK_KAK_30_SKULLS_HINT)){ + messageEntry = ctx->GetHint(RH_KAK_30_SKULLS_HINT)->GetHintMessage(MF_AUTO_FORMAT); + } else if (actorParams == 4 && ctx->GetOption(RSK_KAK_40_SKULLS_HINT)){ + messageEntry = ctx->GetHint(RH_KAK_40_SKULLS_HINT)->GetHintMessage(MF_AUTO_FORMAT); + } else if (ctx->GetOption(RSK_KAK_50_SKULLS_HINT)){ + messageEntry = ctx->GetHint(RH_KAK_50_SKULLS_HINT)->GetHintMessage(MF_AUTO_FORMAT); } - } else if (Randomizer_GetSettingValue(RSK_DAMPES_DIARY_HINT) && textId == TEXT_DAMPES_DIARY) { - messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::randoMiscHintsTableID, TEXT_DAMPES_DIARY); - } else if (play->sceneNum == SCENE_TREASURE_BOX_SHOP && - Randomizer_GetSettingValue(RSK_GREG_HINT) && - (textId == TEXT_CHEST_GAME_PROCEED || textId == TEXT_CHEST_GAME_REAL_GAMBLER || textId == TEXT_CHEST_GAME_THANKS_A_LOT)) { - messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::randoMiscHintsTableID, TEXT_CHEST_GAME_PROCEED); - } else if (Randomizer_GetSettingValue(RSK_SHUFFLE_WARP_SONGS) && - (textId >= TEXT_WARP_MINUET_OF_FOREST && textId <= TEXT_WARP_PRELUDE_OF_LIGHT)) { - messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::randoMiscHintsTableID, textId); - } else if (textId == TEXT_LAKE_HYLIA_WATER_SWITCH_NAVI || textId == TEXT_LAKE_HYLIA_WATER_SWITCH_SIGN) { + } else if (textId == TEXT_DAMPES_DIARY && ctx->GetOption(RSK_DAMPES_DIARY_HINT)) { + messageEntry = ctx->GetHint(RH_DAMPES_DIARY)->GetHintMessage(MF_AUTO_FORMAT); + } + else if ((textId == TEXT_CHEST_GAME_PROCEED || textId == TEXT_CHEST_GAME_REAL_GAMBLER || textId == TEXT_CHEST_GAME_THANKS_A_LOT) && + play->sceneNum == SCENE_TREASURE_BOX_SHOP && ctx->GetOption(RSK_GREG_HINT)) { + messageEntry = ctx->GetHint(RH_GREG_RUPEE)->GetHintMessage(MF_AUTO_FORMAT); + } + else if (textId == TEXT_WARP_MINUET_OF_FOREST && ctx->GetOption(RSK_WARP_SONG_HINTS)) { + messageEntry = ctx->GetHint(RH_MINUET_WARP_LOC)->GetHintMessage(MF_FORMATTED); + } + else if (textId == TEXT_WARP_BOLERO_OF_FIRE && ctx->GetOption(RSK_WARP_SONG_HINTS)) { + messageEntry = ctx->GetHint(RH_BOLERO_WARP_LOC)->GetHintMessage(MF_FORMATTED); + } + else if (textId == TEXT_WARP_SERENADE_OF_WATER && ctx->GetOption(RSK_WARP_SONG_HINTS)) { + messageEntry = ctx->GetHint(RH_SERENADE_WARP_LOC)->GetHintMessage(MF_FORMATTED); + } + else if (textId == TEXT_WARP_REQUIEM_OF_SPIRIT && ctx->GetOption(RSK_WARP_SONG_HINTS)) { + messageEntry = ctx->GetHint(RH_REQUIEM_WARP_LOC)->GetHintMessage(MF_FORMATTED); + } + else if (textId == TEXT_WARP_NOCTURNE_OF_SHADOW && ctx->GetOption(RSK_WARP_SONG_HINTS)) { + messageEntry = ctx->GetHint(RH_NOCTURNE_WARP_LOC)->GetHintMessage(MF_FORMATTED); + } + else if (textId == TEXT_WARP_PRELUDE_OF_LIGHT && ctx->GetOption(RSK_WARP_SONG_HINTS)) { + messageEntry = ctx->GetHint(RH_PRELUDE_WARP_LOC)->GetHintMessage(MF_FORMATTED); + } + else if (textId >= TEXT_WARP_MINUET_OF_FOREST && textId <= TEXT_WARP_PRELUDE_OF_LIGHT + && ctx->GetOption(RSK_SHUFFLE_WARP_SONGS)) { + messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::hintMessageTableID, TEXT_WARP_MINUET_OF_FOREST); + } + else if (textId == TEXT_LAKE_HYLIA_WATER_SWITCH_NAVI || textId == TEXT_LAKE_HYLIA_WATER_SWITCH_SIGN) { messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::hintMessageTableID, textId); - } else if (textId == TEXT_SHOOTING_GALLERY_MAN_COME_BACK_WITH_BOW) { + } + else if (textId == TEXT_SHOOTING_GALLERY_MAN_COME_BACK_WITH_BOW) { messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::hintMessageTableID, TEXT_SHOOTING_GALLERY_MAN_COME_BACK_WITH_BOW); - } else if (textId == TEXT_FIRE_TEMPLE_GORON_OWE_YOU_BIG_TIME || (textId >= TEXT_FIRE_TEMPLE_GORON_FALLING_DOORS_SECRET && textId <= TEXT_FIRE_TEMPLE_GORON_SOUNDS_DIFFERENT_SECRET)) { + } + else if (textId == TEXT_FIRE_TEMPLE_GORON_OWE_YOU_BIG_TIME || (textId >= TEXT_FIRE_TEMPLE_GORON_FALLING_DOORS_SECRET && textId <= TEXT_FIRE_TEMPLE_GORON_SOUNDS_DIFFERENT_SECRET)) { u16 choice = Random(0, NUM_GORON_MESSAGES); messageEntry = OTRGlobals::Instance->gRandomizer->GetGoronMessage(choice); - } else if (Randomizer_GetSettingValue(RSK_FROGS_HINT) && textId == TEXT_FROGS_UNDERWATER) { - messageEntry = OTRGlobals::Instance->gRandomizer->GetMiscHintMessage(TEXT_FROGS_UNDERWATER, RC_ZR_FROGS_OCARINA_GAME); - } else if (Randomizer_GetSettingValue(RSK_FISHING_POLE_HINT) && !Flags_GetRandomizerInf(RAND_INF_FISHING_POLE_FOUND) && - (textId == TEXT_FISHING_POND_START || textId == TEXT_FISHING_POND_START_MET)) { + } + else if (textId == TEXT_FROGS_UNDERWATER && ctx->GetOption(RSK_FROGS_HINT)) { + messageEntry = ctx->GetHint(RH_FROGS_HINT)->GetHintMessage(MF_AUTO_FORMAT), TEXTBOX_TYPE_BLUE; + } + else if ((textId == TEXT_FISHING_POND_START || textId == TEXT_FISHING_POND_START_MET) && + ctx->GetOption(RSK_SHUFFLE_FISHING_POLE) && !Flags_GetRandomizerInf(RAND_INF_FISHING_POLE_FOUND)) { messageEntry = OTRGlobals::Instance->gRandomizer->GetFishingPondOwnerMessage(textId); - } else if (Randomizer_GetSettingValue(RSK_SARIA_HINT) && - (gPlayState->sceneNum == SCENE_SACRED_FOREST_MEADOW && textId == TEXT_SARIA_SFM) || (textId >= TEXT_SARIAS_SONG_FACE_TO_FACE && textId <= TEXT_SARIAS_SONG_CHANNELING_POWER)) { - messageEntry = OTRGlobals::Instance->gRandomizer->GetSariaMessage(textId); - } else if (textId == TEXT_BEAN_SALESMAN_BUY_FOR_100) { - messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::merchantMessageTableID, TEXT_BEAN_SALESMAN_BUY_FOR_100); - } else if (Randomizer_GetSettingValue(RSK_BIGGORON_HINT) && (textId == TEXT_BIGGORON_BETTER_AT_SMITHING || textId == TEXT_BIGGORON_WAITING_FOR_YOU || textId == TEXT_BIGGORON_RETURN_AFTER_A_FEW_DAYS)) { - messageEntry = OTRGlobals::Instance->gRandomizer->GetMiscHintMessage(TEXT_BIGGORON_BETTER_AT_SMITHING, RC_DMT_TRADE_CLAIM_CHECK); - } else if (Randomizer_GetSettingValue(RSK_BIG_POES_HINT) && (textId == TEXT_GHOST_SHOP_EXPLAINATION || textId == TEXT_GHOST_SHOP_CARD_HAS_POINTS)) { - messageEntry = OTRGlobals::Instance->gRandomizer->GetMiscHintMessage(TEXT_GHOST_SHOP_CARD_HAS_POINTS, RC_MARKET_10_BIG_POES); - } else if (Randomizer_GetSettingValue(RSK_CHICKENS_HINT) && (textId >= TEXT_ANJU_PLEASE_BRING_MY_CUCCOS_BACK && textId <= TEXT_ANJU_PLEASE_BRING_1_CUCCO)) { - messageEntry = OTRGlobals::Instance->gRandomizer->GetMiscHintMessage(TEXT_ANJU_PLEASE_BRING_MY_CUCCOS_BACK, RC_KAK_ANJU_AS_CHILD); - } else if (Randomizer_GetSettingValue(RSK_MALON_HINT) && (textId == TEXT_MALON_EVERYONE_TURNING_EVIL || textId == TEXT_MALON_I_SING_THIS_SONG)) { - messageEntry = OTRGlobals::Instance->gRandomizer->GetMiscHintMessage(TEXT_MALON_EVERYONE_TURNING_EVIL, RC_KF_LINKS_HOUSE_COW); - } else if (Randomizer_GetSettingValue(RSK_MALON_HINT) && textId == TEXT_MALON_HOW_IS_EPONA_DOING) { - messageEntry = OTRGlobals::Instance->gRandomizer->GetMiscHintMessage(TEXT_MALON_HOW_IS_EPONA_DOING, RC_KF_LINKS_HOUSE_COW); - } else if (Randomizer_GetSettingValue(RSK_MALON_HINT) && textId == TEXT_MALON_OBSTICLE_COURSE) { - messageEntry = OTRGlobals::Instance->gRandomizer->GetMiscHintMessage(TEXT_MALON_OBSTICLE_COURSE, RC_KF_LINKS_HOUSE_COW); - } else if (Randomizer_GetSettingValue(RSK_MALON_HINT) && textId == TEXT_MALON_INGO_MUST_HAVE_BEEN_TEMPTED) { - messageEntry = OTRGlobals::Instance->gRandomizer->GetMiscHintMessage(TEXT_MALON_INGO_MUST_HAVE_BEEN_TEMPTED, RC_KF_LINKS_HOUSE_COW); - } else if (Randomizer_GetSettingValue(RSK_KAK_100_SKULLS_HINT) && textId == TEXT_SKULLTULA_PEOPLE_MAKE_YOU_VERY_RICH) { - messageEntry = OTRGlobals::Instance->gRandomizer->GetCursedSkullMessage(10, RC_KAK_100_GOLD_SKULLTULA_REWARD); - } else if (Randomizer_GetSettingValue(RSK_HBA_HINT) && textId == TEXT_GF_HBA_SIGN) { - messageEntry = OTRGlobals::Instance->gRandomizer->GetMiscHintMessage(TEXT_GF_HBA_SIGN, RC_GF_HBA_1000_POINTS, RC_GF_HBA_1500_POINTS); - } else if (Randomizer_GetSettingValue(RSK_HBA_HINT) && textId == TEXT_HBA_NOT_ON_HORSE) { - messageEntry = OTRGlobals::Instance->gRandomizer->GetMiscHintMessage(TEXT_HBA_NOT_ON_HORSE, RC_GF_HBA_1000_POINTS, RC_GF_HBA_1500_POINTS); - } else if (Randomizer_GetSettingValue(RSK_HBA_HINT) && textId == TEXT_HBA_INITIAL_EXPLAINATION) { - messageEntry = OTRGlobals::Instance->gRandomizer->GetMiscHintMessage(TEXT_HBA_INITIAL_EXPLAINATION, RC_GF_HBA_1000_POINTS, RC_GF_HBA_1500_POINTS); - } else if (Randomizer_GetSettingValue(RSK_HBA_HINT) && textId == TEXT_HBA_ALREADY_HAVE_1000) { - messageEntry = OTRGlobals::Instance->gRandomizer->GetMiscHintMessage(TEXT_HBA_ALREADY_HAVE_1000, RC_GF_HBA_1500_POINTS); + } + else if (textId == TEXT_SARIA_SFM && gPlayState->sceneNum == SCENE_SACRED_FOREST_MEADOW && ctx->GetOption(RSK_SARIA_HINT)){ + messageEntry = ctx->GetHint(RH_SARIA_HINT)->GetHintMessage(MF_AUTO_FORMAT, 0); + } + else if ((textId >= TEXT_SARIAS_SONG_FACE_TO_FACE && textId <= TEXT_SARIAS_SONG_CHANNELING_POWER) && ctx->GetOption(RSK_SARIA_HINT)){ + messageEntry = ctx->GetHint(RH_SARIA_HINT)->GetHintMessage(MF_AUTO_FORMAT, 1); + } + else if (ctx->GetOption(RSK_BIGGORON_HINT) && (textId == TEXT_BIGGORON_BETTER_AT_SMITHING || textId == TEXT_BIGGORON_WAITING_FOR_YOU || + textId == TEXT_BIGGORON_RETURN_AFTER_A_FEW_DAYS || textId == TEXT_BIGGORON_I_MAAAADE_THISSSS)) { + messageEntry = ctx->GetHint(RH_BIGGORON_HINT)->GetHintMessage(MF_AUTO_FORMAT); + } + else if (ctx->GetOption(RSK_BIG_POES_HINT) && (textId == TEXT_GHOST_SHOP_EXPLAINATION || textId == TEXT_GHOST_SHOP_CARD_HAS_POINTS)) { + messageEntry = ctx->GetHint(RH_BIG_POES_HINT)->GetHintMessage(MF_AUTO_FORMAT); + } + else if (ctx->GetOption(RSK_CHICKENS_HINT) && (textId >= TEXT_ANJU_PLEASE_BRING_MY_CUCCOS_BACK && textId <= TEXT_ANJU_PLEASE_BRING_1_CUCCO)) { + messageEntry = ctx->GetHint(RH_CHICKENS_HINT)->GetHintMessage(MF_AUTO_FORMAT); + } + else if ((textId == TEXT_MALON_EVERYONE_TURNING_EVIL || textId == TEXT_MALON_I_SING_THIS_SONG)&& ctx->GetOption(RSK_MALON_HINT)){ + messageEntry = ctx->GetHint(RH_MALON_HINT)->GetHintMessage(MF_AUTO_FORMAT, 0); + } + else if (textId == TEXT_MALON_HOW_IS_EPONA_DOING && ctx->GetOption(RSK_MALON_HINT)){ + messageEntry = ctx->GetHint(RH_MALON_HINT)->GetHintMessage(MF_AUTO_FORMAT, 1); + } + else if (textId == TEXT_MALON_OBSTICLE_COURSE && ctx->GetOption(RSK_MALON_HINT)){ + messageEntry = ctx->GetHint(RH_MALON_HINT)->GetHintMessage(MF_AUTO_FORMAT, 2); + } + else if (textId == TEXT_MALON_INGO_MUST_HAVE_BEEN_TEMPTED && ctx->GetOption(RSK_MALON_HINT)){ + messageEntry = ctx->GetHint(RH_MALON_HINT)->GetHintMessage(MF_AUTO_FORMAT, 3); + } + else if (ctx->GetOption(RSK_KAK_100_SKULLS_HINT) && textId == TEXT_SKULLTULA_PEOPLE_MAKE_YOU_VERY_RICH) { + messageEntry = ctx->GetHint(RH_KAK_100_SKULLS_HINT)->GetHintMessage(MF_AUTO_FORMAT); + } + else if (textId == TEXT_GF_HBA_SIGN && ctx->GetOption(RSK_HBA_HINT)) { + messageEntry = ctx->GetHint(RH_HBA_HINT)->GetHintMessage(MF_AUTO_FORMAT, 0); + } + else if (textId == TEXT_HBA_NOT_ON_HORSE && ctx->GetOption(RSK_HBA_HINT)) { + messageEntry = ctx->GetHint(RH_HBA_HINT)->GetHintMessage(MF_AUTO_FORMAT, 1); + } + else if (textId == TEXT_HBA_INITIAL_EXPLAINATION && ctx->GetOption(RSK_HBA_HINT)) { + messageEntry = ctx->GetHint(RH_HBA_HINT)->GetHintMessage(MF_AUTO_FORMAT, 2); + } + else if (textId == TEXT_HBA_ALREADY_HAVE_1000 && ctx->GetOption(RSK_HBA_HINT)) { + messageEntry = ctx->GetHint(RH_HBA_HINT)->GetHintMessage(MF_AUTO_FORMAT, 3); } } if (textId == TEXT_GS_NO_FREEZE || textId == TEXT_GS_FREEZE) { @@ -2674,16 +2731,16 @@ extern "C" int CustomMessage_RetrieveIfExists(PlayState* play) { // In rando we need to bump the token count by one to show the correct count s16 gsCount = gSaveContext.inventory.gsTokens + (IS_RANDO ? 1 : 0); messageEntry = CustomMessageManager::Instance->RetrieveMessage(customMessageTableID, textId); - messageEntry.Replace("{{gsCount}}", std::to_string(gsCount)); + messageEntry.Replace("[[gsCount]]", std::to_string(gsCount)); } } if (textId == TEXT_HEART_CONTAINER && CVarGetInteger("gInjectItemCounts", 0)) { messageEntry = CustomMessageManager::Instance->RetrieveMessage(customMessageTableID, TEXT_HEART_CONTAINER); - messageEntry.Replace("{{heartContainerCount}}", std::to_string(gSaveContext.sohStats.heartContainers + 1)); + messageEntry.Replace("[[heartContainerCount]]", std::to_string(gSaveContext.sohStats.heartContainers + 1)); } if (textId == TEXT_HEART_PIECE && CVarGetInteger("gInjectItemCounts", 0)) { messageEntry = CustomMessageManager::Instance->RetrieveMessage(customMessageTableID, TEXT_HEART_PIECE); - messageEntry.Replace("{{heartPieceCount}}", std::to_string(gSaveContext.sohStats.heartPieces + 1)); + messageEntry.Replace("[[heartPieceCount]]", std::to_string(gSaveContext.sohStats.heartPieces + 1)); } if (textId == TEXT_MARKET_GUARD_NIGHT && CVarGetInteger("gMarketSneak", 0) && play->sceneNum == SCENE_MARKET_ENTRANCE_NIGHT) { messageEntry = CustomMessageManager::Instance->RetrieveMessage(customMessageTableID, TEXT_MARKET_GUARD_NIGHT); @@ -2695,14 +2752,14 @@ extern "C" int CustomMessage_RetrieveIfExists(PlayState* play) { switch (gSaveContext.language) { case LANGUAGE_FRA: return msgCtx->msgLength = font->msgLength = - CopyStringToCharBuffer(messageEntry.GetFrench(), buffer, maxBufferSize); + CopyStringToCharBuffer(messageEntry.GetFrench(MF_RAW), buffer, maxBufferSize); case LANGUAGE_GER: return msgCtx->msgLength = font->msgLength = - CopyStringToCharBuffer(messageEntry.GetGerman(), buffer, maxBufferSize); + CopyStringToCharBuffer(messageEntry.GetGerman(MF_RAW), buffer, maxBufferSize); case LANGUAGE_ENG: default: return msgCtx->msgLength = font->msgLength = - CopyStringToCharBuffer(messageEntry.GetEnglish(), buffer, maxBufferSize); + CopyStringToCharBuffer(messageEntry.GetEnglish(MF_RAW), buffer, maxBufferSize); } return false; } diff --git a/soh/soh/SaveManager.cpp b/soh/soh/SaveManager.cpp index 598a51139..a164c8a3d 100644 --- a/soh/soh/SaveManager.cpp +++ b/soh/soh/SaveManager.cpp @@ -6,6 +6,8 @@ #include "Enhancements/randomizer/dungeon.h" #include "Enhancements/randomizer/trial.h" #include "soh/util.h" +#include "Enhancements/randomizer/hint.h" +#include "Enhancements/randomizer/item.h" #include "z64.h" #include "functions.h" @@ -57,6 +59,51 @@ std::filesystem::path SaveManager::GetFileTempName(int fileNum) { return sSavePath / ("file" + std::to_string(fileNum + 1) + ".temp"); } +std::vector Rando::StaticData::oldVerHintOrder { + RH_COLOSSUS_GOSSIP_STONE, + RH_DMC_GOSSIP_STONE, + RH_DMC_UPPER_GROTTO_GOSSIP_STONE, + RH_DMT_GOSSIP_STONE, + RH_DMT_STORMS_GROTTO_GOSSIP_STONE, + RH_DODONGOS_CAVERN_GOSSIP_STONE, + RH_ZF_FAIRY_GOSSIP_STONE, + RH_GC_MAZE_GOSSIP_STONE, + RH_GC_MEDIGORON_GOSSIP_STONE, + RH_GV_GOSSIP_STONE, + RH_GRAVEYARD_GOSSIP_STONE, + RH_HC_MALON_GOSSIP_STONE, + RH_HC_ROCK_WALL_GOSSIP_STONE, + RH_HC_STORMS_GROTTO_GOSSIP_STONE, + RH_HF_COW_GROTTO_GOSSIP_STONE, + RH_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE, + RH_HF_OPEN_GROTTO_GOSSIP_STONE, + RH_HF_SOUTHEAST_GROTTO_GOSSIP_STONE, + RH_ZF_JABU_GOSSIP_STONE, + RH_KF_DEKU_TREE_LEFT_GOSSIP_STONE, + RH_KF_DEKU_TREE_RIGHT_GOSSIP_STONE, + RH_KF_GOSSIP_STONE, + RH_KF_STORMS_GROTTO_GOSSIP_STONE, + RH_KAK_OPEN_GROTTO_GOSSIP_STONE, + RH_LH_LAB_GOSSIP_STONE, + RH_LH_SOUTHEAST_GOSSIP_STONE, + RH_LH_SOUTHWEST_GOSSIP_STONE, + RH_LW_GOSSIP_STONE, + RH_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE, + RH_SFM_MAZE_NEAR_LW_GOSSIP_STONE, + RH_SFM_MAZE_CENTER_GOSSIP_STONE, + RH_SFM_SARIA_GOSSIP_STONE, + RH_TOT_LEFT_CENTER_GOSSIP_STONE, + RH_TOT_LEFTMOST_GOSSIP_STONE, + RH_TOT_RIGHT_CENTER_GOSSIP_STONE, + RH_TOT_RIGHTMOST_GOSSIP_STONE, + RH_ZD_GOSSIP_STONE, + RH_ZR_NEAR_DOMAIN_GOSSIP_STONE, + RH_ZR_NEAR_GROTTOS_GOSSIP_STONE, + RH_ZR_OPEN_GROTTO_GOSSIP_STONE, +}; + +uint16_t Rando::StaticData::oldVerGossipStoneStart = 740; + SaveManager::SaveManager() { coreSectionIDsByName["base"] = SECTION_ID_BASE; coreSectionIDsByName["randomizer"] = SECTION_ID_RANDOMIZER; @@ -106,6 +153,7 @@ SaveManager::SaveManager() { } } +// RANDOTODO should we just have dummy functions that raise warnings instead if these aren't supported? void SaveManager::LoadRandomizerVersion1() { auto randoContext = Rando::Context::GetInstance(); RandomizerCheck location = RC_UNKNOWN_CHECK; @@ -140,32 +188,33 @@ void SaveManager::LoadRandomizerVersion1() { for (int j = 0; j < ARRAY_COUNT(hintText); j++) { SaveManager::Instance->LoadData("ht" + std::to_string(i) + "-" + std::to_string(j), hintText[j]); } - randoContext->AddHint(RandomizerHintKey(check - RC_COLOSSUS_GOSSIP_STONE + 1), Text(hintText), RC_UNKNOWN_CHECK, HINT_TYPE_STATIC, "Static"); + RandomizerHint stoneHint = Rando::StaticData::oldVerHintOrder[Rando::StaticData::oldVerGossipStoneStart]; + randoContext->AddHint(stoneHint, Rando::Hint(stoneHint, {CustomMessage(hintText)})); } char childAltarText[250]; for (int i = 0; i < ARRAY_COUNT(childAltarText); i++) { SaveManager::Instance->LoadData("cat" + std::to_string(i), childAltarText[i]); } - randoContext->AddHint(RH_ALTAR_CHILD, Text(childAltarText), RC_UNKNOWN_CHECK, HINT_TYPE_STATIC, "Static"); + randoContext->AddHint(RH_ALTAR_CHILD, Rando::Hint(RH_ALTAR_CHILD, {CustomMessage(childAltarText)})); char adultAltarText[750]; for (int i = 0; i < ARRAY_COUNT(adultAltarText); i++) { SaveManager::Instance->LoadData("aat" + std::to_string(i), adultAltarText[i]); } - randoContext->AddHint(RH_ALTAR_ADULT, Text(adultAltarText), RC_UNKNOWN_CHECK, HINT_TYPE_STATIC, "Static"); + randoContext->AddHint(RH_ALTAR_ADULT, Rando::Hint(RH_ALTAR_ADULT, {CustomMessage(adultAltarText)})); char ganonHintText[150]; for (int i = 0; i < ARRAY_COUNT(ganonHintText); i++) { SaveManager::Instance->LoadData("ght" + std::to_string(i), ganonHintText[i]); } - randoContext->AddHint(RH_GANONDORF_HINT, Text(ganonHintText), RC_UNKNOWN_CHECK, HINT_TYPE_STATIC, "Static"); + randoContext->AddHint(RH_GANONDORF_HINT, Rando::Hint(RH_GANONDORF_HINT, {CustomMessage(ganonHintText)})); char ganonText[250]; for (int i = 0; i < ARRAY_COUNT(ganonText); i++) { SaveManager::Instance->LoadData("gt" + std::to_string(i), ganonText[i]); } - randoContext->AddHint(RH_GANONDORF_NOHINT, Text(ganonText), RC_UNKNOWN_CHECK, HINT_TYPE_STATIC, "Static"); + randoContext->AddHint(RH_GANONDORF_JOKE, Rando::Hint(RH_GANONDORF_JOKE, {CustomMessage(ganonText)})); SaveManager::Instance->LoadData("adultTradeItems", gSaveContext.adultTradeItems); @@ -193,6 +242,7 @@ void SaveManager::LoadRandomizerVersion1() { }); } +//RANDOTODO if we actually support this, be less lazy void SaveManager::LoadRandomizerVersion2() { auto randoContext = Rando::Context::GetInstance(); SaveManager::Instance->LoadArray("itemLocations", RC_MAX, [&](size_t i) { @@ -244,56 +294,57 @@ void SaveManager::LoadRandomizerVersion2() { if (rc != RC_UNKNOWN_CHECK) { std::string hintText; SaveManager::Instance->LoadData("hintText", hintText); - randoContext->AddHint(RandomizerHintKey(rc - RC_COLOSSUS_GOSSIP_STONE + 1), Text(hintText), RC_UNKNOWN_CHECK, HINT_TYPE_STATIC, "Static"); + RandomizerHint stoneHint = Rando::StaticData::oldVerHintOrder[Rando::StaticData::oldVerGossipStoneStart]; + randoContext->AddHint(stoneHint, Rando::Hint(stoneHint, {CustomMessage(hintText)})); } }); }); std::string childAltarText; SaveManager::Instance->LoadData("childAltarText", childAltarText); - randoContext->AddHint(RH_ALTAR_CHILD, Text(childAltarText), RC_UNKNOWN_CHECK, HINT_TYPE_STATIC, "Static"); + randoContext->AddHint(RH_ALTAR_CHILD, Rando::Hint(RH_ALTAR_CHILD, {CustomMessage(childAltarText)})); std::string adultAltarText; SaveManager::Instance->LoadData("adultAltarText", adultAltarText); - randoContext->AddHint(RH_ALTAR_ADULT, Text(adultAltarText), RC_UNKNOWN_CHECK, HINT_TYPE_STATIC, "Static"); + randoContext->AddHint(RH_ALTAR_ADULT, Rando::Hint(RH_ALTAR_ADULT, {CustomMessage(adultAltarText)})); std::string ganonHintText; SaveManager::Instance->LoadData("ganonHintText", ganonHintText); - randoContext->AddHint(RH_GANONDORF_HINT, Text(ganonHintText), RC_UNKNOWN_CHECK, HINT_TYPE_STATIC, "Static"); + randoContext->AddHint(RH_GANONDORF_HINT, Rando::Hint(RH_GANONDORF_HINT, {CustomMessage(ganonHintText)})); std::string ganonText; SaveManager::Instance->LoadData("ganonText", ganonText); - randoContext->AddHint(RH_GANONDORF_NOHINT, Text(ganonText), RC_UNKNOWN_CHECK, HINT_TYPE_STATIC, "Static"); + randoContext->AddHint(RH_GANONDORF_JOKE, Rando::Hint(RH_GANONDORF_JOKE, {CustomMessage(ganonText)})); std::string dampeText; SaveManager::Instance->LoadData("dampeText", dampeText); - randoContext->AddHint(RH_DAMPES_DIARY, Text(dampeText), RC_UNKNOWN_CHECK, HINT_TYPE_STATIC, "Static"); + randoContext->AddHint(RH_DAMPES_DIARY, Rando::Hint(RH_DAMPES_DIARY, {CustomMessage(dampeText)})); std::string gregHintText; SaveManager::Instance->LoadData("gregHintText", gregHintText); - randoContext->AddHint(RH_GREG_RUPEE, Text(gregHintText), RC_UNKNOWN_CHECK, HINT_TYPE_STATIC, "Static"); + randoContext->AddHint(RH_GREG_RUPEE, Rando::Hint(RH_GREG_RUPEE, {CustomMessage(gregHintText)})); std::string sheikText; SaveManager::Instance->LoadData("sheikText", sheikText); - randoContext->AddHint(RH_SHEIK_LIGHT_ARROWS, Text(sheikText), RC_UNKNOWN_CHECK, HINT_TYPE_STATIC, "Static"); + randoContext->AddHint(RH_SHEIK_HINT, Rando::Hint(RH_SHEIK_HINT, {CustomMessage(sheikText)})); std::string sariaText; SaveManager::Instance->LoadData("sariaText", sariaText); - randoContext->AddHint(RH_SARIA, Text(sariaText), RC_UNKNOWN_CHECK, HINT_TYPE_STATIC, "Static"); + randoContext->AddHint(RH_SARIA_HINT, Rando::Hint(RH_SARIA_HINT, {CustomMessage(sariaText)})); std::string fishingPoleText; SaveManager::Instance->LoadData("fishingPoleText", fishingPoleText); - randoContext->AddHint(RH_FISHING_POLE, Text(fishingPoleText), RC_UNKNOWN_CHECK, HINT_TYPE_STATIC, "Static"); + randoContext->AddHint(RH_FISHING_POLE, Rando::Hint(RH_FISHING_POLE, {CustomMessage(fishingPoleText)})); std::string warpMinuetText; SaveManager::Instance->LoadData("warpMinuetText", warpMinuetText); - randoContext->AddHint(RH_MINUET_WARP_LOC, Text(warpMinuetText), RC_UNKNOWN_CHECK, HINT_TYPE_STATIC, "Static", randoContext->GetAreaFromString(warpMinuetText)); + randoContext->AddHint(RH_MINUET_WARP_LOC, Rando::Hint(RH_MINUET_WARP_LOC, {CustomMessage(warpMinuetText)})); std::string warpBoleroText; SaveManager::Instance->LoadData("warpBoleroText", warpBoleroText); - randoContext->AddHint(RH_BOLERO_WARP_LOC, Text(warpBoleroText), RC_UNKNOWN_CHECK, HINT_TYPE_STATIC, "Static", randoContext->GetAreaFromString(warpBoleroText)); + randoContext->AddHint(RH_BOLERO_WARP_LOC, Rando::Hint(RH_BOLERO_WARP_LOC, {CustomMessage(warpBoleroText)})); std::string warpSerenadeText; SaveManager::Instance->LoadData("warpSerenadeText", warpSerenadeText); - randoContext->AddHint(RH_SERENADE_WARP_LOC, Text(warpSerenadeText), RC_UNKNOWN_CHECK, HINT_TYPE_STATIC, "Static", randoContext->GetAreaFromString(warpSerenadeText)); + randoContext->AddHint(RH_SERENADE_WARP_LOC, Rando::Hint(RH_SERENADE_WARP_LOC, {CustomMessage(warpSerenadeText)})); std::string warpRequiemText; SaveManager::Instance->LoadData("warpRequiemText", warpRequiemText); - randoContext->AddHint(RH_REQUIEM_WARP_LOC, Text(warpRequiemText), RC_UNKNOWN_CHECK, HINT_TYPE_STATIC, "Static", randoContext->GetAreaFromString(warpRequiemText)); + randoContext->AddHint(RH_REQUIEM_WARP_LOC, Rando::Hint(RH_REQUIEM_WARP_LOC, {CustomMessage(warpRequiemText)})); std::string warpNocturneText; SaveManager::Instance->LoadData("warpNocturneText", warpNocturneText); - randoContext->AddHint(RH_NOCTURNE_WARP_LOC, Text(warpNocturneText), RC_UNKNOWN_CHECK, HINT_TYPE_STATIC, "Static", randoContext->GetAreaFromString(warpNocturneText)); + randoContext->AddHint(RH_NOCTURNE_WARP_LOC, Rando::Hint(RH_NOCTURNE_WARP_LOC, {CustomMessage(warpNocturneText)})); std::string warpPreludeText; SaveManager::Instance->LoadData("warpPreludeText", warpPreludeText); - randoContext->AddHint(RH_PRELUDE_WARP_LOC, Text(warpPreludeText), RC_UNKNOWN_CHECK, HINT_TYPE_STATIC, "Static", randoContext->GetAreaFromString(warpPreludeText)); + randoContext->AddHint(RH_PRELUDE_WARP_LOC, Rando::Hint(RH_PRELUDE_WARP_LOC, {CustomMessage(warpPreludeText)})); SaveManager::Instance->LoadData("adultTradeItems", gSaveContext.adultTradeItems); @@ -386,23 +437,10 @@ void SaveManager::LoadRandomizerVersion3() { }); SaveManager::Instance->LoadArray("hintLocations", RH_MAX, [&](size_t i) { - SaveManager::Instance->LoadStruct("", [&]() { - RandomizerHintKey rhk = RH_NONE; - SaveManager::Instance->LoadData("hintKey", rhk); - std::string english, french, german; - SaveManager::Instance->LoadStruct("hintText", [&]() { - SaveManager::Instance->LoadData("english", english); - SaveManager::Instance->LoadData("french", french); - SaveManager::Instance->LoadData("german", german); - }); - RandomizerCheck rc = RC_UNKNOWN_CHECK; - SaveManager::Instance->LoadData("hintedCheck", rc); - HintType ht = HINT_TYPE_STATIC; - SaveManager::Instance->LoadData("hintType", ht); - RandomizerArea savedArea; - SaveManager::Instance->LoadData("hintedArea", savedArea); - randoContext->AddHint(rhk, Text(english, french, /*spanish*/"", german), rc, ht, "Unknown", savedArea);//RANDOTODO, maybe store and load distrabution, but it's a string... - }); + auto hint = RandomizerHint(i); + nlohmann::ordered_json json; + SaveManager::Instance->LoadData("", json); + randoContext->AddHint(hint, Rando::Hint(hint, json)); }); SaveManager::Instance->LoadData("adultTradeItems", gSaveContext.adultTradeItems); @@ -477,17 +515,68 @@ void SaveManager::SaveRandomizer(SaveContext* saveContext, int sectionID, bool f }); SaveManager::Instance->SaveArray("hintLocations", RH_MAX, [&](size_t i) { + auto hint = randoContext->GetHint(RandomizerHint(i)); + // RANDOTODO a way for saveData to accept a raw JSON would make maintaining hint code nicer. + // save manager forces code rewrites between the spoiler log and internal saves, when the code needs to do the exact same thing + // in cases where data needs to be loaded in from the spoiler log for plando mode. + // fails as push_back is ambiguous + // SaveManager::Instance->SaveData(Rando::StaticData::hintNames[(uint32_t)hint].GetEnglish(), hint->toJSON()); SaveManager::Instance->SaveStruct("", [&]() { - auto hint = randoContext->GetHint(RandomizerHintKey(i)); - SaveManager::Instance->SaveData("hintKey", RandomizerHintKey(i)); - SaveManager::Instance->SaveStruct("hintText", [&]() { - SaveManager::Instance->SaveData("english", hint->GetText().GetEnglish()); - SaveManager::Instance->SaveData("french", hint->GetText().GetFrench()); - SaveManager::Instance->SaveData("german", hint->GetText().GetGerman()); - }); - SaveManager::Instance->SaveData("hintedCheck", hint->GetHintedLocation()); - SaveManager::Instance->SaveData("hintType", hint->GetHintType()); - SaveManager::Instance->SaveData("hintedArea", hint->GetHintedArea()); + bool enabled = hint->IsEnabled(); + SaveManager::Instance->SaveData("enabled", enabled); + if (enabled){ + std::vector messages = hint->GetAllMessageStrings(MF_RAW); + SaveManager::Instance->SaveArray("messages", messages.size(), [&](size_t i) { + SaveManager::Instance->SaveData("", messages[i]); + }); + + SaveManager::Instance->SaveData("distribution", hint->GetDistribution()); + SaveManager::Instance->SaveData("type", Rando::StaticData::hintTypeNames[hint->GetHintType()].GetEnglish(MF_CLEAN)); + + std::vector hintKeys = hint->GetHintTextKeys(); + SaveManager::Instance->SaveArray("hintKeys", hintKeys.size(), [&](size_t i) { + SaveManager::Instance->SaveData("", hintKeys[i]); + }); + + std::vector locations = hint->GetHintedLocations(); + SaveManager::Instance->SaveArray("locations", locations.size(), [&](size_t i) { + SaveManager::Instance->SaveData("", Rando::StaticData::GetLocation(locations[i])->GetName()); + }); + + std::vector items = hint->GetHintedItems(); + SaveManager::Instance->SaveArray("items", items.size(), [&](size_t i) { + SaveManager::Instance->SaveData("", Rando::StaticData::GetItemTable()[items[i]].GetName().GetEnglish()); + }); + + std::vector itemNamesChosen = hint->GetItemNamesChosen(); + SaveManager::Instance->SaveArray("itemNamesChosen", itemNamesChosen.size(), [&](size_t i) { + SaveManager::Instance->SaveData("", itemNamesChosen[i]); + }); + + std::vector hintTextsChosen = hint->GetHintTextsChosen(); + SaveManager::Instance->SaveArray("hintTextsChosen", hintTextsChosen.size(), [&](size_t i) { + SaveManager::Instance->SaveData("", hintTextsChosen[i]); + }); + + std::vector areaTextsChosen = hint->GetAreaTextsChosen(); + SaveManager::Instance->SaveArray("areaTextsChosen", areaTextsChosen.size(), [&](size_t i) { + SaveManager::Instance->SaveData("", areaTextsChosen[i]); + }); + + std::vector areas = hint->GetHintedAreas(); + SaveManager::Instance->SaveArray("areas", areas.size(), [&](size_t i) { + SaveManager::Instance->SaveData("", Rando::StaticData::hintTextTable[Rando::StaticData::areaNames[areas[i]]].GetClear().GetForCurrentLanguage(MF_CLEAN)); + }); + + std::vector trials = hint->GetHintedTrials(); + SaveManager::Instance->SaveArray("trials", trials.size(), [&](size_t i) { + SaveManager::Instance->SaveData("", randoContext->GetTrial(trials[i])->GetName().GetForCurrentLanguage(MF_CLEAN)); + }); + + SaveManager::Instance->SaveData("num", hint->GetNum()); + + + } }); }); diff --git a/soh/soh/SaveManager.h b/soh/soh/SaveManager.h index 935a6366e..f7d0910f6 100644 --- a/soh/soh/SaveManager.h +++ b/soh/soh/SaveManager.h @@ -183,6 +183,7 @@ class SaveManager { nlohmann::json* currentJsonContext = nullptr; nlohmann::json::iterator currentJsonArrayContext; std::shared_ptr smThreadPool; + }; #else diff --git a/soh/soh/z_message_OTR.cpp b/soh/soh/z_message_OTR.cpp index 05432fc53..ce0255436 100644 --- a/soh/soh/z_message_OTR.cpp +++ b/soh/soh/z_message_OTR.cpp @@ -137,19 +137,19 @@ extern "C" void OTRMessage_Init() CustomMessageManager::Instance->AddCustomMessageTable(customMessageTableID); CustomMessageManager::Instance->CreateGetItemMessage( customMessageTableID, (GetItemID)TEXT_GS_NO_FREEZE, ITEM_SKULL_TOKEN, - CustomMessage("You got a %rGold Skulltula Token%w!&You've collected %r{{gsCount}}%w tokens&in total!\x0E\x3C", - "Ein %rGoldenes Skulltula-Symbol%w!&Du hast nun insgesamt %r{{gsCount}}&%wGoldene " + CustomMessage("You got a %rGold Skulltula Token%w!&You've collected %r[[gsCount]]%w tokens&in total!\x0E\x3C", + "Ein %rGoldenes Skulltula-Symbol%w!&Du hast nun insgesamt %r[[gsCount]]&%wGoldene " "Skulltula-Symbole&gesammelt!\x0E\x3C", - "Vous obtenez un %rSymbole de&Skulltula d'or%w! Vous avez&collecté %r{{gsCount}}%w symboles en " + "Vous obtenez un %rSymbole de&Skulltula d'or%w! Vous avez&collecté %r[[gsCount]]%w symboles en " "tout!\x0E\x3C", TEXTBOX_TYPE_BLUE)); CustomMessageManager::Instance->CreateGetItemMessage( customMessageTableID, (GetItemID)TEXT_GS_FREEZE, ITEM_SKULL_TOKEN, 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 " + "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 tout!", + "Vous obtenez un %rSymbole de&Skulltula d'or%w! Vous avez&collecté %r[[gsCount]]%w symboles en tout!", TEXTBOX_TYPE_BLUE)); CustomMessageManager::Instance->CreateMessage( customMessageTableID, TEXT_BUY_BOMBCHU_10_DESC, @@ -168,14 +168,14 @@ extern "C" void OTRMessage_Init() CustomMessageManager::Instance->CreateGetItemMessage( customMessageTableID, (GetItemID)TEXT_HEART_CONTAINER, ITEM_HEART_CONTAINER, 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!")); + "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!")); CustomMessageManager::Instance->CreateGetItemMessage( customMessageTableID, (GetItemID)TEXT_HEART_PIECE, ITEM_HEART_PIECE, - 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&Herteile gesammelt!", - "Vous obtenez un %rQuart de&Coeur%w! Vous en avez collecté&%r{{heartPieceCount}}%w en tout!", + 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&Herteile gesammelt!", + "Vous obtenez un %rQuart de&Coeur%w! Vous en avez collecté&%r[[heartPieceCount]]%w en tout!", TEXTBOX_TYPE_BLUE)); CustomMessageManager::Instance->CreateMessage( customMessageTableID, TEXT_MARKET_GUARD_NIGHT, diff --git a/soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c b/soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c index f0cdc2249..012531f66 100644 --- a/soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c +++ b/soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c @@ -16,9 +16,6 @@ #define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED -#define TEXT_SHEIK_NEED_HOOK 0x700F -#define TEXT_SHEIK_HAVE_HOOK 0x7010 - void EnXc_Init(Actor* thisx, PlayState* play); void EnXc_Destroy(Actor* thisx, PlayState* play); void EnXc_Update(Actor* thisx, PlayState* play); @@ -2239,27 +2236,11 @@ void EnXc_SetupDialogueAction(EnXc* this, PlayState* play) { if (Actor_ProcessTalkRequest(&this->actor, play)) { this->action = SHEIK_ACTION_IN_DIALOGUE; } else { - this->actor.flags |= ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY; - if (IS_RANDO && gPlayState->sceneNum == SCENE_TEMPLE_OF_TIME) { - if (!CHECK_DUNGEON_ITEM(DUNGEON_KEY_BOSS, SCENE_GANONS_TOWER)) { - this->actor.textId = TEXT_SHEIK_NEED_HOOK; - } else { - this->actor.textId = TEXT_SHEIK_HAVE_HOOK; - } - } else if (IS_RANDO && gPlayState->sceneNum == SCENE_INSIDE_GANONS_CASTLE) { - 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) { - this->actor.textId = TEXT_SHEIK_HAVE_HOOK; - } else { - this->actor.textId = TEXT_SHEIK_NEED_HOOK; - } - } - else { - if (INV_CONTENT(ITEM_HOOKSHOT) != ITEM_NONE) { - this->actor.textId = 0x7010; //"You have what you need" - } else { - this->actor.textId = 0x700F; //"You need another skill" - } + this->actor.flags |= ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY; //this arrangment is cute but I would rather handle all message selection in ship code + if (INV_CONTENT(ITEM_HOOKSHOT) != ITEM_NONE) { + this->actor.textId = 0x7010; //"You have what you need" + } else { + this->actor.textId = 0x700F; //"You need another skill" } func_8002F2F4(&this->actor, play); }