apply clang-format

This commit is contained in:
Pepper0ni 2025-04-02 14:15:01 +01:00
parent 0a394b0356
commit 4bf78d6b9e
17 changed files with 633 additions and 682 deletions

View file

@ -1129,14 +1129,12 @@ static void RandomizeDungeonItems() {
} }
if (ctx->GetOption(RSK_GERUDO_KEYS).Is(RO_GERUDO_KEYS_ANY_DUNGEON)) { if (ctx->GetOption(RSK_GERUDO_KEYS).Is(RO_GERUDO_KEYS_ANY_DUNGEON)) {
auto gerudoKeys = FilterAndEraseFromPool(ItemPool, [](const auto i) { auto gerudoKeys = FilterAndEraseFromPool(
return i == RG_HIDEOUT_SMALL_KEY || i == RG_HIDEOUT_KEY_RING; ItemPool, [](const auto i) { return i == RG_HIDEOUT_SMALL_KEY || i == RG_HIDEOUT_KEY_RING; });
});
AddElementsToPool(anyDungeonItems, gerudoKeys); AddElementsToPool(anyDungeonItems, gerudoKeys);
} else if (ctx->GetOption(RSK_GERUDO_KEYS).Is(RO_GERUDO_KEYS_OVERWORLD)) { } else if (ctx->GetOption(RSK_GERUDO_KEYS).Is(RO_GERUDO_KEYS_OVERWORLD)) {
auto gerudoKeys = FilterAndEraseFromPool(ItemPool, [](const auto i) { auto gerudoKeys = FilterAndEraseFromPool(
return i == RG_HIDEOUT_SMALL_KEY || i == RG_HIDEOUT_KEY_RING; ItemPool, [](const auto i) { return i == RG_HIDEOUT_SMALL_KEY || i == RG_HIDEOUT_KEY_RING; });
});
AddElementsToPool(overworldItems, gerudoKeys); AddElementsToPool(overworldItems, gerudoKeys);
} }

View file

@ -27,10 +27,11 @@ HintDistributionSetting::HintDistributionSetting(std::string _name, HintType _ty
dungeonLimit = _dungeonLimit; dungeonLimit = _dungeonLimit;
} }
//RANDOTODO rearrange once all HintText's have names // RANDOTODO rearrange once all HintText's have names
HintText::HintText(CustomMessage clearText_, std::vector<CustomMessage> ambiguousText_, HintText::HintText(CustomMessage clearText_, std::vector<CustomMessage> ambiguousText_,
std::vector<CustomMessage> obscureText_, CustomMessage name_) std::vector<CustomMessage> obscureText_, CustomMessage name_)
: clearText(std::move(clearText_)), ambiguousText(std::move(ambiguousText_)), obscureText(std::move(obscureText_)), name(std::move(name_)) { : clearText(std::move(clearText_)), ambiguousText(std::move(ambiguousText_)), obscureText(std::move(obscureText_)),
name(std::move(name_)) {
} }
const CustomMessage& HintText::GetClear() const { const CustomMessage& HintText::GetClear() const {

View file

@ -462,28 +462,17 @@ void GenerateItemPool() {
// Initialize ice trap models to always major items // Initialize ice trap models to always major items
ctx->possibleIceTrapModels = { ctx->possibleIceTrapModels = {
RG_MIRROR_SHIELD, RG_MIRROR_SHIELD, RG_BOOMERANG,
RG_BOOMERANG, RG_LENS_OF_TRUTH, RG_MEGATON_HAMMER,
RG_LENS_OF_TRUTH, RG_IRON_BOOTS, RG_HOVER_BOOTS,
RG_MEGATON_HAMMER, RG_STONE_OF_AGONY, RG_DINS_FIRE,
RG_IRON_BOOTS, RG_FARORES_WIND, RG_NAYRUS_LOVE,
RG_HOVER_BOOTS, RG_FIRE_ARROWS, RG_ICE_ARROWS,
RG_STONE_OF_AGONY, RG_LIGHT_ARROWS, RG_DOUBLE_DEFENSE,
RG_DINS_FIRE, RG_CLAIM_CHECK, RG_PROGRESSIVE_HOOKSHOT,
RG_FARORES_WIND, RG_PROGRESSIVE_STRENGTH, RG_PROGRESSIVE_BOMB_BAG,
RG_NAYRUS_LOVE, RG_PROGRESSIVE_BOW, RG_PROGRESSIVE_SLINGSHOT,
RG_FIRE_ARROWS, RG_PROGRESSIVE_WALLET, RG_PROGRESSIVE_SCALE,
RG_ICE_ARROWS,
RG_LIGHT_ARROWS,
RG_DOUBLE_DEFENSE,
RG_CLAIM_CHECK,
RG_PROGRESSIVE_HOOKSHOT,
RG_PROGRESSIVE_STRENGTH,
RG_PROGRESSIVE_BOMB_BAG,
RG_PROGRESSIVE_BOW,
RG_PROGRESSIVE_SLINGSHOT,
RG_PROGRESSIVE_WALLET,
RG_PROGRESSIVE_SCALE,
RG_PROGRESSIVE_MAGIC, RG_PROGRESSIVE_MAGIC,
}; };
// Check song shuffle and dungeon reward shuffle just for ice traps // Check song shuffle and dungeon reward shuffle just for ice traps

View file

@ -74,7 +74,8 @@ static void WriteLocation(std::string sphere, const RandomizerCheck locationKey,
Rando::Location* location = Rando::StaticData::GetLocation(locationKey); Rando::Location* location = Rando::StaticData::GetLocation(locationKey);
Rando::ItemLocation* itemLocation = Rando::Context::GetInstance()->GetItemLocation(locationKey); Rando::ItemLocation* itemLocation = Rando::Context::GetInstance()->GetItemLocation(locationKey);
jsonData["playthrough"][sphere][location->GetName()] = itemLocation->GetPlacedItemName().GetForCurrentLanguage(MF_RAW); jsonData["playthrough"][sphere][location->GetName()] =
itemLocation->GetPlacedItemName().GetForCurrentLanguage(MF_RAW);
} }
// Writes a shuffled entrance to the specified node // Writes a shuffled entrance to the specified node
@ -255,43 +256,43 @@ static void WriteAllLocations() {
for (const RandomizerCheck key : ctx->allLocations) { for (const RandomizerCheck key : ctx->allLocations) {
Rando::ItemLocation* location = ctx->GetItemLocation(key); Rando::ItemLocation* location = ctx->GetItemLocation(key);
std::string placedItemName = location->GetPlacedItemName().GetForCurrentLanguage(MF_RAW); std::string placedItemName = location->GetPlacedItemName().GetForCurrentLanguage(MF_RAW);
std::string locName = Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName();
// If it's a simple item (not an ice trap, doesn't have a price) // If it's a simple item (not an ice trap, doesn't have a price)
// just add the name of the item and move on // just add the name of the item and move on
if (!location->HasCustomPrice() && location->GetPlacedRandomizerGet() != RG_ICE_TRAP) { if (!location->HasCustomPrice() && location->GetPlacedRandomizerGet() != RG_ICE_TRAP) {
jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()] = jsonData["locations"][locName] = placedItemName;
placedItemName;
continue; continue;
} }
// We're dealing with a complex item, build out the json object for it // We're dealing with a complex item, build out the json object for it
jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()]["item"] = jsonData["locations"][locName]["item"] = placedItemName;
placedItemName;
if (location->HasCustomPrice()) { if (location->HasCustomPrice()) {
jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()]["price"] = jsonData["locations"][locName]["price"] = location->GetPrice();
location->GetPrice();
} }
if (location->IsAHintAccessible()) { if (location->IsAHintAccessible()) {
hintedLocations.emplace(Rando::StaticData::GetLocation(key)->GetHintKey(), location); hintedLocations.emplace(Rando::StaticData::GetLocation(key)->GetHintKey(), location);
} }
if (location->GetPlacedRandomizerGet() == RG_ICE_TRAP) { if (location->GetPlacedRandomizerGet() == RG_ICE_TRAP) {
jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()]["model"] = jsonData["locations"][locName]["model"] =
Rando::StaticData::RetrieveItem(ctx->overrides[location->GetRandomizerCheck()].LooksLike()).GetName().GetForCurrentLanguage(MF_RAW); Rando::StaticData::RetrieveItem(ctx->overrides[location->GetRandomizerCheck()].LooksLike())
switch (gSaveContext.language) { .GetName()
case 0: .GetForCurrentLanguage(MF_RAW);
default: switch (gSaveContext.language) {
jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()]["trickName"] = case 0:
ctx->overrides[location->GetRandomizerCheck()].GetTrickName().english; default:
break; jsonData["locations"][locName]["trickName"] =
case 2: ctx->overrides[location->GetRandomizerCheck()].GetTrickName().english;
jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()]["trickName"] = break;
ctx->overrides[location->GetRandomizerCheck()].GetTrickName().french; case 2:
break; jsonData["locations"][locName]["trickName"] =
} ctx->overrides[location->GetRandomizerCheck()].GetTrickName().french;
} break;
}
}
} }
} }

View file

@ -87,172 +87,170 @@ std::vector<RandomizerGet> infiniteItemList = {
RG_BOMBS_20, RG_BOMBCHU_5, RG_BOMBCHU_10, RG_BOMBCHU_20, RG_RECOVERY_HEART, RG_ICE_TRAP, RG_SOLD_OUT RG_BOMBS_20, RG_BOMBCHU_5, RG_BOMBCHU_10, RG_BOMBCHU_20, RG_RECOVERY_HEART, RG_ICE_TRAP, RG_SOLD_OUT
}; };
std::unordered_map<RandomizerGet, std::string> itemImageMap = { std::unordered_map<RandomizerGet, std::string> itemImageMap = { { RG_NONE, "ITEM_SOLD_OUT" },
{ RG_NONE, "ITEM_SOLD_OUT" }, { RG_KOKIRI_SWORD, "ITEM_SWORD_KOKIRI" },
{ RG_KOKIRI_SWORD, "ITEM_SWORD_KOKIRI" }, { RG_GIANTS_KNIFE, "ITEM_SWORD_KNIFE" },
{ RG_GIANTS_KNIFE, "ITEM_SWORD_KNIFE" }, { RG_BIGGORON_SWORD, "ITEM_SWORD_BGS" },
{ RG_BIGGORON_SWORD, "ITEM_SWORD_BGS" }, { RG_DEKU_SHIELD, "ITEM_SHIELD_DEKU" },
{ RG_DEKU_SHIELD, "ITEM_SHIELD_DEKU" }, { RG_HYLIAN_SHIELD, "ITEM_SHIELD_HYLIAN" },
{ RG_HYLIAN_SHIELD, "ITEM_SHIELD_HYLIAN" }, { RG_MIRROR_SHIELD, "ITEM_SHIELD_MIRROR" },
{ RG_MIRROR_SHIELD, "ITEM_SHIELD_MIRROR" }, { RG_GORON_TUNIC, "ITEM_TUNIC_GORON" },
{ RG_GORON_TUNIC, "ITEM_TUNIC_GORON" }, { RG_ZORA_TUNIC, "ITEM_TUNIC_ZORA" },
{ RG_ZORA_TUNIC, "ITEM_TUNIC_ZORA" }, { RG_IRON_BOOTS, "ITEM_BOOTS_IRON" },
{ RG_IRON_BOOTS, "ITEM_BOOTS_IRON" }, { RG_HOVER_BOOTS, "ITEM_BOOTS_HOVER" },
{ RG_HOVER_BOOTS, "ITEM_BOOTS_HOVER" }, { RG_BOOMERANG, "ITEM_BOOMERANG" },
{ RG_BOOMERANG, "ITEM_BOOMERANG" }, { RG_LENS_OF_TRUTH, "ITEM_LENS" },
{ RG_LENS_OF_TRUTH, "ITEM_LENS" }, { RG_MEGATON_HAMMER, "ITEM_HAMMER" },
{ RG_MEGATON_HAMMER, "ITEM_HAMMER" }, { RG_STONE_OF_AGONY, "ITEM_STONE_OF_AGONY" },
{ RG_STONE_OF_AGONY, "ITEM_STONE_OF_AGONY" }, { RG_DINS_FIRE, "ITEM_DINS_FIRE" },
{ RG_DINS_FIRE, "ITEM_DINS_FIRE" }, { RG_FARORES_WIND, "ITEM_FARORES_WIND" },
{ RG_FARORES_WIND, "ITEM_FARORES_WIND" }, { RG_NAYRUS_LOVE, "ITEM_NAYRUS_LOVE" },
{ RG_NAYRUS_LOVE, "ITEM_NAYRUS_LOVE" }, { RG_FIRE_ARROWS, "ITEM_ARROW_FIRE" },
{ RG_FIRE_ARROWS, "ITEM_ARROW_FIRE" }, { RG_ICE_ARROWS, "ITEM_ARROW_ICE" },
{ RG_ICE_ARROWS, "ITEM_ARROW_ICE" }, { RG_LIGHT_ARROWS, "ITEM_ARROW_LIGHT" },
{ RG_LIGHT_ARROWS, "ITEM_ARROW_LIGHT" }, { RG_GERUDO_MEMBERSHIP_CARD, "ITEM_GERUDO_CARD" },
{ RG_GERUDO_MEMBERSHIP_CARD, "ITEM_GERUDO_CARD" }, { RG_MAGIC_BEAN, "ITEM_BEAN" },
{ RG_MAGIC_BEAN, "ITEM_BEAN" }, { RG_MAGIC_BEAN_PACK, "ITEM_BEAN" },
{ RG_MAGIC_BEAN_PACK, "ITEM_BEAN" }, { RG_DOUBLE_DEFENSE, "ITEM_HEART_CONTAINER" },
{ RG_DOUBLE_DEFENSE, "ITEM_HEART_CONTAINER" }, { RG_WEIRD_EGG, "ITEM_WEIRD_EGG" },
{ RG_WEIRD_EGG, "ITEM_WEIRD_EGG" }, { RG_ZELDAS_LETTER, "ITEM_LETTER_ZELDA" },
{ RG_ZELDAS_LETTER, "ITEM_LETTER_ZELDA" }, { RG_POCKET_EGG, "ITEM_POCKET_EGG" },
{ RG_POCKET_EGG, "ITEM_POCKET_EGG" }, { RG_COJIRO, "ITEM_COJIRO" },
{ RG_COJIRO, "ITEM_COJIRO" }, { RG_ODD_MUSHROOM, "ITEM_ODD_MUSHROOM" },
{ RG_ODD_MUSHROOM, "ITEM_ODD_MUSHROOM" }, { RG_ODD_POTION, "ITEM_ODD_POTION" },
{ RG_ODD_POTION, "ITEM_ODD_POTION" }, { RG_POACHERS_SAW, "ITEM_SAW" },
{ RG_POACHERS_SAW, "ITEM_SAW" }, { RG_BROKEN_SWORD, "ITEM_SWORD_BROKEN" },
{ RG_BROKEN_SWORD, "ITEM_SWORD_BROKEN" }, { RG_PRESCRIPTION, "ITEM_PRESCRIPTION" },
{ RG_PRESCRIPTION, "ITEM_PRESCRIPTION" }, { RG_EYEBALL_FROG, "ITEM_FROG" },
{ RG_EYEBALL_FROG, "ITEM_FROG" }, { RG_EYEDROPS, "ITEM_EYEDROPS" },
{ RG_EYEDROPS, "ITEM_EYEDROPS" }, { RG_CLAIM_CHECK, "ITEM_CLAIM_CHECK" },
{ RG_CLAIM_CHECK, "ITEM_CLAIM_CHECK" }, { RG_GOLD_SKULLTULA_TOKEN, "ITEM_SKULL_TOKEN" },
{ RG_GOLD_SKULLTULA_TOKEN, "ITEM_SKULL_TOKEN" }, { RG_PROGRESSIVE_HOOKSHOT, "ITEM_HOOKSHOT" },
{ RG_PROGRESSIVE_HOOKSHOT, "ITEM_HOOKSHOT" }, { RG_PROGRESSIVE_STRENGTH, "ITEM_BRACELET" },
{ RG_PROGRESSIVE_STRENGTH, "ITEM_BRACELET" }, { RG_PROGRESSIVE_BOMB_BAG, "ITEM_BOMB_BAG_30" },
{ RG_PROGRESSIVE_BOMB_BAG, "ITEM_BOMB_BAG_30" }, { RG_PROGRESSIVE_BOW, "ITEM_QUIVER_30" },
{ RG_PROGRESSIVE_BOW, "ITEM_QUIVER_30" }, { RG_PROGRESSIVE_SLINGSHOT, "ITEM_SLINGSHOT" },
{ RG_PROGRESSIVE_SLINGSHOT, "ITEM_SLINGSHOT" }, { RG_PROGRESSIVE_WALLET, "ITEM_WALLET_ADULT" },
{ RG_PROGRESSIVE_WALLET, "ITEM_WALLET_ADULT" }, { RG_PROGRESSIVE_SCALE, "ITEM_SCALE_SILVER" },
{ RG_PROGRESSIVE_SCALE, "ITEM_SCALE_SILVER" }, { RG_PROGRESSIVE_NUT_BAG, "ITEM_NUT" },
{ RG_PROGRESSIVE_NUT_BAG, "ITEM_NUT" }, { RG_PROGRESSIVE_STICK_BAG, "ITEM_STICK" },
{ RG_PROGRESSIVE_STICK_BAG, "ITEM_STICK" }, { RG_PROGRESSIVE_BOMBCHUS, "ITEM_BOMBCHU" },
{ RG_PROGRESSIVE_BOMBCHUS, "ITEM_BOMBCHU" }, { RG_PROGRESSIVE_MAGIC, "ITEM_MAGIC_SMALL" },
{ RG_PROGRESSIVE_MAGIC, "ITEM_MAGIC_SMALL" }, { RG_MAGIC_SINGLE, "ITEM_MAGIC_SMALL" },
{ RG_MAGIC_SINGLE, "ITEM_MAGIC_SMALL" }, { RG_MAGIC_DOUBLE, "ITEM_MAGIC_LARGE" },
{ RG_MAGIC_DOUBLE, "ITEM_MAGIC_LARGE" }, { RG_PROGRESSIVE_OCARINA, "ITEM_OCARINA_FAIRY" },
{ RG_PROGRESSIVE_OCARINA, "ITEM_OCARINA_FAIRY" }, { RG_PROGRESSIVE_GORONSWORD, "ITEM_SWORD_BGS" },
{ RG_PROGRESSIVE_GORONSWORD, "ITEM_SWORD_BGS" }, { RG_EMPTY_BOTTLE, "ITEM_BOTTLE" },
{ RG_EMPTY_BOTTLE, "ITEM_BOTTLE" }, { RG_BOTTLE_WITH_MILK, "ITEM_MILK_BOTTLE" },
{ RG_BOTTLE_WITH_MILK, "ITEM_MILK_BOTTLE" }, { RG_BOTTLE_WITH_RED_POTION, "ITEM_POTION_RED" },
{ RG_BOTTLE_WITH_RED_POTION, "ITEM_POTION_RED" }, { RG_BOTTLE_WITH_GREEN_POTION, "ITEM_POTION_GREEN" },
{ RG_BOTTLE_WITH_GREEN_POTION, "ITEM_POTION_GREEN" }, { RG_BOTTLE_WITH_BLUE_POTION, "ITEM_POTION_BLUE" },
{ RG_BOTTLE_WITH_BLUE_POTION, "ITEM_POTION_BLUE" }, { RG_BOTTLE_WITH_FAIRY, "ITEM_FAIRY" },
{ RG_BOTTLE_WITH_FAIRY, "ITEM_FAIRY" }, { RG_BOTTLE_WITH_FISH, "ITEM_FISH" },
{ RG_BOTTLE_WITH_FISH, "ITEM_FISH" }, { RG_BOTTLE_WITH_BLUE_FIRE, "ITEM_BLUE_FIRE" },
{ RG_BOTTLE_WITH_BLUE_FIRE, "ITEM_BLUE_FIRE" }, { RG_BOTTLE_WITH_BUGS, "ITEM_BUG" },
{ RG_BOTTLE_WITH_BUGS, "ITEM_BUG" }, { RG_BOTTLE_WITH_POE, "ITEM_POE" },
{ RG_BOTTLE_WITH_POE, "ITEM_POE" }, { RG_RUTOS_LETTER, "ITEM_LETTER_RUTO" },
{ RG_RUTOS_LETTER, "ITEM_LETTER_RUTO" }, { RG_BOTTLE_WITH_BIG_POE, "ITEM_BIG_POE" },
{ RG_BOTTLE_WITH_BIG_POE, "ITEM_BIG_POE" }, { RG_ZELDAS_LULLABY, "ITEM_SONG_LULLABY" },
{ RG_ZELDAS_LULLABY, "ITEM_SONG_LULLABY" }, { RG_EPONAS_SONG, "ITEM_SONG_EPONA" },
{ RG_EPONAS_SONG, "ITEM_SONG_EPONA" }, { RG_SARIAS_SONG, "ITEM_SONG_SARIA" },
{ RG_SARIAS_SONG, "ITEM_SONG_SARIA" }, { RG_SUNS_SONG, "ITEM_SONG_SUN" },
{ RG_SUNS_SONG, "ITEM_SONG_SUN" }, { RG_SONG_OF_TIME, "ITEM_SONG_TIME" },
{ RG_SONG_OF_TIME, "ITEM_SONG_TIME" }, { RG_SONG_OF_STORMS, "ITEM_SONG_STORMS" },
{ RG_SONG_OF_STORMS, "ITEM_SONG_STORMS" }, { RG_MINUET_OF_FOREST, "ITEM_SONG_MINUET" },
{ RG_MINUET_OF_FOREST, "ITEM_SONG_MINUET" }, { RG_BOLERO_OF_FIRE, "ITEM_SONG_BOLERO" },
{ RG_BOLERO_OF_FIRE, "ITEM_SONG_BOLERO" }, { RG_SERENADE_OF_WATER, "ITEM_SONG_SERENADE" },
{ RG_SERENADE_OF_WATER, "ITEM_SONG_SERENADE" }, { RG_REQUIEM_OF_SPIRIT, "ITEM_SONG_REQUIEM" },
{ RG_REQUIEM_OF_SPIRIT, "ITEM_SONG_REQUIEM" }, { RG_NOCTURNE_OF_SHADOW, "ITEM_SONG_NOCTURNE" },
{ RG_NOCTURNE_OF_SHADOW, "ITEM_SONG_NOCTURNE" }, { RG_PRELUDE_OF_LIGHT, "ITEM_SONG_PRELUDE" },
{ RG_PRELUDE_OF_LIGHT, "ITEM_SONG_PRELUDE" }, { RG_DEKU_TREE_MAP, "ITEM_DUNGEON_MAP" },
{ RG_DEKU_TREE_MAP, "ITEM_DUNGEON_MAP" }, { RG_DODONGOS_CAVERN_MAP, "ITEM_DUNGEON_MAP" },
{ RG_DODONGOS_CAVERN_MAP, "ITEM_DUNGEON_MAP" }, { RG_JABU_JABUS_BELLY_MAP, "ITEM_DUNGEON_MAP" },
{ RG_JABU_JABUS_BELLY_MAP, "ITEM_DUNGEON_MAP" }, { RG_FOREST_TEMPLE_MAP, "ITEM_DUNGEON_MAP" },
{ RG_FOREST_TEMPLE_MAP, "ITEM_DUNGEON_MAP" }, { RG_FIRE_TEMPLE_MAP, "ITEM_DUNGEON_MAP" },
{ RG_FIRE_TEMPLE_MAP, "ITEM_DUNGEON_MAP" }, { RG_WATER_TEMPLE_MAP, "ITEM_DUNGEON_MAP" },
{ RG_WATER_TEMPLE_MAP, "ITEM_DUNGEON_MAP" }, { RG_SPIRIT_TEMPLE_MAP, "ITEM_DUNGEON_MAP" },
{ RG_SPIRIT_TEMPLE_MAP, "ITEM_DUNGEON_MAP" }, { RG_SHADOW_TEMPLE_MAP, "ITEM_DUNGEON_MAP" },
{ RG_SHADOW_TEMPLE_MAP, "ITEM_DUNGEON_MAP" }, { RG_BOTW_MAP, "ITEM_DUNGEON_MAP" },
{ RG_BOTW_MAP, "ITEM_DUNGEON_MAP" }, { RG_ICE_CAVERN_MAP, "ITEM_DUNGEON_MAP" },
{ RG_ICE_CAVERN_MAP, "ITEM_DUNGEON_MAP" }, { RG_DEKU_TREE_COMPASS, "ITEM_COMPASS" },
{ RG_DEKU_TREE_COMPASS, "ITEM_COMPASS" }, { RG_DODONGOS_CAVERN_COMPASS, "ITEM_COMPASS" },
{ RG_DODONGOS_CAVERN_COMPASS, "ITEM_COMPASS" }, { RG_JABU_JABUS_BELLY_COMPASS, "ITEM_COMPASS" },
{ RG_JABU_JABUS_BELLY_COMPASS, "ITEM_COMPASS" }, { RG_FOREST_TEMPLE_COMPASS, "ITEM_COMPASS" },
{ RG_FOREST_TEMPLE_COMPASS, "ITEM_COMPASS" }, { RG_FIRE_TEMPLE_COMPASS, "ITEM_COMPASS" },
{ RG_FIRE_TEMPLE_COMPASS, "ITEM_COMPASS" }, { RG_WATER_TEMPLE_COMPASS, "ITEM_COMPASS" },
{ RG_WATER_TEMPLE_COMPASS, "ITEM_COMPASS" }, { RG_SPIRIT_TEMPLE_COMPASS, "ITEM_COMPASS" },
{ RG_SPIRIT_TEMPLE_COMPASS, "ITEM_COMPASS" }, { RG_SHADOW_TEMPLE_COMPASS, "ITEM_COMPASS" },
{ RG_SHADOW_TEMPLE_COMPASS, "ITEM_COMPASS" }, { RG_BOTW_COMPASS, "ITEM_COMPASS" },
{ RG_BOTW_COMPASS, "ITEM_COMPASS" }, { RG_ICE_CAVERN_COMPASS, "ITEM_COMPASS" },
{ RG_ICE_CAVERN_COMPASS, "ITEM_COMPASS" }, { RG_FOREST_TEMPLE_BOSS_KEY, "ITEM_KEY_BOSS" },
{ RG_FOREST_TEMPLE_BOSS_KEY, "ITEM_KEY_BOSS" }, { RG_FIRE_TEMPLE_BOSS_KEY, "ITEM_KEY_BOSS" },
{ RG_FIRE_TEMPLE_BOSS_KEY, "ITEM_KEY_BOSS" }, { RG_WATER_TEMPLE_BOSS_KEY, "ITEM_KEY_BOSS" },
{ RG_WATER_TEMPLE_BOSS_KEY, "ITEM_KEY_BOSS" }, { RG_SPIRIT_TEMPLE_BOSS_KEY, "ITEM_KEY_BOSS" },
{ RG_SPIRIT_TEMPLE_BOSS_KEY, "ITEM_KEY_BOSS" }, { RG_SHADOW_TEMPLE_BOSS_KEY, "ITEM_KEY_BOSS" },
{ RG_SHADOW_TEMPLE_BOSS_KEY, "ITEM_KEY_BOSS" }, { RG_GANONS_CASTLE_BOSS_KEY, "ITEM_KEY_BOSS" },
{ RG_GANONS_CASTLE_BOSS_KEY, "ITEM_KEY_BOSS" }, { RG_FOREST_TEMPLE_SMALL_KEY, "ITEM_KEY_SMALL" },
{ RG_FOREST_TEMPLE_SMALL_KEY, "ITEM_KEY_SMALL" }, { RG_FIRE_TEMPLE_SMALL_KEY, "ITEM_KEY_SMALL" },
{ RG_FIRE_TEMPLE_SMALL_KEY, "ITEM_KEY_SMALL" }, { RG_WATER_TEMPLE_SMALL_KEY, "ITEM_KEY_SMALL" },
{ RG_WATER_TEMPLE_SMALL_KEY, "ITEM_KEY_SMALL" }, { RG_SPIRIT_TEMPLE_SMALL_KEY, "ITEM_KEY_SMALL" },
{ RG_SPIRIT_TEMPLE_SMALL_KEY, "ITEM_KEY_SMALL" }, { RG_SHADOW_TEMPLE_SMALL_KEY, "ITEM_KEY_SMALL" },
{ RG_SHADOW_TEMPLE_SMALL_KEY, "ITEM_KEY_SMALL" }, { RG_BOTW_SMALL_KEY, "ITEM_KEY_SMALL" },
{ RG_BOTW_SMALL_KEY, "ITEM_KEY_SMALL" }, { RG_GTG_SMALL_KEY, "ITEM_KEY_SMALL" },
{ RG_GTG_SMALL_KEY, "ITEM_KEY_SMALL" }, { RG_HIDEOUT_SMALL_KEY, "ITEM_KEY_SMALL" },
{ RG_HIDEOUT_SMALL_KEY, "ITEM_KEY_SMALL" }, { RG_GANONS_CASTLE_SMALL_KEY, "ITEM_KEY_SMALL" },
{ RG_GANONS_CASTLE_SMALL_KEY, "ITEM_KEY_SMALL" }, { RG_TCG_SMALL_KEY, "ITEM_KEY_SMALL" },
{ RG_TCG_SMALL_KEY, "ITEM_KEY_SMALL" }, { RG_KOKIRI_EMERALD, "ITEM_KOKIRI_EMERALD" },
{ RG_KOKIRI_EMERALD, "ITEM_KOKIRI_EMERALD" }, { RG_GORON_RUBY, "ITEM_GORON_RUBY" },
{ RG_GORON_RUBY, "ITEM_GORON_RUBY" }, { RG_ZORA_SAPPHIRE, "ITEM_ZORA_SAPPHIRE" },
{ RG_ZORA_SAPPHIRE, "ITEM_ZORA_SAPPHIRE" }, { RG_FOREST_MEDALLION, "ITEM_MEDALLION_FOREST" },
{ RG_FOREST_MEDALLION, "ITEM_MEDALLION_FOREST" }, { RG_FIRE_MEDALLION, "ITEM_MEDALLION_FIRE" },
{ RG_FIRE_MEDALLION, "ITEM_MEDALLION_FIRE" }, { RG_WATER_MEDALLION, "ITEM_MEDALLION_WATER" },
{ RG_WATER_MEDALLION, "ITEM_MEDALLION_WATER" }, { RG_SPIRIT_MEDALLION, "ITEM_MEDALLION_SPIRIT" },
{ RG_SPIRIT_MEDALLION, "ITEM_MEDALLION_SPIRIT" }, { RG_SHADOW_MEDALLION, "ITEM_MEDALLION_SHADOW" },
{ RG_SHADOW_MEDALLION, "ITEM_MEDALLION_SHADOW" }, { RG_LIGHT_MEDALLION, "ITEM_MEDALLION_LIGHT" },
{ RG_LIGHT_MEDALLION, "ITEM_MEDALLION_LIGHT" }, { RG_RECOVERY_HEART, "ITEM_HEART_GRAYSCALE" },
{ RG_RECOVERY_HEART, "ITEM_HEART_GRAYSCALE" }, { RG_GREEN_RUPEE, "ITEM_RUPEE_GRAYSCALE" },
{ RG_GREEN_RUPEE, "ITEM_RUPEE_GRAYSCALE" }, { RG_GREG_RUPEE, "ITEM_RUPEE_GRAYSCALE" },
{ RG_GREG_RUPEE, "ITEM_RUPEE_GRAYSCALE" }, { RG_BLUE_RUPEE, "ITEM_RUPEE_GRAYSCALE" },
{ RG_BLUE_RUPEE, "ITEM_RUPEE_GRAYSCALE" }, { RG_RED_RUPEE, "ITEM_RUPEE_GRAYSCALE" },
{ RG_RED_RUPEE, "ITEM_RUPEE_GRAYSCALE" }, { RG_PURPLE_RUPEE, "ITEM_RUPEE_GRAYSCALE" },
{ RG_PURPLE_RUPEE, "ITEM_RUPEE_GRAYSCALE" }, { RG_HUGE_RUPEE, "ITEM_RUPEE_GRAYSCALE" },
{ RG_HUGE_RUPEE, "ITEM_RUPEE_GRAYSCALE" }, { RG_LOSER_GREEN_RUPEE, "ITEM_RUPEE_GRAYSCALE" },
{ RG_LOSER_GREEN_RUPEE, "ITEM_RUPEE_GRAYSCALE" }, { RG_PIECE_OF_HEART, "ITEM_HEART_PIECE" },
{ RG_PIECE_OF_HEART, "ITEM_HEART_PIECE" }, { RG_HEART_CONTAINER, "ITEM_HEART_CONTAINER" },
{ RG_HEART_CONTAINER, "ITEM_HEART_CONTAINER" }, { RG_ICE_TRAP, "ITEM_ICE_TRAP" },
{ RG_ICE_TRAP, "ITEM_ICE_TRAP" }, { RG_MILK, "ITEM_MILK_BOTTLE" },
{ RG_MILK, "ITEM_MILK_BOTTLE"}, { RG_BOMBS_5, "ITEM_BOMB" },
{ RG_BOMBS_5, "ITEM_BOMB" }, { RG_BOMBS_10, "ITEM_BOMB" },
{ RG_BOMBS_10, "ITEM_BOMB" }, { RG_BOMBS_20, "ITEM_BOMB" },
{ RG_BOMBS_20, "ITEM_BOMB" }, { RG_BUY_BOMBS_525, "ITEM_BOMB" },
{ RG_BUY_BOMBS_525, "ITEM_BOMB" }, { RG_BUY_BOMBS_535, "ITEM_BOMB" },
{ RG_BUY_BOMBS_535, "ITEM_BOMB" }, { RG_BUY_BOMBS_10, "ITEM_BOMB" },
{ RG_BUY_BOMBS_10, "ITEM_BOMB" }, { RG_BUY_BOMBS_20, "ITEM_BOMB" },
{ RG_BUY_BOMBS_20, "ITEM_BOMB" }, { RG_BUY_BOMBS_30, "ITEM_BOMB" },
{ RG_BUY_BOMBS_30, "ITEM_BOMB" }, { RG_DEKU_NUTS_5, "ITEM_NUT" },
{ RG_DEKU_NUTS_5, "ITEM_NUT" }, { RG_DEKU_NUTS_10, "ITEM_NUT" },
{ RG_DEKU_NUTS_10, "ITEM_NUT" }, { RG_BUY_DEKU_NUTS_5, "ITEM_NUT" },
{ RG_BUY_DEKU_NUTS_5, "ITEM_NUT" }, { RG_BUY_DEKU_NUTS_10, "ITEM_NUT" },
{ RG_BUY_DEKU_NUTS_10, "ITEM_NUT" }, { RG_BOMBCHU_5, "ITEM_BOMBCHU" },
{ RG_BOMBCHU_5, "ITEM_BOMBCHU" }, { RG_BOMBCHU_10, "ITEM_BOMBCHU" },
{ RG_BOMBCHU_10, "ITEM_BOMBCHU" }, { RG_BOMBCHU_20, "ITEM_BOMBCHU" },
{ RG_BOMBCHU_20, "ITEM_BOMBCHU" }, { RG_BUY_BOMBCHUS_20, "ITEM_BOMBCHU" },
{ RG_BUY_BOMBCHUS_20, "ITEM_BOMBCHU" }, { RG_ARROWS_5, "ITEM_ARROWS_SMALL" },
{ RG_ARROWS_5, "ITEM_ARROWS_SMALL" }, { RG_BUY_ARROWS_10, "ITEM_ARROWS_SMALL" },
{ RG_BUY_ARROWS_10, "ITEM_ARROWS_SMALL" }, { RG_ARROWS_10, "ITEM_ARROWS_MEDIUM" },
{ RG_ARROWS_10, "ITEM_ARROWS_MEDIUM" }, { RG_BUY_ARROWS_30, "ITEM_ARROWS_MEDIUM" },
{ RG_BUY_ARROWS_30, "ITEM_ARROWS_MEDIUM" }, { RG_ARROWS_30, "ITEM_ARROWS_LARGE" },
{ RG_ARROWS_30, "ITEM_ARROWS_LARGE" }, { RG_BUY_ARROWS_50, "ITEM_ARROWS_LARGE" },
{ RG_BUY_ARROWS_50, "ITEM_ARROWS_LARGE" }, { RG_TCG_PIECE_OF_HEART, "ITEM_HEART_PIECE" },
{ RG_TCG_PIECE_OF_HEART, "ITEM_HEART_PIECE" }, { RG_DEKU_SEEDS_30, "ITEM_SEEDS" },
{ RG_DEKU_SEEDS_30, "ITEM_SEEDS" }, { RG_BUY_DEKU_SEEDS_30, "ITEM_SEEDS" },
{ RG_BUY_DEKU_SEEDS_30, "ITEM_SEEDS" }, { RG_BUY_HEART, "ITEM_HEART_GRAYSCALE" },
{ RG_BUY_HEART, "ITEM_HEART_GRAYSCALE" }, { RG_FISHING_POLE, "ITEM_FISHING_POLE" },
{ RG_FISHING_POLE, "ITEM_FISHING_POLE" }, { RG_SOLD_OUT, "ITEM_SOLD_OUT" },
{ RG_SOLD_OUT, "ITEM_SOLD_OUT" }, { RG_TRIFORCE_PIECE, "TRIFORCE_PIECE" },
{ RG_TRIFORCE_PIECE, "TRIFORCE_PIECE" }, { RG_SKELETON_KEY, "ITEM_KEY_SMALL" } };
{ RG_SKELETON_KEY, "ITEM_KEY_SMALL" }
};
Rando::Item plandomizerRandoRetrieveItem(RandomizerGet randoGetItem) { Rando::Item plandomizerRandoRetrieveItem(RandomizerGet randoGetItem) {
auto randoGetItemEntry = Rando::StaticData::RetrieveItem(randoGetItem); auto randoGetItemEntry = Rando::StaticData::RetrieveItem(randoGetItem);
@ -530,15 +528,19 @@ void PlandomizerSaveSpoilerLog() {
for (auto& import : plandoLogData) { for (auto& import : plandoLogData) {
if (import.checkRewardItem.GetRandomizerGet() == RG_ICE_TRAP) { if (import.checkRewardItem.GetRandomizerGet() == RG_ICE_TRAP) {
spoilerSave["locations"][import.checkName] = { { "item", import.checkRewardItem.GetName().GetForCurrentLanguage(MF_RAW) }, spoilerSave["locations"][import.checkName] = {
{ "model", import.iceTrapModel.GetName().GetForCurrentLanguage(MF_RAW) }, { "item", import.checkRewardItem.GetName().GetForCurrentLanguage(MF_RAW) },
{ "trickName", import.iceTrapName.c_str() } }; { "model", import.iceTrapModel.GetName().GetForCurrentLanguage(MF_RAW) },
{ "trickName", import.iceTrapName.c_str() }
};
if (import.shopPrice > -1) { if (import.shopPrice > -1) {
spoilerSave["locations"][import.checkName]["price"] = import.shopPrice; spoilerSave["locations"][import.checkName]["price"] = import.shopPrice;
} }
} else if (import.shopPrice > -1) { } else if (import.shopPrice > -1) {
spoilerSave["locations"][import.checkName] = { { "item", import.checkRewardItem.GetName().GetForCurrentLanguage(MF_RAW) }, spoilerSave["locations"][import.checkName] = {
{ "price", import.shopPrice } }; { "item", import.checkRewardItem.GetName().GetForCurrentLanguage(MF_RAW) },
{ "price", import.shopPrice }
};
} else { } else {
spoilerSave["locations"][import.checkName] = import.checkRewardItem.GetName().GetForCurrentLanguage(MF_RAW); spoilerSave["locations"][import.checkName] = import.checkRewardItem.GetName().GetForCurrentLanguage(MF_RAW);
} }
@ -622,8 +624,7 @@ void PlandomizerLoadSpoilerLog(std::string logFile) {
checkObject.checkRewardItem = checkObject.checkRewardItem =
plandomizerRandoRetrieveItem(Rando::StaticData::itemNameToEnum[value.get<std::string>()]); plandomizerRandoRetrieveItem(Rando::StaticData::itemNameToEnum[value.get<std::string>()]);
checkObject.shopPrice = -1; checkObject.shopPrice = -1;
if (checkObject.shopPrice == -1 && if (checkObject.shopPrice == -1 && checkObject.checkRewardItem.GetItemType() == ITEMTYPE_SHOP) {
checkObject.checkRewardItem.GetItemType() == ITEMTYPE_SHOP) {
checkObject.shopPrice = checkObject.checkRewardItem.GetPrice(); checkObject.shopPrice = checkObject.checkRewardItem.GetPrice();
} }
} }

View file

@ -170,14 +170,13 @@ Dungeons::Dungeons() {
"Shadow Temple", RHT_SHADOW_TEMPLE, RG_SHADOW_TEMPLE_MAP, RG_SHADOW_TEMPLE_COMPASS, RG_SHADOW_TEMPLE_SMALL_KEY, "Shadow Temple", RHT_SHADOW_TEMPLE, RG_SHADOW_TEMPLE_MAP, RG_SHADOW_TEMPLE_COMPASS, RG_SHADOW_TEMPLE_SMALL_KEY,
RG_SHADOW_TEMPLE_KEY_RING, RG_SHADOW_TEMPLE_BOSS_KEY, RA_SHADOW_TEMPLE, 5, 6, RSK_MQ_SHADOW_TEMPLE); RG_SHADOW_TEMPLE_KEY_RING, RG_SHADOW_TEMPLE_BOSS_KEY, RA_SHADOW_TEMPLE, 5, 6, RSK_MQ_SHADOW_TEMPLE);
dungeonList[BOTTOM_OF_THE_WELL] = dungeonList[BOTTOM_OF_THE_WELL] =
DungeonInfo("Bottom of the Well", RHT_BOTTOM_OF_THE_WELL, RG_BOTW_MAP, DungeonInfo("Bottom of the Well", RHT_BOTTOM_OF_THE_WELL, RG_BOTW_MAP, RG_BOTW_COMPASS, RG_BOTW_SMALL_KEY,
RG_BOTW_COMPASS, RG_BOTW_SMALL_KEY, RG_BOTW_KEY_RING, RG_BOTW_KEY_RING, RG_NONE, RA_BOTTOM_OF_THE_WELL, 3, 2, RSK_MQ_BOTTOM_OF_THE_WELL);
RG_NONE, RA_BOTTOM_OF_THE_WELL, 3, 2, RSK_MQ_BOTTOM_OF_THE_WELL);
dungeonList[ICE_CAVERN] = DungeonInfo("Ice Cavern", RHT_ICE_CAVERN, RG_ICE_CAVERN_MAP, RG_ICE_CAVERN_COMPASS, dungeonList[ICE_CAVERN] = DungeonInfo("Ice Cavern", RHT_ICE_CAVERN, RG_ICE_CAVERN_MAP, RG_ICE_CAVERN_COMPASS,
RG_NONE, RG_NONE, RG_NONE, RA_ICE_CAVERN, 0, 0, RSK_MQ_ICE_CAVERN); RG_NONE, RG_NONE, RG_NONE, RA_ICE_CAVERN, 0, 0, RSK_MQ_ICE_CAVERN);
dungeonList[GERUDO_TRAINING_GROUND] = DungeonInfo( dungeonList[GERUDO_TRAINING_GROUND] =
"Gerudo Training Ground", RHT_GERUDO_TRAINING_GROUND, RG_NONE, RG_NONE, RG_GTG_SMALL_KEY, DungeonInfo("Gerudo Training Ground", RHT_GERUDO_TRAINING_GROUND, RG_NONE, RG_NONE, RG_GTG_SMALL_KEY,
RG_GTG_KEY_RING, RG_NONE, RA_GERUDO_TRAINING_GROUND, 9, 3, RSK_MQ_GTG); RG_GTG_KEY_RING, RG_NONE, RA_GERUDO_TRAINING_GROUND, 9, 3, RSK_MQ_GTG);
dungeonList[GANONS_CASTLE] = dungeonList[GANONS_CASTLE] =
DungeonInfo("Ganon's Castle", RHT_GANONS_CASTLE, RG_NONE, RG_NONE, RG_GANONS_CASTLE_SMALL_KEY, DungeonInfo("Ganon's Castle", RHT_GANONS_CASTLE, RG_NONE, RG_NONE, RG_GANONS_CASTLE_SMALL_KEY,
RG_GANONS_CASTLE_KEY_RING, RG_GANONS_CASTLE_BOSS_KEY, RA_GANONS_CASTLE, 2, 3, RSK_MQ_GANONS_CASTLE); RG_GANONS_CASTLE_KEY_RING, RG_GANONS_CASTLE_BOSS_KEY, RA_GANONS_CASTLE, 2, 3, RSK_MQ_GANONS_CASTLE);

View file

@ -276,7 +276,8 @@ const HintText Hint::GetHintText(uint8_t id) const {
return StaticData::hintTextTable[RHT_CAN_BE_FOUND_AT]; return StaticData::hintTextTable[RHT_CAN_BE_FOUND_AT];
} }
} else { } else {
return HintText(CustomMessage("ERROR: ITEM AREA HINT WITH NO LOCATION")); // RANDOTODO get isDungeon from area? return HintText(
CustomMessage("ERROR: ITEM AREA HINT WITH NO LOCATION")); // RANDOTODO get isDungeon from area?
} }
default: default:
return HintText(CustomMessage("ERROR: NO HINTKEY PROVIDED AND HINT TYPE HAS NO DEFAULT")); return HintText(CustomMessage("ERROR: NO HINTKEY PROVIDED AND HINT TYPE HAS NO DEFAULT"));
@ -411,15 +412,13 @@ oJson Hint::toJSON() {
if (!(StaticData::staticHintInfoMap.contains(ownKey) && if (!(StaticData::staticHintInfoMap.contains(ownKey) &&
StaticData::staticHintInfoMap[ownKey].targetItems.size() > 0)) { StaticData::staticHintInfoMap[ownKey].targetItems.size() > 0)) {
if (items.size() == 1) { if (items.size() == 1) {
log["item"] = StaticData::GetItemTable()[items[0]] log["item"] = StaticData::GetItemTable()[items[0]].GetName().GetForCurrentLanguage(
.GetName() MF_RAW); // RANDOTODO change to CustomMessage;
.GetForCurrentLanguage(MF_RAW); // RANDOTODO change to CustomMessage;
} else if (items.size() > 1) { } else if (items.size() > 1) {
std::vector<std::string> itemStrings = {}; std::vector<std::string> itemStrings = {};
for (size_t c = 0; c < items.size(); c++) { for (size_t c = 0; c < items.size(); c++) {
itemStrings.push_back(StaticData::GetItemTable()[items[c]] itemStrings.push_back(StaticData::GetItemTable()[items[c]].GetName().GetForCurrentLanguage(
.GetName() MF_RAW)); // RANDOTODO change to CustomMessage
.GetForCurrentLanguage(MF_RAW)); // RANDOTODO change to CustomMessage
} }
log["items"] = itemStrings; log["items"] = itemStrings;
} }

View file

@ -1034,7 +1034,7 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l
}); });
} else if (item00->itemEntry.modIndex == MOD_RANDOMIZER) { } else if (item00->itemEntry.modIndex == MOD_RANDOMIZER) {
Notification::Emit({ Notification::Emit({
.message = "You found ",//RANDOTODO change based on language .message = "You found ", // RANDOTODO change based on language
.suffix = Rando::StaticData::RetrieveItem((RandomizerGet)item00->itemEntry.getItemId) .suffix = Rando::StaticData::RetrieveItem((RandomizerGet)item00->itemEntry.getItemId)
.GetName() .GetName()
.GetForCurrentLanguage(MF_RAW), .GetForCurrentLanguage(MF_RAW),

View file

@ -15,13 +15,12 @@ Item::Item()
: randomizerGet(RG_NONE), type(ITEMTYPE_ITEM), getItemId(GI_NONE), advancement(false), hintKey(RHT_NONE), : randomizerGet(RG_NONE), type(ITEMTYPE_ITEM), getItemId(GI_NONE), advancement(false), hintKey(RHT_NONE),
progressive(false), price(0) { progressive(false), price(0) {
} }
Item::Item(const RandomizerGet randomizerGet_, const ItemType type_, const int16_t getItemId_, Item::Item(const RandomizerGet randomizerGet_, const ItemType type_, const int16_t getItemId_, const bool advancement_,
const bool advancement_, LogicVal logicVal_, const RandomizerHintTextKey hintKey_, const uint16_t itemId_, LogicVal logicVal_, const RandomizerHintTextKey hintKey_, const uint16_t itemId_, const uint16_t objectId_,
const uint16_t objectId_, const uint16_t gid_, const uint16_t textId_, const uint16_t field_, const uint16_t gid_, const uint16_t textId_, const uint16_t field_, const int16_t chestAnimation_,
const int16_t chestAnimation_, const GetItemCategory category_, const uint16_t modIndex_, const GetItemCategory category_, const uint16_t modIndex_, const bool progressive_, const uint16_t price_)
const bool progressive_, const uint16_t price_) : randomizerGet(randomizerGet_), type(type_), getItemId(getItemId_), advancement(advancement_), logicVal(logicVal_),
: randomizerGet(randomizerGet_), type(type_), getItemId(getItemId_), hintKey(hintKey_), progressive(progressive_), price(price_) {
advancement(advancement_), logicVal(logicVal_), hintKey(hintKey_), progressive(progressive_), price(price_) {
if (modIndex_ == MOD_RANDOMIZER || getItemId > 0x7D) { if (modIndex_ == MOD_RANDOMIZER || getItemId > 0x7D) {
giEntry = std::make_shared<GetItemEntry>(GetItemEntry{ giEntry = std::make_shared<GetItemEntry>(GetItemEntry{
itemId_, field_, static_cast<int16_t>((chestAnimation_ != CHEST_ANIM_SHORT ? 1 : -1) * (gid_ + 1)), textId_, itemId_, field_, static_cast<int16_t>((chestAnimation_ != CHEST_ANIM_SHORT ? 1 : -1) * (gid_ + 1)), textId_,
@ -35,27 +34,31 @@ Item::Item(const RandomizerGet randomizerGet_, const ItemType type_, const int16
} }
} }
Item::Item(const RandomizerGet randomizerGet_, const ItemType type_, const int16_t getItemId_, const bool advancement_,
Item::Item(const RandomizerGet randomizerGet_, const ItemType type_, const int16_t getItemId_, LogicVal logicVal_, const RandomizerHintTextKey hintKey_, const uint16_t objectId_, const uint16_t gid_,
const bool advancement_, LogicVal logicVal_, const RandomizerHintTextKey hintKey_, const uint16_t textId_, const uint16_t field_, const int16_t chestAnimation_,
const uint16_t objectId_, const uint16_t gid_, const uint16_t textId_, const uint16_t field_, const GetItemCategory category_, const uint16_t modIndex_, const bool progressive_, const uint16_t price_)
const int16_t chestAnimation_, const GetItemCategory category_, const uint16_t modIndex_, : randomizerGet(randomizerGet_), type(type_), getItemId(getItemId_), advancement(advancement_), logicVal(logicVal_),
const bool progressive_, const uint16_t price_) hintKey(hintKey_), progressive(progressive_), price(price_) {
: randomizerGet(randomizerGet_), type(type_), getItemId(getItemId_),
advancement(advancement_), logicVal(logicVal_), hintKey(hintKey_), progressive(progressive_), price(price_) {
if (modIndex_ == MOD_RANDOMIZER || getItemId > 0x7D) { if (modIndex_ == MOD_RANDOMIZER || getItemId > 0x7D) {
giEntry = std::make_shared<GetItemEntry>(GetItemEntry{ static_cast<uint16_t>(randomizerGet_), field_, static_cast<int16_t>((chestAnimation_ != CHEST_ANIM_SHORT ? 1 : -1) * (gid_ + 1)), textId_, objectId_, modIndex_, TABLE_RANDOMIZER, static_cast<int16_t>(randomizerGet_), gid_, true, ITEM_FROM_NPC, category_, static_cast<uint16_t>(randomizerGet_), MOD_RANDOMIZER, NULL }); giEntry = std::make_shared<GetItemEntry>(
} GetItemEntry{ static_cast<uint16_t>(randomizerGet_), field_,
else { static_cast<int16_t>((chestAnimation_ != CHEST_ANIM_SHORT ? 1 : -1) * (gid_ + 1)), textId_,
giEntry = std::make_shared<GetItemEntry>(GetItemEntry{ static_cast<uint16_t>(randomizerGet_), field_, static_cast<int16_t>((chestAnimation_ != CHEST_ANIM_SHORT ? 1 : -1) * (gid_ + 1)), textId_, objectId_, modIndex_, TABLE_VANILLA, getItemId_, gid_, true, ITEM_FROM_NPC, category_, static_cast<uint16_t>(randomizerGet_), modIndex_, NULL }); objectId_, modIndex_, TABLE_RANDOMIZER, static_cast<int16_t>(randomizerGet_), gid_, true,
ITEM_FROM_NPC, category_, static_cast<uint16_t>(randomizerGet_), MOD_RANDOMIZER, NULL });
} else {
giEntry = std::make_shared<GetItemEntry>(
GetItemEntry{ static_cast<uint16_t>(randomizerGet_), field_,
static_cast<int16_t>((chestAnimation_ != CHEST_ANIM_SHORT ? 1 : -1) * (gid_ + 1)), textId_,
objectId_, modIndex_, TABLE_VANILLA, getItemId_, gid_, true, ITEM_FROM_NPC, category_,
static_cast<uint16_t>(randomizerGet_), modIndex_, NULL });
} }
} }
Item::Item(const RandomizerGet randomizerGet_, const ItemType type_, const int16_t getItemId_, Item::Item(const RandomizerGet randomizerGet_, const ItemType type_, const int16_t getItemId_, const bool advancement_,
const bool advancement_, LogicVal logicVal_, const RandomizerHintTextKey hintKey_, const bool progressive_, LogicVal logicVal_, const RandomizerHintTextKey hintKey_, const bool progressive_, const uint16_t price_)
const uint16_t price_) : randomizerGet(randomizerGet_), type(type_), getItemId(getItemId_), advancement(advancement_), logicVal(logicVal_),
: randomizerGet(randomizerGet_), type(type_), getItemId(getItemId_), hintKey(hintKey_), progressive(progressive_), price(price_) {
advancement(advancement_), logicVal(logicVal_), hintKey(hintKey_), progressive(progressive_), price(price_) {
} }
Item::~Item() = default; Item::~Item() = default;

View file

@ -30,16 +30,16 @@ namespace Rando {
class Item { class Item {
public: public:
Item(); Item();
Item(RandomizerGet randomizerGet_, ItemType type_, int16_t getItemId_, bool advancement_, Item(RandomizerGet randomizerGet_, ItemType type_, int16_t getItemId_, bool advancement_, LogicVal logicVal_,
LogicVal logicVal_, RandomizerHintTextKey hintKey_, uint16_t itemId_, uint16_t objectId_, uint16_t gid_, RandomizerHintTextKey hintKey_, uint16_t itemId_, uint16_t objectId_, uint16_t gid_, uint16_t textId_,
uint16_t textId_, uint16_t field_, int16_t chestAnimation_, GetItemCategory category_, uint16_t modIndex_, uint16_t field_, int16_t chestAnimation_, GetItemCategory category_, uint16_t modIndex_,
bool progressive_ = false, uint16_t price_ = 0); bool progressive_ = false, uint16_t price_ = 0);
Item(RandomizerGet randomizerGet_, ItemType type_, int16_t getItemId_, bool advancement_, Item(RandomizerGet randomizerGet_, ItemType type_, int16_t getItemId_, bool advancement_, LogicVal logicVal_,
LogicVal logicVal_, RandomizerHintTextKey hintKey_, uint16_t objectId_, uint16_t gid_, RandomizerHintTextKey hintKey_, uint16_t objectId_, uint16_t gid_, uint16_t textId_, uint16_t field_,
uint16_t textId_, uint16_t field_, int16_t chestAnimation_, GetItemCategory category_, uint16_t modIndex_, int16_t chestAnimation_, GetItemCategory category_, uint16_t modIndex_, bool progressive_ = false,
bool progressive_ = false, uint16_t price_ = 0); uint16_t price_ = 0);
Item(RandomizerGet randomizerGet_, ItemType type_, int16_t getItemId_, bool advancement_, Item(RandomizerGet randomizerGet_, ItemType type_, int16_t getItemId_, bool advancement_, LogicVal logicVal_,
LogicVal logicVal_, RandomizerHintTextKey hintKey_, bool progressive_ = false, uint16_t price_ = 0); RandomizerHintTextKey hintKey_, bool progressive_ = false, uint16_t price_ = 0);
~Item(); ~Item();
void ApplyEffect() const; void ApplyEffect() const;

View file

@ -406,11 +406,11 @@ void Rando::StaticData::InitItemTable() {
// Init itemNameToEnum // Init itemNameToEnum
for (auto& item : itemTable) { for (auto& item : itemTable) {
std::vector<std::string> strings = item.GetName().GetAllMessages(MF_RAW); std::vector<std::string> strings = item.GetName().GetAllMessages(MF_RAW);
for (std::string string: strings){ for (std::string string : strings) {
if (itemNameToEnum.contains(string) && string != ""){ if (itemNameToEnum.contains(string) && string != "") {
if (itemNameToEnum[string] != item.GetRandomizerGet()){ if (itemNameToEnum[string] != item.GetRandomizerGet()) {
SPDLOG_DEBUG("\tREPEATED STRING WITH " + string + "\n\n"); SPDLOG_DEBUG("\tREPEATED STRING WITH " + string + "\n\n");
} }
} else { } else {
itemNameToEnum[string] = item.GetRandomizerGet(); itemNameToEnum[string] = item.GetRandomizerGet();
} }

View file

@ -1460,99 +1460,99 @@ std::map<RandomizerGet, uint32_t> Logic::RandoGetToEquipFlag = {
{ RG_IRON_BOOTS, EQUIP_FLAG_BOOTS_IRON }, { RG_HOVER_BOOTS, EQUIP_FLAG_BOOTS_HOVER } { RG_IRON_BOOTS, EQUIP_FLAG_BOOTS_IRON }, { RG_HOVER_BOOTS, EQUIP_FLAG_BOOTS_HOVER }
}; };
std::map<RandomizerGet, uint32_t> Logic::RandoGetToRandInf = { std::map<RandomizerGet, uint32_t> Logic::RandoGetToRandInf = {
{ RG_ZELDAS_LETTER, RAND_INF_ZELDAS_LETTER }, { RG_ZELDAS_LETTER, RAND_INF_ZELDAS_LETTER },
{ RG_WEIRD_EGG, RAND_INF_WEIRD_EGG }, { RG_WEIRD_EGG, RAND_INF_WEIRD_EGG },
{ RG_GOHMA_SOUL, RAND_INF_GOHMA_SOUL }, { RG_GOHMA_SOUL, RAND_INF_GOHMA_SOUL },
{ RG_KING_DODONGO_SOUL, RAND_INF_KING_DODONGO_SOUL }, { RG_KING_DODONGO_SOUL, RAND_INF_KING_DODONGO_SOUL },
{ RG_BARINADE_SOUL, RAND_INF_BARINADE_SOUL }, { RG_BARINADE_SOUL, RAND_INF_BARINADE_SOUL },
{ RG_PHANTOM_GANON_SOUL, RAND_INF_PHANTOM_GANON_SOUL }, { RG_PHANTOM_GANON_SOUL, RAND_INF_PHANTOM_GANON_SOUL },
{ RG_VOLVAGIA_SOUL, RAND_INF_VOLVAGIA_SOUL }, { RG_VOLVAGIA_SOUL, RAND_INF_VOLVAGIA_SOUL },
{ RG_MORPHA_SOUL, RAND_INF_MORPHA_SOUL }, { RG_MORPHA_SOUL, RAND_INF_MORPHA_SOUL },
{ RG_BONGO_BONGO_SOUL, RAND_INF_BONGO_BONGO_SOUL }, { RG_BONGO_BONGO_SOUL, RAND_INF_BONGO_BONGO_SOUL },
{ RG_TWINROVA_SOUL, RAND_INF_TWINROVA_SOUL }, { RG_TWINROVA_SOUL, RAND_INF_TWINROVA_SOUL },
{ RG_GANON_SOUL, RAND_INF_GANON_SOUL }, { RG_GANON_SOUL, RAND_INF_GANON_SOUL },
{ RG_OCARINA_A_BUTTON, RAND_INF_HAS_OCARINA_A }, { RG_OCARINA_A_BUTTON, RAND_INF_HAS_OCARINA_A },
{ RG_OCARINA_C_UP_BUTTON, RAND_INF_HAS_OCARINA_C_UP }, { RG_OCARINA_C_UP_BUTTON, RAND_INF_HAS_OCARINA_C_UP },
{ RG_OCARINA_C_DOWN_BUTTON, RAND_INF_HAS_OCARINA_C_DOWN }, { RG_OCARINA_C_DOWN_BUTTON, RAND_INF_HAS_OCARINA_C_DOWN },
{ RG_OCARINA_C_LEFT_BUTTON, RAND_INF_HAS_OCARINA_C_LEFT }, { RG_OCARINA_C_LEFT_BUTTON, RAND_INF_HAS_OCARINA_C_LEFT },
{ RG_OCARINA_C_RIGHT_BUTTON, RAND_INF_HAS_OCARINA_C_RIGHT }, { RG_OCARINA_C_RIGHT_BUTTON, RAND_INF_HAS_OCARINA_C_RIGHT },
{ RG_SKELETON_KEY, RAND_INF_HAS_SKELETON_KEY }, { RG_SKELETON_KEY, RAND_INF_HAS_SKELETON_KEY },
{ RG_GREG_RUPEE, RAND_INF_GREG_FOUND }, { RG_GREG_RUPEE, RAND_INF_GREG_FOUND },
{ RG_FISHING_POLE, RAND_INF_FISHING_POLE_FOUND }, { RG_FISHING_POLE, RAND_INF_FISHING_POLE_FOUND },
{ RG_GUARD_HOUSE_KEY, RAND_INF_GUARD_HOUSE_KEY_OBTAINED }, { RG_GUARD_HOUSE_KEY, RAND_INF_GUARD_HOUSE_KEY_OBTAINED },
{ RG_MARKET_BAZAAR_KEY, RAND_INF_MARKET_BAZAAR_KEY_OBTAINED }, { RG_MARKET_BAZAAR_KEY, RAND_INF_MARKET_BAZAAR_KEY_OBTAINED },
{ RG_MARKET_POTION_SHOP_KEY, RAND_INF_MARKET_POTION_SHOP_KEY_OBTAINED }, { RG_MARKET_POTION_SHOP_KEY, RAND_INF_MARKET_POTION_SHOP_KEY_OBTAINED },
{ RG_MASK_SHOP_KEY, RAND_INF_MASK_SHOP_KEY_OBTAINED }, { RG_MASK_SHOP_KEY, RAND_INF_MASK_SHOP_KEY_OBTAINED },
{ RG_MARKET_SHOOTING_KEY, RAND_INF_MARKET_SHOOTING_GALLERY_KEY_OBTAINED }, { RG_MARKET_SHOOTING_KEY, RAND_INF_MARKET_SHOOTING_GALLERY_KEY_OBTAINED },
{ RG_BOMBCHU_BOWLING_KEY, RAND_INF_BOMBCHU_BOWLING_KEY_OBTAINED }, { RG_BOMBCHU_BOWLING_KEY, RAND_INF_BOMBCHU_BOWLING_KEY_OBTAINED },
{ RG_TCG_BUILDING_KEY, RAND_INF_TREASURE_CHEST_GAME_BUILDING_KEY_OBTAINED }, { RG_TCG_BUILDING_KEY, RAND_INF_TREASURE_CHEST_GAME_BUILDING_KEY_OBTAINED },
{ RG_BOMBCHU_SHOP_KEY, RAND_INF_BOMBCHU_SHOP_KEY_OBTAINED }, { RG_BOMBCHU_SHOP_KEY, RAND_INF_BOMBCHU_SHOP_KEY_OBTAINED },
{ RG_RICHARDS_HOUSE_KEY, RAND_INF_RICHARDS_HOUSE_KEY_OBTAINED }, { RG_RICHARDS_HOUSE_KEY, RAND_INF_RICHARDS_HOUSE_KEY_OBTAINED },
{ RG_ALLEY_HOUSE_KEY, RAND_INF_ALLEY_HOUSE_KEY_OBTAINED }, { RG_ALLEY_HOUSE_KEY, RAND_INF_ALLEY_HOUSE_KEY_OBTAINED },
{ RG_KAK_BAZAAR_KEY, RAND_INF_KAK_BAZAAR_KEY_OBTAINED }, { RG_KAK_BAZAAR_KEY, RAND_INF_KAK_BAZAAR_KEY_OBTAINED },
{ RG_KAK_POTION_SHOP_KEY, RAND_INF_KAK_POTION_SHOP_KEY_OBTAINED }, { RG_KAK_POTION_SHOP_KEY, RAND_INF_KAK_POTION_SHOP_KEY_OBTAINED },
{ RG_BOSS_HOUSE_KEY, RAND_INF_BOSS_HOUSE_KEY_OBTAINED }, { RG_BOSS_HOUSE_KEY, RAND_INF_BOSS_HOUSE_KEY_OBTAINED },
{ RG_GRANNYS_POTION_SHOP_KEY, RAND_INF_GRANNYS_POTION_SHOP_KEY_OBTAINED }, { RG_GRANNYS_POTION_SHOP_KEY, RAND_INF_GRANNYS_POTION_SHOP_KEY_OBTAINED },
{ RG_SKULLTULA_HOUSE_KEY, RAND_INF_SKULLTULA_HOUSE_KEY_OBTAINED }, { RG_SKULLTULA_HOUSE_KEY, RAND_INF_SKULLTULA_HOUSE_KEY_OBTAINED },
{ RG_IMPAS_HOUSE_KEY, RAND_INF_IMPAS_HOUSE_KEY_OBTAINED }, { RG_IMPAS_HOUSE_KEY, RAND_INF_IMPAS_HOUSE_KEY_OBTAINED },
{ RG_WINDMILL_KEY, RAND_INF_WINDMILL_KEY_OBTAINED }, { RG_WINDMILL_KEY, RAND_INF_WINDMILL_KEY_OBTAINED },
{ RG_KAK_SHOOTING_KEY, RAND_INF_KAK_SHOOTING_GALLERY_KEY_OBTAINED }, { RG_KAK_SHOOTING_KEY, RAND_INF_KAK_SHOOTING_GALLERY_KEY_OBTAINED },
{ RG_DAMPES_HUT_KEY, RAND_INF_DAMPES_HUT_KEY_OBTAINED }, { RG_DAMPES_HUT_KEY, RAND_INF_DAMPES_HUT_KEY_OBTAINED },
{ RG_TALONS_HOUSE_KEY, RAND_INF_TALONS_HOUSE_KEY_OBTAINED }, { RG_TALONS_HOUSE_KEY, RAND_INF_TALONS_HOUSE_KEY_OBTAINED },
{ RG_STABLES_KEY, RAND_INF_STABLES_KEY_OBTAINED }, { RG_STABLES_KEY, RAND_INF_STABLES_KEY_OBTAINED },
{ RG_BACK_TOWER_KEY, RAND_INF_BACK_TOWER_KEY_OBTAINED }, { RG_BACK_TOWER_KEY, RAND_INF_BACK_TOWER_KEY_OBTAINED },
{ RG_HYLIA_LAB_KEY, RAND_INF_HYLIA_LAB_KEY_OBTAINED }, { RG_HYLIA_LAB_KEY, RAND_INF_HYLIA_LAB_KEY_OBTAINED },
{ RG_FISHING_HOLE_KEY, RAND_INF_FISHING_HOLE_KEY_OBTAINED }, { RG_FISHING_HOLE_KEY, RAND_INF_FISHING_HOLE_KEY_OBTAINED },
}; };
std::map<uint32_t, uint32_t> Logic::RandoGetToDungeonScene = { std::map<uint32_t, uint32_t> Logic::RandoGetToDungeonScene = {
{ RG_FOREST_TEMPLE_SMALL_KEY, SCENE_FOREST_TEMPLE }, { RG_FOREST_TEMPLE_SMALL_KEY, SCENE_FOREST_TEMPLE },
{ RG_FIRE_TEMPLE_SMALL_KEY, SCENE_FIRE_TEMPLE }, { RG_FIRE_TEMPLE_SMALL_KEY, SCENE_FIRE_TEMPLE },
{ RG_WATER_TEMPLE_SMALL_KEY, SCENE_WATER_TEMPLE }, { RG_WATER_TEMPLE_SMALL_KEY, SCENE_WATER_TEMPLE },
{ RG_SPIRIT_TEMPLE_SMALL_KEY, SCENE_SPIRIT_TEMPLE }, { RG_SPIRIT_TEMPLE_SMALL_KEY, SCENE_SPIRIT_TEMPLE },
{ RG_SHADOW_TEMPLE_SMALL_KEY, SCENE_SHADOW_TEMPLE }, { RG_SHADOW_TEMPLE_SMALL_KEY, SCENE_SHADOW_TEMPLE },
{ RG_BOTW_SMALL_KEY, SCENE_BOTTOM_OF_THE_WELL }, { RG_BOTW_SMALL_KEY, SCENE_BOTTOM_OF_THE_WELL },
{ RG_GTG_SMALL_KEY, SCENE_GERUDO_TRAINING_GROUND }, { RG_GTG_SMALL_KEY, SCENE_GERUDO_TRAINING_GROUND },
{ RG_HIDEOUT_SMALL_KEY, SCENE_THIEVES_HIDEOUT }, { RG_HIDEOUT_SMALL_KEY, SCENE_THIEVES_HIDEOUT },
{ RG_GANONS_CASTLE_SMALL_KEY, SCENE_INSIDE_GANONS_CASTLE }, { RG_GANONS_CASTLE_SMALL_KEY, SCENE_INSIDE_GANONS_CASTLE },
{ RG_FOREST_TEMPLE_KEY_RING, SCENE_FOREST_TEMPLE }, { RG_FOREST_TEMPLE_KEY_RING, SCENE_FOREST_TEMPLE },
{ RG_FIRE_TEMPLE_KEY_RING, SCENE_FIRE_TEMPLE }, { RG_FIRE_TEMPLE_KEY_RING, SCENE_FIRE_TEMPLE },
{ RG_WATER_TEMPLE_KEY_RING, SCENE_WATER_TEMPLE }, { RG_WATER_TEMPLE_KEY_RING, SCENE_WATER_TEMPLE },
{ RG_SPIRIT_TEMPLE_KEY_RING, SCENE_SPIRIT_TEMPLE }, { RG_SPIRIT_TEMPLE_KEY_RING, SCENE_SPIRIT_TEMPLE },
{ RG_SHADOW_TEMPLE_KEY_RING, SCENE_SHADOW_TEMPLE }, { RG_SHADOW_TEMPLE_KEY_RING, SCENE_SHADOW_TEMPLE },
{ RG_BOTW_KEY_RING, SCENE_BOTTOM_OF_THE_WELL }, { RG_BOTW_KEY_RING, SCENE_BOTTOM_OF_THE_WELL },
{ RG_GTG_KEY_RING, SCENE_GERUDO_TRAINING_GROUND }, { RG_GTG_KEY_RING, SCENE_GERUDO_TRAINING_GROUND },
{ RG_HIDEOUT_KEY_RING, SCENE_THIEVES_HIDEOUT }, { RG_HIDEOUT_KEY_RING, SCENE_THIEVES_HIDEOUT },
{ RG_GANONS_CASTLE_KEY_RING, SCENE_INSIDE_GANONS_CASTLE }, { RG_GANONS_CASTLE_KEY_RING, SCENE_INSIDE_GANONS_CASTLE },
{ RG_FOREST_TEMPLE_BOSS_KEY, SCENE_FOREST_TEMPLE }, { RG_FOREST_TEMPLE_BOSS_KEY, SCENE_FOREST_TEMPLE },
{ RG_FIRE_TEMPLE_BOSS_KEY, SCENE_FIRE_TEMPLE }, { RG_FIRE_TEMPLE_BOSS_KEY, SCENE_FIRE_TEMPLE },
{ RG_WATER_TEMPLE_BOSS_KEY, SCENE_WATER_TEMPLE }, { RG_WATER_TEMPLE_BOSS_KEY, SCENE_WATER_TEMPLE },
{ RG_SPIRIT_TEMPLE_BOSS_KEY, SCENE_SPIRIT_TEMPLE }, { RG_SPIRIT_TEMPLE_BOSS_KEY, SCENE_SPIRIT_TEMPLE },
{ RG_SHADOW_TEMPLE_BOSS_KEY, SCENE_SHADOW_TEMPLE }, { RG_SHADOW_TEMPLE_BOSS_KEY, SCENE_SHADOW_TEMPLE },
{ RG_GANONS_CASTLE_BOSS_KEY, SCENE_INSIDE_GANONS_CASTLE }, { RG_GANONS_CASTLE_BOSS_KEY, SCENE_INSIDE_GANONS_CASTLE },
{ RG_DEKU_TREE_MAP, SCENE_DEKU_TREE }, { RG_DEKU_TREE_MAP, SCENE_DEKU_TREE },
{ RG_DODONGOS_CAVERN_MAP, SCENE_DODONGOS_CAVERN }, { RG_DODONGOS_CAVERN_MAP, SCENE_DODONGOS_CAVERN },
{ RG_JABU_JABUS_BELLY_MAP, SCENE_JABU_JABU }, { RG_JABU_JABUS_BELLY_MAP, SCENE_JABU_JABU },
{ RG_FOREST_TEMPLE_MAP, SCENE_FOREST_TEMPLE }, { RG_FOREST_TEMPLE_MAP, SCENE_FOREST_TEMPLE },
{ RG_FIRE_TEMPLE_MAP, SCENE_FIRE_TEMPLE }, { RG_FIRE_TEMPLE_MAP, SCENE_FIRE_TEMPLE },
{ RG_WATER_TEMPLE_MAP, SCENE_WATER_TEMPLE }, { RG_WATER_TEMPLE_MAP, SCENE_WATER_TEMPLE },
{ RG_SPIRIT_TEMPLE_MAP, SCENE_SPIRIT_TEMPLE }, { RG_SPIRIT_TEMPLE_MAP, SCENE_SPIRIT_TEMPLE },
{ RG_SHADOW_TEMPLE_MAP, SCENE_SHADOW_TEMPLE }, { RG_SHADOW_TEMPLE_MAP, SCENE_SHADOW_TEMPLE },
{ RG_BOTW_MAP, SCENE_BOTTOM_OF_THE_WELL }, { RG_BOTW_MAP, SCENE_BOTTOM_OF_THE_WELL },
{ RG_ICE_CAVERN_MAP, SCENE_ICE_CAVERN }, { RG_ICE_CAVERN_MAP, SCENE_ICE_CAVERN },
{ RG_DEKU_TREE_COMPASS, SCENE_DEKU_TREE }, { RG_DEKU_TREE_COMPASS, SCENE_DEKU_TREE },
{ RG_DODONGOS_CAVERN_COMPASS, SCENE_DODONGOS_CAVERN }, { RG_DODONGOS_CAVERN_COMPASS, SCENE_DODONGOS_CAVERN },
{ RG_JABU_JABUS_BELLY_COMPASS, SCENE_JABU_JABU }, { RG_JABU_JABUS_BELLY_COMPASS, SCENE_JABU_JABU },
{ RG_FOREST_TEMPLE_COMPASS, SCENE_FOREST_TEMPLE }, { RG_FOREST_TEMPLE_COMPASS, SCENE_FOREST_TEMPLE },
{ RG_FIRE_TEMPLE_COMPASS, SCENE_FIRE_TEMPLE }, { RG_FIRE_TEMPLE_COMPASS, SCENE_FIRE_TEMPLE },
{ RG_WATER_TEMPLE_COMPASS, SCENE_WATER_TEMPLE }, { RG_WATER_TEMPLE_COMPASS, SCENE_WATER_TEMPLE },
{ RG_SPIRIT_TEMPLE_COMPASS, SCENE_SPIRIT_TEMPLE }, { RG_SPIRIT_TEMPLE_COMPASS, SCENE_SPIRIT_TEMPLE },
{ RG_SHADOW_TEMPLE_COMPASS, SCENE_SHADOW_TEMPLE }, { RG_SHADOW_TEMPLE_COMPASS, SCENE_SHADOW_TEMPLE },
{ RG_BOTW_COMPASS, SCENE_BOTTOM_OF_THE_WELL }, { RG_BOTW_COMPASS, SCENE_BOTTOM_OF_THE_WELL },
{ RG_ICE_CAVERN_COMPASS, SCENE_ICE_CAVERN }, { RG_ICE_CAVERN_COMPASS, SCENE_ICE_CAVERN },
{ RG_TCG_SMALL_KEY, SCENE_TREASURE_BOX_SHOP } { RG_TCG_SMALL_KEY, SCENE_TREASURE_BOX_SHOP }
}; };
std::map<uint32_t, uint32_t> Logic::RandoGetToQuestItem = { std::map<uint32_t, uint32_t> Logic::RandoGetToQuestItem = {
{ RG_FOREST_MEDALLION, QUEST_MEDALLION_FOREST }, { RG_FOREST_MEDALLION, QUEST_MEDALLION_FOREST },
@ -1581,15 +1581,15 @@ std::map<uint32_t, uint32_t> Logic::RandoGetToQuestItem = {
}; };
std::map<uint32_t, uint32_t> BottleRandomizerGetToItemID = { std::map<uint32_t, uint32_t> BottleRandomizerGetToItemID = {
{ RG_BOTTLE_WITH_RED_POTION, ITEM_POTION_RED }, { RG_BOTTLE_WITH_RED_POTION, ITEM_POTION_RED },
{ RG_BOTTLE_WITH_GREEN_POTION, ITEM_POTION_GREEN }, { RG_BOTTLE_WITH_GREEN_POTION, ITEM_POTION_GREEN },
{ RG_BOTTLE_WITH_BLUE_POTION, ITEM_POTION_BLUE }, { RG_BOTTLE_WITH_BLUE_POTION, ITEM_POTION_BLUE },
{ RG_BOTTLE_WITH_FAIRY, ITEM_FAIRY }, { RG_BOTTLE_WITH_FAIRY, ITEM_FAIRY },
{ RG_BOTTLE_WITH_FISH, ITEM_FISH }, { RG_BOTTLE_WITH_FISH, ITEM_FISH },
{ RG_BOTTLE_WITH_BLUE_FIRE, ITEM_BLUE_FIRE }, { RG_BOTTLE_WITH_BLUE_FIRE, ITEM_BLUE_FIRE },
{ RG_BOTTLE_WITH_BUGS, ITEM_BUG }, { RG_BOTTLE_WITH_BUGS, ITEM_BUG },
{ RG_BOTTLE_WITH_POE, ITEM_POE }, { RG_BOTTLE_WITH_POE, ITEM_POE },
{ RG_BOTTLE_WITH_BIG_POE, ITEM_BIG_POE }, { RG_BOTTLE_WITH_BIG_POE, ITEM_BIG_POE },
}; };
uint32_t HookshotLookup[3] = { ITEM_NONE, ITEM_HOOKSHOT, ITEM_LONGSHOT }; uint32_t HookshotLookup[3] = { ITEM_NONE, ITEM_HOOKSHOT, ITEM_LONGSHOT };

View file

@ -635,17 +635,21 @@ ItemObtainability Randomizer::GetItemObtainabilityFromRandomizerGet(RandomizerGe
// Inventory Items // Inventory Items
case RG_PROGRESSIVE_STICK_BAG: case RG_PROGRESSIVE_STICK_BAG:
return infiniteUpgrades != RO_INF_UPGRADES_OFF ? return infiniteUpgrades != RO_INF_UPGRADES_OFF
(Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_STICK_UPGRADE) ? CANT_OBTAIN_ALREADY_HAVE : CAN_OBTAIN) : ? (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_STICK_UPGRADE) ? CANT_OBTAIN_ALREADY_HAVE
(CUR_UPG_VALUE(UPG_STICKS) < 3 ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE); : CAN_OBTAIN)
: (CUR_UPG_VALUE(UPG_STICKS) < 3 ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE);
case RG_DEKU_STICK_1: case RG_DEKU_STICK_1:
case RG_BUY_DEKU_STICK_1: case RG_BUY_DEKU_STICK_1:
return CUR_UPG_VALUE(UPG_STICKS) || !OTRGlobals::Instance->gRandoContext->GetOption(RSK_SHUFFLE_DEKU_STICK_BAG).Get() return CUR_UPG_VALUE(UPG_STICKS) ||
? CAN_OBTAIN : CANT_OBTAIN_NEED_UPGRADE; !OTRGlobals::Instance->gRandoContext->GetOption(RSK_SHUFFLE_DEKU_STICK_BAG).Get()
? CAN_OBTAIN
: CANT_OBTAIN_NEED_UPGRADE;
case RG_PROGRESSIVE_NUT_BAG: case RG_PROGRESSIVE_NUT_BAG:
return infiniteUpgrades != RO_INF_UPGRADES_OFF ? return infiniteUpgrades != RO_INF_UPGRADES_OFF
(Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_NUT_UPGRADE) ? CANT_OBTAIN_ALREADY_HAVE : CAN_OBTAIN) : ? (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_NUT_UPGRADE) ? CANT_OBTAIN_ALREADY_HAVE
(CUR_UPG_VALUE(UPG_NUTS) < 3 ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE); : CAN_OBTAIN)
: (CUR_UPG_VALUE(UPG_NUTS) < 3 ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE);
case RG_DEKU_NUTS_5: case RG_DEKU_NUTS_5:
case RG_DEKU_NUTS_10: case RG_DEKU_NUTS_10:
case RG_BUY_DEKU_NUTS_5: case RG_BUY_DEKU_NUTS_5:
@ -874,7 +878,8 @@ ItemObtainability Randomizer::GetItemObtainabilityFromRandomizerGet(RandomizerGe
case RG_SHADOW_TEMPLE_COMPASS: case RG_SHADOW_TEMPLE_COMPASS:
return !CHECK_DUNGEON_ITEM(DUNGEON_COMPASS, SCENE_SHADOW_TEMPLE) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; return !CHECK_DUNGEON_ITEM(DUNGEON_COMPASS, SCENE_SHADOW_TEMPLE) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE;
case RG_BOTW_COMPASS: case RG_BOTW_COMPASS:
return !CHECK_DUNGEON_ITEM(DUNGEON_COMPASS, SCENE_BOTTOM_OF_THE_WELL) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; return !CHECK_DUNGEON_ITEM(DUNGEON_COMPASS, SCENE_BOTTOM_OF_THE_WELL) ? CAN_OBTAIN
: CANT_OBTAIN_ALREADY_HAVE;
case RG_ICE_CAVERN_COMPASS: case RG_ICE_CAVERN_COMPASS:
return !CHECK_DUNGEON_ITEM(DUNGEON_COMPASS, SCENE_ICE_CAVERN) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; return !CHECK_DUNGEON_ITEM(DUNGEON_COMPASS, SCENE_ICE_CAVERN) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE;
case RG_FOREST_TEMPLE_BOSS_KEY: case RG_FOREST_TEMPLE_BOSS_KEY:
@ -906,17 +911,30 @@ ItemObtainability Randomizer::GetItemObtainabilityFromRandomizerGet(RandomizerGe
? CAN_OBTAIN ? CAN_OBTAIN
: CANT_OBTAIN_ALREADY_HAVE; : CANT_OBTAIN_ALREADY_HAVE;
case RG_SHADOW_TEMPLE_SMALL_KEY: case RG_SHADOW_TEMPLE_SMALL_KEY:
return gSaveContext.inventory.dungeonKeys[SCENE_SHADOW_TEMPLE] < SHADOW_TEMPLE_SMALL_KEY_MAX ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; return gSaveContext.inventory.dungeonKeys[SCENE_SHADOW_TEMPLE] < SHADOW_TEMPLE_SMALL_KEY_MAX
? CAN_OBTAIN
: CANT_OBTAIN_ALREADY_HAVE;
case RG_BOTW_SMALL_KEY: case RG_BOTW_SMALL_KEY:
return gSaveContext.inventory.dungeonKeys[SCENE_BOTTOM_OF_THE_WELL] < BOTTOM_OF_THE_WELL_SMALL_KEY_MAX ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; return gSaveContext.inventory.dungeonKeys[SCENE_BOTTOM_OF_THE_WELL] < BOTTOM_OF_THE_WELL_SMALL_KEY_MAX
? CAN_OBTAIN
: CANT_OBTAIN_ALREADY_HAVE;
case RG_GTG_SMALL_KEY: case RG_GTG_SMALL_KEY:
return gSaveContext.inventory.dungeonKeys[SCENE_GERUDO_TRAINING_GROUND] < GERUDO_TRAINING_GROUND_SMALL_KEY_MAX ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; return gSaveContext.inventory.dungeonKeys[SCENE_GERUDO_TRAINING_GROUND] <
GERUDO_TRAINING_GROUND_SMALL_KEY_MAX
? CAN_OBTAIN
: CANT_OBTAIN_ALREADY_HAVE;
case RG_HIDEOUT_SMALL_KEY: case RG_HIDEOUT_SMALL_KEY:
return gSaveContext.inventory.dungeonKeys[SCENE_THIEVES_HIDEOUT] < GERUDO_FORTRESS_SMALL_KEY_MAX ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; return gSaveContext.inventory.dungeonKeys[SCENE_THIEVES_HIDEOUT] < GERUDO_FORTRESS_SMALL_KEY_MAX
? CAN_OBTAIN
: CANT_OBTAIN_ALREADY_HAVE;
case RG_GANONS_CASTLE_SMALL_KEY: case RG_GANONS_CASTLE_SMALL_KEY:
return gSaveContext.inventory.dungeonKeys[SCENE_INSIDE_GANONS_CASTLE] < GANONS_CASTLE_SMALL_KEY_MAX ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; return gSaveContext.inventory.dungeonKeys[SCENE_INSIDE_GANONS_CASTLE] < GANONS_CASTLE_SMALL_KEY_MAX
? CAN_OBTAIN
: CANT_OBTAIN_ALREADY_HAVE;
case RG_TCG_SMALL_KEY: case RG_TCG_SMALL_KEY:
return gSaveContext.inventory.dungeonKeys[SCENE_TREASURE_BOX_SHOP] < TREASURE_GAME_SMALL_KEY_MAX ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; return gSaveContext.inventory.dungeonKeys[SCENE_TREASURE_BOX_SHOP] < TREASURE_GAME_SMALL_KEY_MAX
? CAN_OBTAIN
: CANT_OBTAIN_ALREADY_HAVE;
// Dungeon Rewards // Dungeon Rewards
case RG_KOKIRI_EMERALD: case RG_KOKIRI_EMERALD:
@ -5185,179 +5203,136 @@ void Randomizer::CreateCustomMessages() {
"vielleicht&dafür...", "vielleicht&dafür...",
"Vous obtenez une %rBouteille avec&un Esprit%w! Ça intéresserait&peut-être le vendeur d'Âme "), "Vous obtenez une %rBouteille avec&un Esprit%w! Ça intéresserait&peut-être le vendeur d'Âme "),
GIMESSAGE(RG_HIDEOUT_SMALL_KEY, ITEM_KEY_SMALL, GIMESSAGE(RG_HIDEOUT_SMALL_KEY, ITEM_KEY_SMALL, "You found a %yThieves Hideout &%wSmall Key!",
"You found a %yThieves Hideout &%wSmall Key!", "Du erhältst einen %rkleinen&Schlüssel%w für das %yDiebesversteck%w!",
"Du erhältst einen %rkleinen&Schlüssel%w für das %yDiebesversteck%w!", "Vous obtenez une %rPetite Clé %w&du %yRepaire des Voleurs%w!"),
"Vous obtenez une %rPetite Clé %w&du %yRepaire des Voleurs%w!"), GIMESSAGE(RG_FOREST_TEMPLE_SMALL_KEY, ITEM_KEY_SMALL, "You found a %gForest Temple &%wSmall Key!",
GIMESSAGE(RG_FOREST_TEMPLE_SMALL_KEY, ITEM_KEY_SMALL, "Du erhältst einen %rkleinen&Schlüssel%w für den %gWaldtempel%w!",
"You found a %gForest Temple &%wSmall Key!", "Vous obtenez une %rPetite Clé %w&du %gTemple de la Forêt%w!"),
"Du erhältst einen %rkleinen&Schlüssel%w für den %gWaldtempel%w!", GIMESSAGE(RG_FIRE_TEMPLE_SMALL_KEY, ITEM_KEY_SMALL, "You found a %rFire Temple &%wSmall Key!",
"Vous obtenez une %rPetite Clé %w&du %gTemple de la Forêt%w!"), "Du erhältst einen %rkleinen&Schlüssel%w für den %rFeuertempel%w!",
GIMESSAGE(RG_FIRE_TEMPLE_SMALL_KEY, ITEM_KEY_SMALL, "Vous obtenez une %rPetite Clé %w&du %rTemple du Feu%w!"),
"You found a %rFire Temple &%wSmall Key!", GIMESSAGE(RG_WATER_TEMPLE_SMALL_KEY, ITEM_KEY_SMALL, "You found a %bWater Temple &%wSmall Key!",
"Du erhältst einen %rkleinen&Schlüssel%w für den %rFeuertempel%w!", "Du erhältst einen %rkleinen&Schlüssel%w für den %bWassertempel%w!",
"Vous obtenez une %rPetite Clé %w&du %rTemple du Feu%w!"), "Vous obtenez une %rPetite Clé %w&du %bTemple de l'Eau%w!"),
GIMESSAGE(RG_WATER_TEMPLE_SMALL_KEY, ITEM_KEY_SMALL, GIMESSAGE(RG_SPIRIT_TEMPLE_SMALL_KEY, ITEM_KEY_SMALL, "You found a %ySpirit Temple &%wSmall Key!",
"You found a %bWater Temple &%wSmall Key!", "Du erhältst einen %rkleinen&Schlüssel%w für den %yGeistertempel%w!",
"Du erhältst einen %rkleinen&Schlüssel%w für den %bWassertempel%w!", "Vous obtenez une %rPetite Clé %w&du %yTemple de l'Esprit%w!"),
"Vous obtenez une %rPetite Clé %w&du %bTemple de l'Eau%w!"), GIMESSAGE(RG_SHADOW_TEMPLE_SMALL_KEY, ITEM_KEY_SMALL, "You found a %pShadow Temple &%wSmall Key!",
GIMESSAGE(RG_SPIRIT_TEMPLE_SMALL_KEY, ITEM_KEY_SMALL, "Du erhältst einen %rkleinen&Schlüssel%w für den %pSchattentempel%w!",
"You found a %ySpirit Temple &%wSmall Key!", "Vous obtenez une %rPetite Clé %w&du %pTemple de l'Ombre%w!"),
"Du erhältst einen %rkleinen&Schlüssel%w für den %yGeistertempel%w!", GIMESSAGE(RG_BOTW_SMALL_KEY, ITEM_KEY_SMALL, "You found a %pBottom of the &Well %wSmall Key!",
"Vous obtenez une %rPetite Clé %w&du %yTemple de l'Esprit%w!"), "Du erhältst einen %rkleinen&Schlüssel%w für den %pGrund des Brunnens%w!",
GIMESSAGE(RG_SHADOW_TEMPLE_SMALL_KEY, ITEM_KEY_SMALL, "Vous obtenez une %rPetite Clé %w&du %pPuits%w!"),
"You found a %pShadow Temple &%wSmall Key!", GIMESSAGE(RG_GTG_SMALL_KEY, ITEM_KEY_SMALL, "You found a %yGerudo Training &Ground %wSmall Key!",
"Du erhältst einen %rkleinen&Schlüssel%w für den %pSchattentempel%w!", "Du erhältst einen %rkleinen&Schlüssel%w für das %yGerudo-Trainingsgelände%w!",
"Vous obtenez une %rPetite Clé %w&du %pTemple de l'Ombre%w!"), "Vous obtenez une %rPetite Clé %w&du %yGymnase Gerudo%w!"),
GIMESSAGE(RG_BOTW_SMALL_KEY, ITEM_KEY_SMALL, GIMESSAGE(RG_GANONS_CASTLE_SMALL_KEY, ITEM_KEY_SMALL, "You found a %rGanon's Castle &%wSmall Key!",
"You found a %pBottom of the &Well %wSmall Key!", "Du erhältst einen %rkleinen&Schlüssel%w für %rGanons Schloß%w!",
"Du erhältst einen %rkleinen&Schlüssel%w für den %pGrund des Brunnens%w!", "Vous obtenez une %rPetite Clé %w&du %rChâteau de Ganon%w!"),
"Vous obtenez une %rPetite Clé %w&du %pPuits%w!"), GIMESSAGE(RG_GUARD_HOUSE_KEY, ITEM_KEY_SMALL, "You found the key to the&%gGuard House%w!",
GIMESSAGE(RG_GTG_SMALL_KEY, ITEM_KEY_SMALL, "Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus der Wachen%w!",
"You found a %yGerudo Training &Ground %wSmall Key!", "Vous obtenez la %rClé %wde la&%gMaison des Gardes%w!"),
"Du erhältst einen %rkleinen&Schlüssel%w für das %yGerudo-Trainingsgelände%w!", GIMESSAGE(RG_MARKET_BAZAAR_KEY, ITEM_KEY_SMALL, "You found the key to the&%gMarket Bazaar%w!",
"Vous obtenez une %rPetite Clé %w&du %yGymnase Gerudo%w!"), "Du erhältst einen %rkleinen&Schlüssel%w für den %gBasar des Marktes%w!",
GIMESSAGE(RG_GANONS_CASTLE_SMALL_KEY, ITEM_KEY_SMALL, "Vous obtenez la %rClé %wdu %gBazar&de la Place du Marché%w!"),
"You found a %rGanon's Castle &%wSmall Key!", GIMESSAGE(RG_MARKET_POTION_SHOP_KEY, ITEM_KEY_SMALL, "You found the key to the&%gMarket Potion Shop%w!",
"Du erhältst einen %rkleinen&Schlüssel%w für %rGanons Schloß%w!", "Du erhältst einen %rkleinen&Schlüssel%w für den %gMagie-Laden des Marktes%w!",
"Vous obtenez une %rPetite Clé %w&du %rChâteau de Ganon%w!"), "Vous obtenez la %rClé %wde la&%gPlace du Marché%w!"),
GIMESSAGE(RG_GUARD_HOUSE_KEY, ITEM_KEY_SMALL, GIMESSAGE(RG_MASK_SHOP_KEY, ITEM_KEY_SMALL, "You found the key to the&%gMask Shop%w!",
"You found the key to the&%gGuard House%w!", "Du erhältst einen %rkleinen&Schlüssel%w für den %gMaskenladen%w!",
"Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus der Wachen%w!", "Vous obtenez la %rClé %wde la&%gFoire aux Masques%w!"),
"Vous obtenez la %rClé %wde la&%gMaison des Gardes%w!"), GIMESSAGE(RG_MARKET_SHOOTING_KEY, ITEM_KEY_SMALL, "You found the key to the&%gMarket Shooting Gallery%w!",
GIMESSAGE(RG_MARKET_BAZAAR_KEY, ITEM_KEY_SMALL, "Du erhältst einen %rkleinen&Schlüssel%w für die %gSchießbude des Marktes%w!",
"You found the key to the&%gMarket Bazaar%w!", "Vous obtenez la %rClé %wdu %gStand de&Tir de la Place du Marché%w!"),
"Du erhältst einen %rkleinen&Schlüssel%w für den %gBasar des Marktes%w!", GIMESSAGE(RG_BOMBCHU_BOWLING_KEY, ITEM_KEY_SMALL, "You found the key to the&%gBombchu Bowling Alley%w!",
"Vous obtenez la %rClé %wdu %gBazar&de la Place du Marché%w!"), "Du erhältst einen %rkleinen&Schlüssel%w für die %gMinenbowlingbahn%w!",
GIMESSAGE(RG_MARKET_POTION_SHOP_KEY, ITEM_KEY_SMALL, "Vous obtenez la %rClé %wdu %gBowling&Teigneux%w!"),
"You found the key to the&%gMarket Potion Shop%w!", GIMESSAGE(RG_TCG_BUILDING_KEY, ITEM_KEY_SMALL, "You found the key to the&%gTreasure Chest Game Building%w!",
"Du erhältst einen %rkleinen&Schlüssel%w für den %gMagie-Laden des Marktes%w!", "Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus des Schatzkisten-Pokers%w!",
"Vous obtenez la %rClé %wde la&%gPlace du Marché%w!"), "Vous obtenez la %rClé %wdu %gJeu de la&Chasse au Trésor%w!"),
GIMESSAGE(RG_MASK_SHOP_KEY, ITEM_KEY_SMALL, GIMESSAGE(RG_BOMBCHU_SHOP_KEY, ITEM_KEY_SMALL, "You found the key to the&%gBombchu Shop%w!",
"You found the key to the&%gMask Shop%w!", "Du erhältst einen %rkleinen&Schlüssel%w für den %gKrabbelminenladen%w!",
"Du erhältst einen %rkleinen&Schlüssel%w für den %gMaskenladen%w!", "Vous obtenez la %rClé %wdu %gMagasin&de Missiles%w!"),
"Vous obtenez la %rClé %wde la&%gFoire aux Masques%w!"), GIMESSAGE(RG_RICHARDS_HOUSE_KEY, ITEM_KEY_SMALL, "You found the key to&%gRichard's House%w!",
GIMESSAGE(RG_MARKET_SHOOTING_KEY, ITEM_KEY_SMALL, "Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus von Richard%w!",
"You found the key to the&%gMarket Shooting Gallery%w!", "Vous obtenez la %rClé %wde la %gMaison&de Kiki%w!"),
"Du erhältst einen %rkleinen&Schlüssel%w für die %gSchießbude des Marktes%w!", GIMESSAGE(RG_ALLEY_HOUSE_KEY, ITEM_KEY_SMALL, "You found the key to&the %gAlley House%w!",
"Vous obtenez la %rClé %wdu %gStand de&Tir de la Place du Marché%w!"), "Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus in der Gasse%w!",
GIMESSAGE(RG_BOMBCHU_BOWLING_KEY, ITEM_KEY_SMALL, "Vous obtenez la %rClé %wde la %gMaison&de la Ruelle%w!"),
"You found the key to the&%gBombchu Bowling Alley%w!", GIMESSAGE(RG_KAK_BAZAAR_KEY, ITEM_KEY_SMALL, "You found the key to the&%gKakariko Bazaar%w!",
"Du erhältst einen %rkleinen&Schlüssel%w für die %gMinenbowlingbahn%w!", "Du erhältst einen %rkleinen&Schlüssel%w für den %gBasar von Kakariko%w!",
"Vous obtenez la %rClé %wdu %gBowling&Teigneux%w!"), "Vous obtenez la %rClé %wdu %gBazar&de Cocorico%w!"),
GIMESSAGE(RG_TCG_BUILDING_KEY, ITEM_KEY_SMALL, GIMESSAGE(RG_KAK_POTION_SHOP_KEY, ITEM_KEY_SMALL, "You found the key to the&%gKakariko Potion Shop%w!",
"You found the key to the&%gTreasure Chest Game Building%w!", "Du erhältst einen %rkleinen&Schlüssel%w für den %gMagie-Laden von Kakariko%w!",
"Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus des Schatzkisten-Pokers%w!", "Vous obtenez la %rClé %wdu %gMagasin de&Potions de Cocorico%w!"),
"Vous obtenez la %rClé %wdu %gJeu de la&Chasse au Trésor%w!"), GIMESSAGE(RG_BOSS_HOUSE_KEY, ITEM_KEY_SMALL, "You found the key to the&%gBoss's House%w!",
GIMESSAGE(RG_BOMBCHU_SHOP_KEY, ITEM_KEY_SMALL, "Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus des Chefs%w!",
"You found the key to the&%gBombchu Shop%w!", "Vous obtenez la %rClé %wde la %gMaison&du chef des ouvriers%w!"),
"Du erhältst einen %rkleinen&Schlüssel%w für den %gKrabbelminenladen%w!", GIMESSAGE(RG_GRANNYS_POTION_SHOP_KEY, ITEM_KEY_SMALL, "You found the key to&%gGranny's Potion Shop%w!",
"Vous obtenez la %rClé %wdu %gMagasin&de Missiles%w!"), "Du erhältst einen %rkleinen&Schlüssel%w für %gAsas Hexenladen%w!",
GIMESSAGE(RG_RICHARDS_HOUSE_KEY, ITEM_KEY_SMALL, "Vous obtenez la %rClé %wde&l'%gApothicaire%w!"),
"You found the key to&%gRichard's House%w!", GIMESSAGE(RG_SKULLTULA_HOUSE_KEY, ITEM_KEY_SMALL, "You found the key to the&%gSkulltula House%w!",
"Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus von Richard%w!", "Du erhältst einen %rkleinen&Schlüssel%w für das %gSkulltula-Haus%w!",
"Vous obtenez la %rClé %wde la %gMaison&de Kiki%w!"), "Vous obtenez la %rClé %wde la %gMaison&des Araignées%w!"),
GIMESSAGE(RG_ALLEY_HOUSE_KEY, ITEM_KEY_SMALL, GIMESSAGE(RG_IMPAS_HOUSE_KEY, ITEM_KEY_SMALL, "You found the key to&%gImpa's House%w!",
"You found the key to&the %gAlley House%w!", "Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus von Impa%w!",
"Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus in der Gasse%w!", "Vous obtenez la %rClé %wde la %gMaison&d'Impa%w!"),
"Vous obtenez la %rClé %wde la %gMaison&de la Ruelle%w!"), GIMESSAGE(RG_WINDMILL_KEY, ITEM_KEY_SMALL, "You found the key to the&%gWindmill%w!",
GIMESSAGE(RG_KAK_BAZAAR_KEY, ITEM_KEY_SMALL, "Du erhältst einen %rkleinen&Schlüssel%w für die %gWindmühle%w!",
"You found the key to the&%gKakariko Bazaar%w!", "Vous obtenez la %rClé %w du %gMoulin%w!"),
"Du erhältst einen %rkleinen&Schlüssel%w für den %gBasar von Kakariko%w!", GIMESSAGE(RG_KAK_SHOOTING_KEY, ITEM_KEY_SMALL, "You found the key to the&%gKakariko Shooting Gallery%w!",
"Vous obtenez la %rClé %wdu %gBazar&de Cocorico%w!"), "Du erhältst einen %rkleinen&Schlüssel%w für die %gSchießbude von Kakariko%w!",
GIMESSAGE(RG_KAK_POTION_SHOP_KEY, ITEM_KEY_SMALL, "Vous obtenez la %rClé %w du %gStand de&Tir de Cocorico%w!"),
"You found the key to the&%gKakariko Potion Shop%w!", GIMESSAGE(RG_DAMPES_HUT_KEY, ITEM_KEY_SMALL, "You found the key to&%gDampe's Hut%w!",
"Du erhältst einen %rkleinen&Schlüssel%w für den %gMagie-Laden von Kakariko%w!", "Du erhältst einen %rkleinen&Schlüssel%w für die %gHütte von Boris%w!",
"Vous obtenez la %rClé %wdu %gMagasin de&Potions de Cocorico%w!"), "Vous obtenez la %rClé %wde la %gCabane&d'Igor%w!"),
GIMESSAGE(RG_BOSS_HOUSE_KEY, ITEM_KEY_SMALL, GIMESSAGE(RG_TALONS_HOUSE_KEY, ITEM_KEY_SMALL, "You found the key to&%gTalon's House%w!",
"You found the key to the&%gBoss's House%w!", "Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus von Talon%w!",
"Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus des Chefs%w!", "Vous obtenez la %rClé %wde la %gMaison&de Talon%w!"),
"Vous obtenez la %rClé %wde la %gMaison&du chef des ouvriers%w!"), GIMESSAGE(RG_STABLES_KEY, ITEM_KEY_SMALL, "You found the key to the&%gStables%w!",
GIMESSAGE(RG_GRANNYS_POTION_SHOP_KEY, ITEM_KEY_SMALL, "Du erhältst einen %rkleinen&Schlüssel%w für die %gStälle%w!",
"You found the key to&%gGranny's Potion Shop%w!", "Vous obtenez la %rClé %wdes %gÉcuries%w!"),
"Du erhältst einen %rkleinen&Schlüssel%w für %gAsas Hexenladen%w!", GIMESSAGE(RG_BACK_TOWER_KEY, ITEM_KEY_SMALL, "You found the key to the&%gBack Tower%w!",
"Vous obtenez la %rClé %wde&l'%gApothicaire%w!"), "Du erhältst einen %rkleinen&Schlüssel%w für den %ghinteren Turm%w!",
GIMESSAGE(RG_SKULLTULA_HOUSE_KEY, ITEM_KEY_SMALL, "Vous obtenez la %rClé %wdu %gSilo%w!"),
"You found the key to the&%gSkulltula House%w!", GIMESSAGE(RG_HYLIA_LAB_KEY, ITEM_KEY_SMALL, "You found the key to the&%gHylia Laboratory%w!",
"Du erhältst einen %rkleinen&Schlüssel%w für das %gSkulltula-Haus%w!", "Du erhältst einen %rkleinen&Schlüssel%w für das %gHylia-Labor%w!",
"Vous obtenez la %rClé %wde la %gMaison&des Araignées%w!"), "Vous obtenez la %rClé %wdu %gLaboratoire&du Lac Hylia%w!"),
GIMESSAGE(RG_IMPAS_HOUSE_KEY, ITEM_KEY_SMALL, GIMESSAGE(RG_FISHING_HOLE_KEY, ITEM_KEY_SMALL, "You found the key to the&%gPond%w!",
"You found the key to&%gImpa's House%w!", "Du erhältst einen %rkleinen&Schlüssel%w für den %gFischweiher%w!",
"Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus von Impa%w!", "Vous obtenez la %rClé %wde l'%gÉtang%w!"),
"Vous obtenez la %rClé %wde la %gMaison&d'Impa%w!"),
GIMESSAGE(RG_WINDMILL_KEY, ITEM_KEY_SMALL,
"You found the key to the&%gWindmill%w!",
"Du erhältst einen %rkleinen&Schlüssel%w für die %gWindmühle%w!",
"Vous obtenez la %rClé %w du %gMoulin%w!"),
GIMESSAGE(RG_KAK_SHOOTING_KEY, ITEM_KEY_SMALL,
"You found the key to the&%gKakariko Shooting Gallery%w!",
"Du erhältst einen %rkleinen&Schlüssel%w für die %gSchießbude von Kakariko%w!",
"Vous obtenez la %rClé %w du %gStand de&Tir de Cocorico%w!"),
GIMESSAGE(RG_DAMPES_HUT_KEY, ITEM_KEY_SMALL,
"You found the key to&%gDampe's Hut%w!",
"Du erhältst einen %rkleinen&Schlüssel%w für die %gHütte von Boris%w!",
"Vous obtenez la %rClé %wde la %gCabane&d'Igor%w!"),
GIMESSAGE(RG_TALONS_HOUSE_KEY, ITEM_KEY_SMALL,
"You found the key to&%gTalon's House%w!",
"Du erhältst einen %rkleinen&Schlüssel%w für das %gHaus von Talon%w!",
"Vous obtenez la %rClé %wde la %gMaison&de Talon%w!"),
GIMESSAGE(RG_STABLES_KEY, ITEM_KEY_SMALL,
"You found the key to the&%gStables%w!",
"Du erhältst einen %rkleinen&Schlüssel%w für die %gStälle%w!",
"Vous obtenez la %rClé %wdes %gÉcuries%w!"),
GIMESSAGE(RG_BACK_TOWER_KEY, ITEM_KEY_SMALL,
"You found the key to the&%gBack Tower%w!",
"Du erhältst einen %rkleinen&Schlüssel%w für den %ghinteren Turm%w!",
"Vous obtenez la %rClé %wdu %gSilo%w!"),
GIMESSAGE(RG_HYLIA_LAB_KEY, ITEM_KEY_SMALL,
"You found the key to the&%gHylia Laboratory%w!",
"Du erhältst einen %rkleinen&Schlüssel%w für das %gHylia-Labor%w!",
"Vous obtenez la %rClé %wdu %gLaboratoire&du Lac Hylia%w!"),
GIMESSAGE(RG_FISHING_HOLE_KEY, ITEM_KEY_SMALL,
"You found the key to the&%gPond%w!",
"Du erhältst einen %rkleinen&Schlüssel%w für den %gFischweiher%w!",
"Vous obtenez la %rClé %wde l'%gÉtang%w!"),
GIMESSAGE(RG_HIDEOUT_KEY_RING, ITEM_KEY_SMALL, GIMESSAGE(RG_HIDEOUT_KEY_RING, ITEM_KEY_SMALL, "You found a %yThieves Hideout&%wKeyring!",
"You found a %yThieves Hideout&%wKeyring!", "Du erhältst ein %rSchlüsselbund%w&für das %yDiebesversteck%w!",
"Du erhältst ein %rSchlüsselbund%w&für das %yDiebesversteck%w!", "Vous obtenez le trousseau de&clés du %yRepaire des Voleurs%w!"),
"Vous obtenez le trousseau de&clés du %yRepaire des Voleurs%w!"), GIMESSAGE(RG_FOREST_TEMPLE_KEY_RING, ITEM_KEY_SMALL, "You found a %gForest Temple&%wKeyring!",
GIMESSAGE(RG_FOREST_TEMPLE_KEY_RING, ITEM_KEY_SMALL, "Du erhältst ein %rSchlüsselbund%w&für den %gWaldtempel%w!",
"You found a %gForest Temple&%wKeyring!", "Vous obtenez le trousseau de&clés du %gTemple de la Forêt%w!"),
"Du erhältst ein %rSchlüsselbund%w&für den %gWaldtempel%w!", GIMESSAGE(RG_FIRE_TEMPLE_KEY_RING, ITEM_KEY_SMALL, "You found a %rFire Temple&%wKeyring!",
"Vous obtenez le trousseau de&clés du %gTemple de la Forêt%w!"), "Du erhältst ein %rSchlüsselbund%w&für den %rFeuertempel%w!",
GIMESSAGE(RG_FIRE_TEMPLE_KEY_RING, ITEM_KEY_SMALL, "Vous obtenez le trousseau de&clés du %rTemple du Feu%w!"),
"You found a %rFire Temple&%wKeyring!", GIMESSAGE(RG_WATER_TEMPLE_KEY_RING, ITEM_KEY_SMALL, "You found a %bWater Temple&%wKeyring!",
"Du erhältst ein %rSchlüsselbund%w&für den %rFeuertempel%w!", "Du erhältst ein %rSchlüsselbund%w&für den %bWassertempel%w!",
"Vous obtenez le trousseau de&clés du %rTemple du Feu%w!"), "Vous obtenez le trousseau de&clés du %bTemple de l'Eau%w!"),
GIMESSAGE(RG_WATER_TEMPLE_KEY_RING, ITEM_KEY_SMALL, GIMESSAGE(RG_SPIRIT_TEMPLE_KEY_RING, ITEM_KEY_SMALL, "You found a %ySpirit Temple&%wKeyring!",
"You found a %bWater Temple&%wKeyring!", "Du erhältst ein %rSchlüsselbund%w&für den %yGeistertempel%w!",
"Du erhältst ein %rSchlüsselbund%w&für den %bWassertempel%w!", "Vous obtenez le trousseau de&clés du %yTemple de l'Esprit%w!"),
"Vous obtenez le trousseau de&clés du %bTemple de l'Eau%w!"), GIMESSAGE(RG_SHADOW_TEMPLE_KEY_RING, ITEM_KEY_SMALL, "You found a %pShadow Temple&%wKeyring!",
GIMESSAGE(RG_SPIRIT_TEMPLE_KEY_RING, ITEM_KEY_SMALL, "Du erhältst ein %rSchlüsselbund%w&für den %pSchattentempel%w!",
"You found a %ySpirit Temple&%wKeyring!", "Vous obtenez le trousseau de&clés du %pTemple de l'Ombre%w!"),
"Du erhältst ein %rSchlüsselbund%w&für den %yGeistertempel%w!", GIMESSAGE(RG_BOTW_KEY_RING, ITEM_KEY_SMALL, "You found a %pBottom of the&Well %wKeyring!",
"Vous obtenez le trousseau de&clés du %yTemple de l'Esprit%w!"), "Du erhältst ein %rSchlüsselbund%w&für den %pGrund des Brunnens%w!",
GIMESSAGE(RG_SHADOW_TEMPLE_KEY_RING, ITEM_KEY_SMALL, "Vous obtenez le trousseau de&clés du %pPuits%w!"),
"You found a %pShadow Temple&%wKeyring!", GIMESSAGE(RG_GTG_KEY_RING, ITEM_KEY_SMALL, "You found a %yGerudo Training&Ground %wKeyring!",
"Du erhältst ein %rSchlüsselbund%w&für den %pSchattentempel%w!", "Du erhältst ein %rSchlüsselbund%w&für das %yGerudo-Trainingsgelände%w!",
"Vous obtenez le trousseau de&clés du %pTemple de l'Ombre%w!"), "Vous obtenez le trousseau de&clés du %yGymnase Gerudo%w!"),
GIMESSAGE(RG_BOTW_KEY_RING, ITEM_KEY_SMALL, GIMESSAGE(RG_GANONS_CASTLE_KEY_RING, ITEM_KEY_SMALL, "You found a %rGanon's Castle&%wKeyring!",
"You found a %pBottom of the&Well %wKeyring!", "Du erhältst ein %rSchlüsselbund%w&für %rGanons Schloß%w!",
"Du erhältst ein %rSchlüsselbund%w&für den %pGrund des Brunnens%w!", "Vous obtenez le trousseau de&clés du %rChâteau de Ganon%w!"),
"Vous obtenez le trousseau de&clés du %pPuits%w!"), GIMESSAGE(RG_TCG_KEY_RING, ITEM_KEY_SMALL, "You found a %rTreasure Chest Game&%wKeyring!",
GIMESSAGE(RG_GTG_KEY_RING, ITEM_KEY_SMALL, "Du erhältst ein %rSchlüsselbund%w& für das %rSchatztruhen-Poker&%w!",
"You found a %yGerudo Training&Ground %wKeyring!", "Vous obtenez le trousseau de&clés du %rJeu de la Chasse au Trésor%w!"),
"Du erhältst ein %rSchlüsselbund%w&für das %yGerudo-Trainingsgelände%w!",
"Vous obtenez le trousseau de&clés du %yGymnase Gerudo%w!"),
GIMESSAGE(RG_GANONS_CASTLE_KEY_RING, ITEM_KEY_SMALL,
"You found a %rGanon's Castle&%wKeyring!",
"Du erhältst ein %rSchlüsselbund%w&für %rGanons Schloß%w!",
"Vous obtenez le trousseau de&clés du %rChâteau de Ganon%w!"),
GIMESSAGE(RG_TCG_KEY_RING, ITEM_KEY_SMALL,
"You found a %rTreasure Chest Game&%wKeyring!",
"Du erhältst ein %rSchlüsselbund%w& für das %rSchatztruhen-Poker&%w!",
"Vous obtenez le trousseau de&clés du %rJeu de la Chasse au Trésor%w!"),
GIMESSAGE(RG_FOREST_TEMPLE_BOSS_KEY, ITEM_KEY_BOSS, "You found the %gForest Temple&%wBoss Key!", GIMESSAGE(RG_FOREST_TEMPLE_BOSS_KEY, ITEM_KEY_BOSS, "You found the %gForest Temple&%wBoss Key!",
"Du erhältst den %rMaster-Schlüssel%w&für den %gWaldtempel%w!", "Du erhältst den %rMaster-Schlüssel%w&für den %gWaldtempel%w!",
@ -5378,87 +5353,67 @@ void Randomizer::CreateCustomMessages() {
"Du erhältst den %rMaster-Schlüssel%w&für %rGanons Schloß%w!", "Du erhältst den %rMaster-Schlüssel%w&für %rGanons Schloß%w!",
"Vous obtenez la %rClé d'or %wdu&%rChâteau de Ganon%w!"), "Vous obtenez la %rClé d'or %wdu&%rChâteau de Ganon%w!"),
GIMESSAGE(RG_DEKU_TREE_MAP, ITEM_DUNGEON_MAP, GIMESSAGE(RG_DEKU_TREE_MAP, ITEM_DUNGEON_MAP, "You found the %gDeku Tree&%wMap![[typeHint]]",
"You found the %gDeku Tree&%wMap![[typeHint]]", "Du erhältst die %rKarte%w für den&%gDeku-Baum%w![[typeHint]]",
"Du erhältst die %rKarte%w für den&%gDeku-Baum%w![[typeHint]]", "Vous obtenez la %rCarte %wde&l'%gArbre Mojo%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]]",
GIMESSAGE(RG_DODONGOS_CAVERN_MAP, ITEM_DUNGEON_MAP, "Du erhältst die %rKarte%w für&%rDodongos Höhle%w![[typeHint]]",
"You found the %rDodongo's Cavern&%wMap![[typeHint]]", "Vous obtenez la %rCarte %wde la&%rCaverne Dodongo%w![[typeHint]]"),
"Du erhältst die %rKarte%w für&%rDodongos Höhle%w![[typeHint]]", GIMESSAGE(RG_JABU_JABUS_BELLY_MAP, ITEM_DUNGEON_MAP, "You found the %bJabu Jabu's Belly&%wMap![[typeHint]]",
"Vous obtenez la %rCarte %wde la&%rCaverne Dodongo%w![[typeHint]]"), "Du erhältst die %rKarte%w für&%bJabu-Jabus Bauch%w![[typeHint]]",
GIMESSAGE(RG_JABU_JABUS_BELLY_MAP, ITEM_DUNGEON_MAP, "Vous obtenez la %rCarte %wdu&%bVentre de Jabu-Jabu%w![[typeHint]]"),
"You found the %bJabu Jabu's Belly&%wMap![[typeHint]]", GIMESSAGE(RG_FOREST_TEMPLE_MAP, ITEM_DUNGEON_MAP, "You found the %gForest Temple&%wMap![[typeHint]]",
"Du erhältst die %rKarte%w für&%bJabu-Jabus Bauch%w![[typeHint]]", "Du erhältst die %rKarte%w für den&%gWaldtempel%w![[typeHint]]",
"Vous obtenez la %rCarte %wdu&%bVentre de Jabu-Jabu%w![[typeHint]]"), "Vous obtenez la %rCarte %wdu&%gTemple de la Forêt%w![[typeHint]]"),
GIMESSAGE(RG_FOREST_TEMPLE_MAP, ITEM_DUNGEON_MAP, GIMESSAGE(RG_FIRE_TEMPLE_MAP, ITEM_DUNGEON_MAP, "You found the %rFire Temple&%wMap![[typeHint]]",
"You found the %gForest Temple&%wMap![[typeHint]]", "Du erhältst die %rKarte%w für den&%rFeuertempel%w![[typeHint]]",
"Du erhältst die %rKarte%w für den&%gWaldtempel%w![[typeHint]]", "Vous obtenez la %rCarte %wdu&%rTemple du Feu%w![[typeHint]]"),
"Vous obtenez la %rCarte %wdu&%gTemple de la Forêt%w![[typeHint]]"), GIMESSAGE(RG_WATER_TEMPLE_MAP, ITEM_DUNGEON_MAP, "You found the %bWater Temple&%wMap![[typeHint]]",
GIMESSAGE(RG_FIRE_TEMPLE_MAP, ITEM_DUNGEON_MAP, "Du erhältst die %rKarte%w für den&%bWassertempel%w![[typeHint]]",
"You found the %rFire Temple&%wMap![[typeHint]]", "Vous obtenez la %rCarte %wdu&%bTemple de l'Eau%w![[typeHint]]"),
"Du erhältst die %rKarte%w für den&%rFeuertempel%w![[typeHint]]", GIMESSAGE(RG_SPIRIT_TEMPLE_MAP, ITEM_DUNGEON_MAP, "You found the %ySpirit Temple&%wMap![[typeHint]]",
"Vous obtenez la %rCarte %wdu&%rTemple du Feu%w![[typeHint]]"), "Du erhältst die %rKarte%w für den&%yGeistertempel%w![[typeHint]]",
GIMESSAGE(RG_WATER_TEMPLE_MAP, ITEM_DUNGEON_MAP, "Vous obtenez la %rCarte %wdu&%yTemple de l'Esprit%w![[typeHint]]"),
"You found the %bWater Temple&%wMap![[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&%bWassertempel%w![[typeHint]]", "Du erhältst die %rKarte%w für den&%pSchattentempel%w![[typeHint]]",
"Vous obtenez la %rCarte %wdu&%bTemple de l'Eau%w![[typeHint]]"), "Vous obtenez la %rCarte %wdu&%pTemple de l'Ombre%w![[typeHint]]"),
GIMESSAGE(RG_SPIRIT_TEMPLE_MAP, ITEM_DUNGEON_MAP, GIMESSAGE(RG_BOTW_MAP, ITEM_DUNGEON_MAP, "You found the %pBottom of the&Well %wMap![[typeHint]]",
"You found the %ySpirit Temple&%wMap![[typeHint]]", "Du erhältst die %rKarte%w für den&%pGrund des Brunnens%w![[typeHint]]",
"Du erhältst die %rKarte%w für den&%yGeistertempel%w![[typeHint]]", "Vous obtenez la %rCarte %wdu&%pPuits%w![[typeHint]]"),
"Vous obtenez la %rCarte %wdu&%yTemple de l'Esprit%w![[typeHint]]"), GIMESSAGE(RG_ICE_CAVERN_MAP, ITEM_DUNGEON_MAP, "You found the %cIce Cavern&%wMap![[typeHint]]",
GIMESSAGE(RG_SHADOW_TEMPLE_MAP, ITEM_DUNGEON_MAP, "Du erhältst die %rKarte%w für die&%cEishöhle%w![[typeHint]]",
"You found the %pShadow Temple&%wMap![[typeHint]]", "Vous obtenez la %rCarte %wde&la %cCaverne Polaire%w![[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_BOTW_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]]"),
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]]"),
GIMESSAGE(RG_DEKU_TREE_COMPASS, ITEM_COMPASS, GIMESSAGE(RG_DEKU_TREE_COMPASS, ITEM_COMPASS, "You found the %gDeku Tree&%wCompass!",
"You found the %gDeku Tree&%wCompass!", "Du erhältst den %rKompaß%w für den&%gDeku-Baum%w!",
"Du erhältst den %rKompaß%w für den&%gDeku-Baum%w!", "Vous obtenez la %rBoussole %wde&l'%gArbre Mojo%w!"),
"Vous obtenez la %rBoussole %wde&l'%gArbre Mojo%w!"), GIMESSAGE(RG_DODONGOS_CAVERN_COMPASS, ITEM_COMPASS, "You found the %rDodongo's Cavern&%wCompass!",
GIMESSAGE(RG_DODONGOS_CAVERN_COMPASS, ITEM_COMPASS, "Du erhältst den %rKompaß%w für&%rDodongos Höhle%w!",
"You found the %rDodongo's Cavern&%wCompass!", "Vous obtenez la %rBoussole %wde la&%rCaverne Dodongo%w!"),
"Du erhältst den %rKompaß%w für&%rDodongos Höhle%w!", GIMESSAGE(RG_JABU_JABUS_BELLY_COMPASS, ITEM_COMPASS, "You found the %bJabu Jabu's Belly&%wCompass!",
"Vous obtenez la %rBoussole %wde la&%rCaverne Dodongo%w!"), "Du erhältst den %rKompaß%w für den&%bJabu-Jabus Bauch%w!",
GIMESSAGE(RG_JABU_JABUS_BELLY_COMPASS, ITEM_COMPASS, "Vous obtenez la %rBoussole %wdu&%bVentre de Jabu-Jabu%w!"),
"You found the %bJabu Jabu's Belly&%wCompass!", GIMESSAGE(RG_FOREST_TEMPLE_COMPASS, ITEM_COMPASS, "You found the %gForest Temple&%wCompass!",
"Du erhältst den %rKompaß%w für den&%bJabu-Jabus Bauch%w!", "Du erhältst den %rKompaß%w für den&%gWaldtempel%w!",
"Vous obtenez la %rBoussole %wdu&%bVentre de Jabu-Jabu%w!"), "Vous obtenez la %rBoussole %wdu&%gTemple de la Forêt%w!"),
GIMESSAGE(RG_FOREST_TEMPLE_COMPASS, ITEM_COMPASS, GIMESSAGE(RG_FIRE_TEMPLE_COMPASS, ITEM_COMPASS, "You found the %rFire Temple&%wCompass!",
"You found the %gForest Temple&%wCompass!", "Du erhältst den %rKompaß%w für den&%rFeuertempel%w!",
"Du erhältst den %rKompaß%w für den&%gWaldtempel%w!", "Vous obtenez la %rBoussole %wdu&%rTemple du Feu%w!"),
"Vous obtenez la %rBoussole %wdu&%gTemple de la Forêt%w!"), GIMESSAGE(RG_WATER_TEMPLE_COMPASS, ITEM_COMPASS, "You found the %bWater Temple&%wCompass!",
GIMESSAGE(RG_FIRE_TEMPLE_COMPASS, ITEM_COMPASS, "Du erhältst den %rKompaß%w für den&%bWassertempel%w!",
"You found the %rFire Temple&%wCompass!", "Vous obtenez la %rBoussole %wdu&%bTemple de l'Eau%w!"),
"Du erhältst den %rKompaß%w für den&%rFeuertempel%w!", GIMESSAGE(RG_SPIRIT_TEMPLE_COMPASS, ITEM_COMPASS, "You found the %ySpirit Temple&%wCompass!",
"Vous obtenez la %rBoussole %wdu&%rTemple du Feu%w!"), "Du erhältst den %rKompaß%w für den&%yGeistertempel%w!",
GIMESSAGE(RG_WATER_TEMPLE_COMPASS, ITEM_COMPASS, "Vous obtenez la %rBoussole %wdu&%yTemple de l'Esprit%w!"),
"You found the %bWater Temple&%wCompass!", GIMESSAGE(RG_SHADOW_TEMPLE_COMPASS, ITEM_COMPASS, "You found the %pShadow Temple&%wCompass!",
"Du erhältst den %rKompaß%w für den&%bWassertempel%w!", "Du erhältst den %rKompaß%w für den&%pSchattentempel%w!",
"Vous obtenez la %rBoussole %wdu&%bTemple de l'Eau%w!"), "Vous obtenez la %rBoussole %wdu&%pTemple de l'Ombre%w!"),
GIMESSAGE(RG_SPIRIT_TEMPLE_COMPASS, ITEM_COMPASS, GIMESSAGE(RG_BOTW_COMPASS, ITEM_COMPASS, "You found the %pBottom of the&Well %wCompass!",
"You found the %ySpirit Temple&%wCompass!", "Du erhältst den %rKompaß%w für den&%pGrund des Brunnens%w!",
"Du erhältst den %rKompaß%w für den&%yGeistertempel%w!", "Vous obtenez la %rBoussole %wdu&%pPuits%w!"),
"Vous obtenez la %rBoussole %wdu&%yTemple de l'Esprit%w!"), GIMESSAGE(RG_ICE_CAVERN_COMPASS, ITEM_COMPASS, "You found the %cIce Cavern&%wCompass!",
GIMESSAGE(RG_SHADOW_TEMPLE_COMPASS, ITEM_COMPASS, "Du erhältst den %rKompaß%w für die&%cEishöhle%w!",
"You found the %pShadow Temple&%wCompass!", "Vous obtenez la %rBoussole %wde&la %cCaverne Polaire%w!"),
"Du erhältst den %rKompaß%w für den&%pSchattentempel%w!",
"Vous obtenez la %rBoussole %wdu&%pTemple de l'Ombre%w!"),
GIMESSAGE(RG_BOTW_COMPASS, ITEM_COMPASS,
"You found the %pBottom of the&Well %wCompass!",
"Du erhältst den %rKompaß%w für den&%pGrund des Brunnens%w!",
"Vous obtenez la %rBoussole %wdu&%pPuits%w!"),
GIMESSAGE(RG_ICE_CAVERN_COMPASS, ITEM_COMPASS,
"You found the %cIce Cavern&%wCompass!",
"Du erhältst den %rKompaß%w für die&%cEishöhle%w!",
"Vous obtenez la %rBoussole %wde&la %cCaverne Polaire%w!"),
GIMESSAGE(RG_MAGIC_BEAN_PACK, ITEM_BEAN, GIMESSAGE(RG_MAGIC_BEAN_PACK, ITEM_BEAN,
"You got a %rPack of Magic Beans%w!&Find a suitable spot for a garden&and plant them. Then, wait " "You got a %rPack of Magic Beans%w!&Find a suitable spot for a garden&and plant them. Then, wait "

View file

@ -1809,7 +1809,9 @@ void DrawLocation(RandomizerCheck rc) {
txt = itemLoc->GetPlacedItem().GetName().GetForCurrentLanguage(MF_RAW); txt = itemLoc->GetPlacedItem().GetName().GetForCurrentLanguage(MF_RAW);
} else { } else {
if (IsHeartPiece((GetItemID)Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetItemID())) { if (IsHeartPiece((GetItemID)Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetItemID())) {
txt = Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetName().GetForCurrentLanguage(MF_RAW); txt = Rando::StaticData::RetrieveItem(loc->GetVanillaItem())
.GetName()
.GetForCurrentLanguage(MF_RAW);
} }
} }
break; break;
@ -1838,7 +1840,9 @@ void DrawLocation(RandomizerCheck rc) {
} }
} else { } else {
if (IsHeartPiece((GetItemID)Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetItemID())) { if (IsHeartPiece((GetItemID)Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetItemID())) {
txt = Rando::StaticData::RetrieveItem(loc->GetVanillaItem()).GetName().GetForCurrentLanguage(MF_RAW); txt = Rando::StaticData::RetrieveItem(loc->GetVanillaItem())
.GetName()
.GetForCurrentLanguage(MF_RAW);
} }
} }
break; break;

View file

@ -133,30 +133,30 @@ std::vector<ItemTrackerItem> ocarinaButtonItems = {
std::vector<ItemTrackerItem> overworldKeyItems = { std::vector<ItemTrackerItem> overworldKeyItems = {
// Hack for right now, just gonna overworld keys as dungeon keys. // Hack for right now, just gonna overworld keys as dungeon keys.
// Will replace with other macro once we have a custom texture // Will replace with other macro once we have a custom texture
ITEM_TRACKER_ITEM_CUSTOM(RG_GUARD_HOUSE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), ITEM_TRACKER_ITEM_CUSTOM(RG_GUARD_HOUSE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem),
ITEM_TRACKER_ITEM_CUSTOM(RG_MARKET_BAZAAR_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), ITEM_TRACKER_ITEM_CUSTOM(RG_MARKET_BAZAAR_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem),
ITEM_TRACKER_ITEM_CUSTOM(RG_MARKET_POTION_SHOP_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), ITEM_TRACKER_ITEM_CUSTOM(RG_MARKET_POTION_SHOP_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem),
ITEM_TRACKER_ITEM_CUSTOM(RG_MASK_SHOP_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), ITEM_TRACKER_ITEM_CUSTOM(RG_MASK_SHOP_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem),
ITEM_TRACKER_ITEM_CUSTOM(RG_MARKET_SHOOTING_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), ITEM_TRACKER_ITEM_CUSTOM(RG_MARKET_SHOOTING_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem),
ITEM_TRACKER_ITEM_CUSTOM(RG_BOMBCHU_BOWLING_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), ITEM_TRACKER_ITEM_CUSTOM(RG_BOMBCHU_BOWLING_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem),
ITEM_TRACKER_ITEM_CUSTOM(RG_TCG_BUILDING_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), ITEM_TRACKER_ITEM_CUSTOM(RG_TCG_BUILDING_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem),
ITEM_TRACKER_ITEM_CUSTOM(RG_BOMBCHU_SHOP_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), ITEM_TRACKER_ITEM_CUSTOM(RG_BOMBCHU_SHOP_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem),
ITEM_TRACKER_ITEM_CUSTOM(RG_RICHARDS_HOUSE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), ITEM_TRACKER_ITEM_CUSTOM(RG_RICHARDS_HOUSE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem),
ITEM_TRACKER_ITEM_CUSTOM(RG_ALLEY_HOUSE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), ITEM_TRACKER_ITEM_CUSTOM(RG_ALLEY_HOUSE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem),
ITEM_TRACKER_ITEM_CUSTOM(RG_KAK_BAZAAR_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), ITEM_TRACKER_ITEM_CUSTOM(RG_KAK_BAZAAR_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem),
ITEM_TRACKER_ITEM_CUSTOM(RG_KAK_POTION_SHOP_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), ITEM_TRACKER_ITEM_CUSTOM(RG_KAK_POTION_SHOP_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem),
ITEM_TRACKER_ITEM_CUSTOM(RG_BOSS_HOUSE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), ITEM_TRACKER_ITEM_CUSTOM(RG_BOSS_HOUSE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem),
ITEM_TRACKER_ITEM_CUSTOM(RG_GRANNYS_POTION_SHOP_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), ITEM_TRACKER_ITEM_CUSTOM(RG_GRANNYS_POTION_SHOP_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem),
ITEM_TRACKER_ITEM_CUSTOM(RG_SKULLTULA_HOUSE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), ITEM_TRACKER_ITEM_CUSTOM(RG_SKULLTULA_HOUSE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem),
ITEM_TRACKER_ITEM_CUSTOM(RG_IMPAS_HOUSE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), ITEM_TRACKER_ITEM_CUSTOM(RG_IMPAS_HOUSE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem),
ITEM_TRACKER_ITEM_CUSTOM(RG_WINDMILL_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), ITEM_TRACKER_ITEM_CUSTOM(RG_WINDMILL_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem),
ITEM_TRACKER_ITEM_CUSTOM(RG_KAK_SHOOTING_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), ITEM_TRACKER_ITEM_CUSTOM(RG_KAK_SHOOTING_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem),
ITEM_TRACKER_ITEM_CUSTOM(RG_DAMPES_HUT_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), ITEM_TRACKER_ITEM_CUSTOM(RG_DAMPES_HUT_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem),
ITEM_TRACKER_ITEM_CUSTOM(RG_TALONS_HOUSE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), ITEM_TRACKER_ITEM_CUSTOM(RG_TALONS_HOUSE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem),
ITEM_TRACKER_ITEM_CUSTOM(RG_STABLES_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), ITEM_TRACKER_ITEM_CUSTOM(RG_STABLES_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem),
ITEM_TRACKER_ITEM_CUSTOM(RG_BACK_TOWER_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), ITEM_TRACKER_ITEM_CUSTOM(RG_BACK_TOWER_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem),
ITEM_TRACKER_ITEM_CUSTOM(RG_HYLIA_LAB_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), ITEM_TRACKER_ITEM_CUSTOM(RG_HYLIA_LAB_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem),
ITEM_TRACKER_ITEM_CUSTOM(RG_FISHING_HOLE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem), ITEM_TRACKER_ITEM_CUSTOM(RG_FISHING_HOLE_KEY, ITEM_KEY_SMALL, ITEM_KEY_SMALL, 0, DrawItem),
}; };
std::vector<ItemTrackerItem> fishingPoleItems = { ITEM_TRACKER_ITEM(ITEM_FISHING_POLE, 0, DrawItem) }; std::vector<ItemTrackerItem> fishingPoleItems = { ITEM_TRACKER_ITEM(ITEM_FISHING_POLE, 0, DrawItem) };

View file

@ -233,21 +233,22 @@ StaticData::PopulateTranslationMap(std::unordered_map<uint32_t, CustomMessage> i
return output; return output;
} }
std::unordered_map<std::string, uint32_t> StaticData::PopulateTranslationMap(std::unordered_map<uint32_t, RandomizerHintTextKey> input){ std::unordered_map<std::string, uint32_t>
std::unordered_map<std::string, uint32_t> output = {}; StaticData::PopulateTranslationMap(std::unordered_map<uint32_t, RandomizerHintTextKey> input) {
for (const auto& [key, text] : input) { std::unordered_map<std::string, uint32_t> output = {};
std::vector<std::string> strings = hintTextTable[text].GetClear().GetAllMessages(); for (const auto& [key, text] : input) {
for (std::string string: strings){ std::vector<std::string> strings = hintTextTable[text].GetClear().GetAllMessages();
if (output.contains(string)){ for (std::string string : strings) {
if (output[string] != key && string != ""){ if (output.contains(string)) {
SPDLOG_DEBUG("\tREPEATED STRING WITH " + string + "\n\n"); if (output[string] != key && string != "") {
SPDLOG_DEBUG("\tREPEATED STRING WITH " + string + "\n\n");
}
} else {
output[string] = key;
}
} }
} else {
output[string] = key;
}
} }
} return output;
return output;
} }
std::unordered_map<std::string, uint32_t> StaticData::hintNameToEnum = {}; std::unordered_map<std::string, uint32_t> StaticData::hintNameToEnum = {};

View file

@ -558,8 +558,8 @@ void SaveManager::SaveRandomizer(SaveContext* saveContext, int sectionID, bool f
std::vector<RandomizerGet> items = hint->GetHintedItems(); std::vector<RandomizerGet> items = hint->GetHintedItems();
SaveManager::Instance->SaveArray("items", items.size(), [&](size_t i) { SaveManager::Instance->SaveArray("items", items.size(), [&](size_t i) {
SaveManager::Instance->SaveData("", SaveManager::Instance->SaveData(
Rando::StaticData::GetItemTable()[items[i]].GetName().GetEnglish(MF_RAW)); "", Rando::StaticData::GetItemTable()[items[i]].GetName().GetEnglish(MF_RAW));
}); });
std::vector<uint8_t> itemNamesChosen = hint->GetItemNamesChosen(); std::vector<uint8_t> itemNamesChosen = hint->GetItemNamesChosen();