From d9a08b0b0544600b5c0fccc2cb2202bab7d54ecf Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Mon, 24 Aug 2026 20:36:55 -0500 Subject: [PATCH 01/63] Update Z3DR --- Z3DR | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Z3DR b/Z3DR index dad19da..10d91b2 160000 --- a/Z3DR +++ b/Z3DR @@ -1 +1 @@ -Subproject commit dad19da27d3578835bf08c69da9833669db58549 +Subproject commit 10d91b25b51aa86b1359bc511f0de1899007325a From 79ac89dc8d9d2b893300d8298b2e2a12cfee702b Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Sat, 29 Aug 2026 18:05:04 -0500 Subject: [PATCH 02/63] Shopsanity Initial - Changes settings to include Shopsanity and Scrubsanity and edits descriptions - Adjusts Item Pool to split Scrub Purchases from Shops, Also implements item pool logic for Shopsanity and Scrubsanity - Adjusts Item Locations for proper override values for shops --- Z3DR | 2 +- source/include/item_location.hpp | 2 +- source/include/setting_descriptions.hpp | 7 +- source/item_location.cpp | 47 ++++++----- source/item_pool.cpp | 105 ++++++------------------ source/location_access.cpp | 8 +- source/setting_descriptions.cpp | 40 ++------- source/settings.cpp | 9 +- 8 files changed, 68 insertions(+), 152 deletions(-) diff --git a/Z3DR b/Z3DR index 10d91b2..b0d0dd3 160000 --- a/Z3DR +++ b/Z3DR @@ -1 +1 @@ -Subproject commit 10d91b25b51aa86b1359bc511f0de1899007325a +Subproject commit b0d0dd3240427b3a5ea6e6776ff0b04ce6b870b6 diff --git a/source/include/item_location.hpp b/source/include/item_location.hpp index e28a8f8..b4181b0 100644 --- a/source/include/item_location.hpp +++ b/source/include/item_location.hpp @@ -225,7 +225,7 @@ class ItemLocation { void SetPlacedItem(const ItemKey item) { placedItem = item; - //SetPrice(ItemTable(placedItem).GetPrice()); + SetPrice(ItemTable(placedItem).GetPrice()); } //Saves an item to be set as placedItem later diff --git a/source/include/setting_descriptions.hpp b/source/include/setting_descriptions.hpp index c3fa332..cdc3ac9 100644 --- a/source/include/setting_descriptions.hpp +++ b/source/include/setting_descriptions.hpp @@ -123,12 +123,7 @@ extern string_view fastElegyStatuesDesc; extern string_view skipSongReplaysDesc; extern string_view shopsOff; -extern string_view shopsZero; -extern string_view shopsOne; -extern string_view shopsTwo; -extern string_view shopsThree; -extern string_view shopsFour; -extern string_view shopsRandom; +extern string_view shopsOn; extern string_view tokensOff; extern string_view tokensDungeon; diff --git a/source/item_location.cpp b/source/item_location.cpp index 1c691b7..0393372 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -229,15 +229,13 @@ void LocationTable_Init() { locationTable[TWIN_ISLANDS_CAVE_CHEST] = ItemLocation::Chest (0x5E, 0x00, true, "TI Cave Chest", TWIN_ISLANDS_CAVE_CHEST, RED_RUPEE, {Category::cTwinIslands,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_TWIN_ISLANDS ); locationTable[TWIN_ISLANDS_LULLABY_INTRO] = ItemLocation::Base (0x5D, 0x74, false, "TI Lullaby Intro", TWIN_ISLANDS_LULLABY_INTRO, PROGRESSIVE_LULLABY, {Category::cTwinIslands, Category::cSong, Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_TWIN_ISLANDS ); //W Clock Town - locationTable[W_CLOCK_TOWN_BOMB_BAG_BUY] = ItemLocation::Base (0x0D, 0x1B, false, "WCT Bomb Bag Purchase", W_CLOCK_TOWN_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG, {Category::cWestClockTown,Category::cDayOne, Category::cShop, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); - locationTable[W_CLOCK_TOWN_BIG_BOMB_BAG_BUY] = ItemLocation::Base (0x0D, 0x1C, false, "WCT Big Bomb Bag Purchase", W_CLOCK_TOWN_BIG_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG, {Category::cWestClockTown,Category::cDayTwo, Category::cShop, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); locationTable[W_CLOCK_TOWN_POSTMANS_GAME] = ItemLocation::Base (0x2E, 0x0C, false, "WCT Postman's Game", W_CLOCK_TOWN_POSTMANS_GAME, PIECE_OF_HEART, {Category::cWestClockTown, Category::cVanillaHeartPiece,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); locationTable[W_CLOCK_TOWN_ROSA_SISTERS] = ItemLocation::Base (0x6D, 0x0C, false, "WCT Rosa Sisters", W_CLOCK_TOWN_ROSA_SISTERS, PIECE_OF_HEART, {Category::cWestClockTown, Category::cVanillaHeartPiece,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); locationTable[W_CLOCK_TOWN_SWORDSMANS_SCHOOL] = ItemLocation::Base (0x54, 0x0C, false, "WCT Swordsman's School", W_CLOCK_TOWN_SWORDSMANS_SCHOOL, PIECE_OF_HEART, {Category::cWestClockTown, Category::cVanillaHeartPiece,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); locationTable[W_CLOCK_TOWN_ALL_NIGHT_MASK_BUY] = ItemLocation::Base (0x0D, 0x7E, false, "WCT All-Night Mask Purchase", W_CLOCK_TOWN_ALL_NIGHT_MASK_BUY, ALL_NIGHT_MASK, {Category::cWestClockTown, Category::cVanillaMask,Category::cDayThree}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); //locationTable[W_CLOCK_TOWN_LOTTERY] = ItemLocation::Base (0x39, 0x00, true, "WCT Lottery", W_CLOCK_TOWN_LOTTERY, PURPLE_RUPEE, {Category::cWestClockTown}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); locationTable[W_CLOCK_TOWN_BOMB_SHOP_GORON] = ItemLocation::Base (0x0D, 0x34, true, "WCT Bomb Shop Goron", W_CLOCK_TOWN_BOMB_SHOP_GORON, POWDER_KEG, {Category::cWestClockTown, Category::cMerchant,Category::cDayOne, Category::cShop, Category::cMainInventory}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); - locationTable[W_CLOCK_TOWN_CURIOSITY_BOMB_BAG] = ItemLocation::Base (0x0D, 0x00, true, "WCT Curiosity Shop Bomb Bag", W_CLOCK_TOWN_CURIOSITY_BOMB_BAG, PROGRESSIVE_BOMB_BAG, {Category::cWestClockTown, Category::cDayTwo, Category::cShop, Category::cMainInventory}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); + locationTable[W_CLOCK_TOWN_CURIOSITY_BOMB_BAG] = ItemLocation::Base (0x0D, 0x1D, true, "WCT Curiosity Shop Bomb Bag", W_CLOCK_TOWN_CURIOSITY_BOMB_BAG, PROGRESSIVE_BOMB_BAG, {Category::cWestClockTown, Category::cDayTwo, Category::cShop, Category::cMainInventory}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); //Woodfall locationTable[WOODFALL_BRIDGE_CHEST] = ItemLocation::Chest (0x46, 0x01, true, "WF Bridge Chest", WOODFALL_BRIDGE_CHEST, PIECE_OF_HEART, {Category::cWoodfall, Category::cVanillaHeartPiece, Category::cChest, Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_WOODFALL ); locationTable[WOODFALL_BEHIND_OWL_CHEST] = ItemLocation::Chest (0x46, 0x02, true, "WF Behind Owl Chest", WOODFALL_BEHIND_OWL_CHEST, BLUE_RUPEE, {Category::cWoodfall,Category::cChest ,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_WOODFALL ); @@ -557,30 +555,31 @@ void LocationTable_Init() { 3 4 7 8 1 2 3 ------------------------------- -----------------------*/ - locationTable[TRADING_POST_ITEM_1] = ItemLocation::Base (0x34,0x00, true, "Trading Post Item 1", TRADING_POST_ITEM_1, BUY_RED_POTION, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_2] = ItemLocation::Base (0x34,0x00, true, "Trading Post Item 2", TRADING_POST_ITEM_2, BUY_GREEN_POTION, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 1), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_3] = ItemLocation::Base (0x34,0x00, true, "Trading Post Item 3", TRADING_POST_ITEM_3, BUY_HEROS_SHIELD, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 2), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_4] = ItemLocation::Base (0x34,0x00, true, "Trading Post Item 4", TRADING_POST_ITEM_4, BUY_FAIRYS_SPIRIT, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 3), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_5] = ItemLocation::Base (0x34,0x00, true, "Trading Post Item 5", TRADING_POST_ITEM_5, BUY_DEKU_STICK_1, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 4), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_6] = ItemLocation::Base (0x34,0x00, true, "Trading Post Item 6", TRADING_POST_ITEM_6, BUY_ARROWS_30, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 5), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_7] = ItemLocation::Base (0x34,0x00, true, "Trading Post Item 7", TRADING_POST_ITEM_7, BUY_DEKU_NUT_10, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 6), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_8] = ItemLocation::Base (0x34,0x00, true, "Trading Post Item 8", TRADING_POST_ITEM_8, BUY_MAGIC_BEAN, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 7), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_1] = ItemLocation::Base (0x34,0x01, true, "Trading Post Item 1", TRADING_POST_ITEM_1, BUY_RED_POTION, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_2] = ItemLocation::Base (0x34,0x02, true, "Trading Post Item 2", TRADING_POST_ITEM_2, BUY_GREEN_POTION, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 1), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_3] = ItemLocation::Base (0x34,0x03, true, "Trading Post Item 3", TRADING_POST_ITEM_3, BUY_HEROS_SHIELD, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 2), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_4] = ItemLocation::Base (0x34,0x04, true, "Trading Post Item 4", TRADING_POST_ITEM_4, BUY_FAIRYS_SPIRIT, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 3), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_5] = ItemLocation::Base (0x34,0x05, true, "Trading Post Item 5", TRADING_POST_ITEM_5, BUY_DEKU_STICK_1, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 4), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_6] = ItemLocation::Base (0x34,0x06, true, "Trading Post Item 6", TRADING_POST_ITEM_6, BUY_ARROWS_30, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 5), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_7] = ItemLocation::Base (0x34,0x07, true, "Trading Post Item 7", TRADING_POST_ITEM_7, BUY_DEKU_NUT_10, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 6), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_8] = ItemLocation::Base (0x34,0x08, true, "Trading Post Item 8", TRADING_POST_ITEM_8, BUY_MAGIC_BEAN, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 7), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[BOMB_SHOP_ITEM_1] = ItemLocation::Base (0x68,0x00, true, "Bomb Shop Item 1", BOMB_SHOP_ITEM_1, BOMBS_10, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x68, 0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[BOMB_SHOP_ITEM_2] = ItemLocation::Base (0x68,0x00, true, "Bomb Shop Item 2", BOMB_SHOP_ITEM_2, BOMBCHU_10, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x68, 1), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - //locationTable[BOMB_SHOP_ITEM_3] = ItemLocation::Base(0x68,0x00, true, "Bomb Shop Item 3", BOMB_SHOP_ITEM_3, BOMBS_20, {Category::cEastClockTown,Category::cShop,Category::cDayOne}, SpoilerCollectionCheck::ShopItem(0x00, 0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - - locationTable[POTION_SHOP_ITEM_1] = ItemLocation::Base (0x0A,0x00, true, "Potion Shop Item 1", POTION_SHOP_ITEM_1, BLUE_POTION_REFILL, {Category::cSouthernSwamp,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x0A, 0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP); - locationTable[POTION_SHOP_ITEM_2] = ItemLocation::Base (0x0A,0x00, true, "Potion Shop Item 2", POTION_SHOP_ITEM_2, GREEN_POTION_REFILL, {Category::cSouthernSwamp,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x0A, 1), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP); - locationTable[POTION_SHOP_ITEM_3] = ItemLocation::Base (0x0A,0x00, true, "Potion Shop Item 3", POTION_SHOP_ITEM_3, RED_POTION_REFILL, {Category::cSouthernSwamp,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x0A, 2), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP); + locationTable[BOMB_SHOP_ITEM_1] = ItemLocation::Base (0x68,0x01, true, "Bomb Shop Item 1", BOMB_SHOP_ITEM_1, BOMBS_10, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x68, 0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[BOMB_SHOP_ITEM_2] = ItemLocation::Base (0x68,0x02, true, "Bomb Shop Item 2", BOMB_SHOP_ITEM_2, BOMBCHU_10, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x68, 1), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[W_CLOCK_TOWN_BOMB_BAG_BUY] = ItemLocation::Base (0x68,0x03, false, "WCT Bomb Bag Purchase", W_CLOCK_TOWN_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG, {Category::cWestClockTown,Category::cDayOne, Category::cShop, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); + locationTable[W_CLOCK_TOWN_BIG_BOMB_BAG_BUY] = ItemLocation::Base (0x68,0x04, false, "WCT Big Bomb Bag Purchase", W_CLOCK_TOWN_BIG_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG, {Category::cWestClockTown,Category::cDayTwo, Category::cShop, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); + + locationTable[POTION_SHOP_ITEM_1] = ItemLocation::Base (0x0A,0x01, true, "Potion Shop Item 1", POTION_SHOP_ITEM_1, BLUE_POTION_REFILL, {Category::cSouthernSwamp,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x0A, 0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP); + locationTable[POTION_SHOP_ITEM_2] = ItemLocation::Base (0x0A,0x02, true, "Potion Shop Item 2", POTION_SHOP_ITEM_2, GREEN_POTION_REFILL, {Category::cSouthernSwamp,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x0A, 1), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP); + locationTable[POTION_SHOP_ITEM_3] = ItemLocation::Base (0x0A,0x03, true, "Potion Shop Item 3", POTION_SHOP_ITEM_3, RED_POTION_REFILL, {Category::cSouthernSwamp,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x0A, 2), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP); - locationTable[GORON_SHOP_ITEM_1] = ItemLocation::Base (0x3D,0x00, true, "Goron Shop Item 1", GORON_SHOP_ITEM_1, BOMBS_10, {Category::cGoronVillage,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x3D, 0), SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE); - locationTable[GORON_SHOP_ITEM_2] = ItemLocation::Base (0x3D,0x00, true, "Goron Shop Item 2", GORON_SHOP_ITEM_2, ARROWS_10, {Category::cGoronVillage,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x3D, 1), SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE); - locationTable[GORON_SHOP_ITEM_3] = ItemLocation::Base (0x3D,0x00, true, "Goron Shop Item 3", GORON_SHOP_ITEM_3, RED_POTION_REFILL, {Category::cGoronVillage,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x3D, 2), SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE); + locationTable[GORON_SHOP_ITEM_1] = ItemLocation::Base (0x3D,0x01, true, "Goron Shop Item 1", GORON_SHOP_ITEM_1, BOMBS_10, {Category::cGoronVillage,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x3D, 0), SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE); + locationTable[GORON_SHOP_ITEM_2] = ItemLocation::Base (0x3D,0x02, true, "Goron Shop Item 2", GORON_SHOP_ITEM_2, ARROWS_10, {Category::cGoronVillage,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x3D, 1), SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE); + locationTable[GORON_SHOP_ITEM_3] = ItemLocation::Base (0x3D,0x03, true, "Goron Shop Item 3", GORON_SHOP_ITEM_3, RED_POTION_REFILL, {Category::cGoronVillage,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x3D, 2), SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE); - locationTable[ZORA_SHOP_ITEM_1] = ItemLocation::Base (0x4C,0x00, true, "Zora Shop Item 1", ZORA_SHOP_ITEM_1, HEROS_SHIELD, {Category::cZoraHall,Category::cShop,Category::cDayOne}, SpoilerCollectionCheck::ShopItem(0x4C, 0), SpoilerCollectionCheckGroup::GROUP_ZORA_HALL); - locationTable[ZORA_SHOP_ITEM_2] = ItemLocation::Base (0x4C,0x00, true, "Zora Shop Item 2", ZORA_SHOP_ITEM_2, ARROWS_10, {Category::cZoraHall,Category::cShop,Category::cDayOne}, SpoilerCollectionCheck::ShopItem(0x4C, 1), SpoilerCollectionCheckGroup::GROUP_ZORA_HALL); - locationTable[ZORA_SHOP_ITEM_3] = ItemLocation::Base (0x4C,0x00, true, "Zora Shop Item 3", ZORA_SHOP_ITEM_3, RED_POTION_REFILL, {Category::cZoraHall,Category::cShop,Category::cDayOne}, SpoilerCollectionCheck::ShopItem(0x4C, 2), SpoilerCollectionCheckGroup::GROUP_ZORA_HALL); + locationTable[ZORA_SHOP_ITEM_1] = ItemLocation::Base (0x4C,0x01, true, "Zora Shop Item 1", ZORA_SHOP_ITEM_1, HEROS_SHIELD, {Category::cZoraHall,Category::cShop,Category::cDayOne}, SpoilerCollectionCheck::ShopItem(0x4C, 0), SpoilerCollectionCheckGroup::GROUP_ZORA_HALL); + locationTable[ZORA_SHOP_ITEM_2] = ItemLocation::Base (0x4C,0x02, true, "Zora Shop Item 2", ZORA_SHOP_ITEM_2, ARROWS_10, {Category::cZoraHall,Category::cShop,Category::cDayOne}, SpoilerCollectionCheck::ShopItem(0x4C, 1), SpoilerCollectionCheckGroup::GROUP_ZORA_HALL); + locationTable[ZORA_SHOP_ITEM_3] = ItemLocation::Base (0x4C,0x03, true, "Zora Shop Item 3", ZORA_SHOP_ITEM_3, RED_POTION_REFILL, {Category::cZoraHall,Category::cShop,Category::cDayOne}, SpoilerCollectionCheck::ShopItem(0x4C, 2), SpoilerCollectionCheckGroup::GROUP_ZORA_HALL); diff --git a/source/item_pool.cpp b/source/item_pool.cpp index 9ad2175..6600783 100644 --- a/source/item_pool.cpp +++ b/source/item_pool.cpp @@ -469,6 +469,13 @@ const std::array scrubTradeItems = { OCEAN_TITLE, }; +const std::array scrubPurchases = { + MAGIC_BEAN, + PROGRESSIVE_BOMB_BAG,//BIGGEST_BOMB_BAG + BLUE_POTION_REFILL, + GREEN_POTION_REFILL, +}; + const std::array anjuKafeiTradeItems = { LETTER_KAFEI, LETTER_MAMA, @@ -603,74 +610,6 @@ static void PlaceVanillaStrayFairies() { dungeon->PlaceVanillaGBTStray(); dungeon->PlaceVanillaSTStray(); } - //Clock Town - PlaceItemInLocation(LAUNDRY_POOL_SF, CT_STRAY_FAIRY); - /* - //Woodfall Temple - PlaceItemInLocation(WF_SF_ENTRANCE_FAIRY, WF_STRAY_FAIRY); - PlaceItemInLocation(WF_SF_ENTRANCE_PLATFORM, WF_STRAY_FAIRY); - PlaceItemInLocation(WF_SF_MAIN_ROOM_BUBBLE, WF_STRAY_FAIRY); - PlaceItemInLocation(WF_SF_MAIN_ROOM_SWITCH, WF_STRAY_FAIRY); - PlaceItemInLocation(WF_SF_PRE_BOSS_LOWER_RIGHT_BUBBLE, WF_STRAY_FAIRY); - PlaceItemInLocation(WF_SF_PRE_BOSS_UPPER_RIGHT_BUBBLE, WF_STRAY_FAIRY); - PlaceItemInLocation(WF_SF_PRE_BOSS_UPPER_LEFT_BUBBLE, WF_STRAY_FAIRY); - PlaceItemInLocation(WF_SF_PRE_BOSS_PILLAR_BUBBLE, WF_STRAY_FAIRY); - PlaceItemInLocation(WF_SF_DEKU_BABA, WF_STRAY_FAIRY); - PlaceItemInLocation(WF_SF_DRAGONFLY_ROOM_BUBBLE, WF_STRAY_FAIRY); - PlaceItemInLocation(WF_SF_SKULLTULA, WF_STRAY_FAIRY); - PlaceItemInLocation(WF_SF_DARK_ROOM, WF_STRAY_FAIRY); - PlaceItemInLocation(WF_SF_JAR_FAIRY, WF_STRAY_FAIRY); - PlaceItemInLocation(WF_SF_BRIDGE_ROOM_BEEHIVE, WF_STRAY_FAIRY); - PlaceItemInLocation(WF_SF_PLATFORM_ROOM_BEEHIVE, WF_STRAY_FAIRY); - //SnowheadTemple - PlaceItemInLocation(SH_SF_SNOW_ROOM_BUBBLE, SH_STRAY_FAIRY); - PlaceItemInLocation(SH_SF_CEILING_BUBBLE, SH_STRAY_FAIRY); - PlaceItemInLocation(SH_SF_DINOLFOS_1, SH_STRAY_FAIRY); - PlaceItemInLocation(SH_SF_DINOLFOS_2, SH_STRAY_FAIRY); - PlaceItemInLocation(SH_SF_BRIDGE_ROOM_LEDGE_BUBBLE, SH_STRAY_FAIRY); - PlaceItemInLocation(SH_SF_BRIDGE_ROOM_PILLAR_BUBBLE, SH_STRAY_FAIRY); - PlaceItemInLocation(SH_SF_MAP_ROOM_FAIRY, SH_STRAY_FAIRY); - PlaceItemInLocation(SH_SF_MAP_ROOM_LEDGE, SH_STRAY_FAIRY); - PlaceItemInLocation(SH_SF_BASEMENT, SH_STRAY_FAIRY); - PlaceItemInLocation(SH_SF_TWIN_BLOCK, SH_STRAY_FAIRY); - PlaceItemInLocation(SH_SF_ICICLE_ROOM_WALL, SH_STRAY_FAIRY); - PlaceItemInLocation(SH_SF_MAIN_ROOM_WALL, SH_STRAY_FAIRY); - PlaceItemInLocation(SH_SF_PILLAR_FREEZARDS, SH_STRAY_FAIRY); - PlaceItemInLocation(SH_SF_ICE_PUZZLE, SH_STRAY_FAIRY); - PlaceItemInLocation(SH_SF_CRATE, SH_STRAY_FAIRY); - //Great Bay Temple - PlaceItemInLocation(GBT_SF_SKULLTULA, GBT_STRAY_FAIRY); - PlaceItemInLocation(GBT_SF_WATER_CONTROL_UNDERWATER_BUBBLE, GBT_STRAY_FAIRY); - PlaceItemInLocation(GBT_SF_WATERWHEEL_ROOM_LOWER, GBT_STRAY_FAIRY); - PlaceItemInLocation(GBT_SF_WATERWHEEL_ROOM_UPPER, GBT_STRAY_FAIRY); - PlaceItemInLocation(GBT_SF_GREEN_VALVE, GBT_STRAY_FAIRY); - PlaceItemInLocation(GBT_SF_SEESAW_ROOM, GBT_STRAY_FAIRY); - PlaceItemInLocation(GBT_SF_ENTRANCE_TORCHES, GBT_STRAY_FAIRY); - PlaceItemInLocation(GBT_SF_BIO_BABAS, GBT_STRAY_FAIRY); - PlaceItemInLocation(GBT_SF_UNDERWATER_BARREL, GBT_STRAY_FAIRY); - PlaceItemInLocation(GBT_SF_WHIRLPOOL_JAR, GBT_STRAY_FAIRY); - PlaceItemInLocation(GBT_SF_WHIRLPOOL_BARREL, GBT_STRAY_FAIRY); - PlaceItemInLocation(GBT_SF_DEXIHANDS_JAR, GBT_STRAY_FAIRY); - PlaceItemInLocation(GBT_SF_LEDGE_JAR, GBT_STRAY_FAIRY); - PlaceItemInLocation(GBT_SF_PRE_BOSS_ROOM_BUBBLE, GBT_STRAY_FAIRY); - PlaceItemInLocation(GBT_SF_PRE_BOSS_ROOM_UNDERWATER_BUBBLE, GBT_STRAY_FAIRY); - //Stone Tower Temple - PlaceItemInLocation(ST_SF_MIRROR_SUN_BLOCK, ST_STRAY_FAIRY); - PlaceItemInLocation(ST_SF_LAVA_ROOM_LEDGE, ST_STRAY_FAIRY); - PlaceItemInLocation(ST_SF_LAVA_ROOM_FIRE_RING, ST_STRAY_FAIRY); - PlaceItemInLocation(ST_SF_EYEGORE, ST_STRAY_FAIRY); - PlaceItemInLocation(ST_SF_UPDRAFT_FIRE_RING, ST_STRAY_FAIRY); - PlaceItemInLocation(ST_SF_MIRROR_SUN_SWITCH, ST_STRAY_FAIRY); - PlaceItemInLocation(ST_SF_BOSS_WARP, ST_STRAY_FAIRY); - PlaceItemInLocation(ST_SF_WIZZROBE, ST_STRAY_FAIRY); - PlaceItemInLocation(ST_SF_DEATH_ARMOS, ST_STRAY_FAIRY); - PlaceItemInLocation(ST_SF_UPDRAFT_FROZEN_EYE, ST_STRAY_FAIRY); - PlaceItemInLocation(ST_SF_THIN_BRIDGE, ST_STRAY_FAIRY); - PlaceItemInLocation(ST_SF_BASEMENT_LEDGE, ST_STRAY_FAIRY); - PlaceItemInLocation(ST_SF_STATUE_EYE, ST_STRAY_FAIRY); - PlaceItemInLocation(ST_SF_UNDERWATER, ST_STRAY_FAIRY); - PlaceItemInLocation(ST_SF_BRIDGE_CRYSTAL, ST_STRAY_FAIRY); - */ }; static void PlaceVanillaSkulltulaTokens() { @@ -713,12 +652,15 @@ static void PlaceVanillaShopItems() { PlaceItemInLocation(ZORA_SHOP_ITEM_1, BUY_HEROS_SHIELD); PlaceItemInLocation(ZORA_SHOP_ITEM_2, BUY_ARROWS_10); PlaceItemInLocation(ZORA_SHOP_ITEM_3, BUY_RED_POTION); + PlaceItemInLocation(MILK_ROAD_GORMAN_MILK_BUY, MILK); + //other 2 scrub sales handled in beans and main inventory +}; + +static void PlaceVanillaScrubPurchases() { PlaceItemInLocation(GORON_VILLAGE_SCRUB_PURCHASE, PROGRESSIVE_BOMB_BAG); PlaceItemInLocation(GORON_VILLAGE_SCRUB_PURCHASE_SPRING, PROGRESSIVE_BOMB_BAG); PlaceItemInLocation(IKANA_CANYON_SCRUB_PURCHASE, BLUE_POTION_REFILL); PlaceItemInLocation(ZORA_HALL_SCRUB_PURCHASE, GREEN_POTION_REFILL); - PlaceItemInLocation(MILK_ROAD_GORMAN_MILK_BUY, MILK); - //other 2 scrub sales handled in beans and main inventory }; static void SetScarceItemPool() { @@ -1021,15 +963,20 @@ void GenerateItemPool() { PlaceItemInLocation(LAUNDRY_POOL_KAFEI,PENDANT_MEMORIES); } - //TO-DO----SHOP SANITY - //for now... its all vanilla lol - //if (Settings::Shopsanity.Is(ShopsanitySetting::SHOPSANITY_OFF) || Settings::Shopsanity.Is(ShopsanitySetting::SHOPSANITY_ZERO)) { - AddItemsToPool(ItemPool, normalRupees); - PlaceVanillaShopItems(); - // } else { //Shopsanity 1-4, random - //AddItemsToPool(ItemPool, shopsanityRupees); //Shopsanity gets extra large rupees - //PlaceVanillaShopItems(); - //} + //SHOPSANITY + if (Shopsanity) { + AddItemsToPool(ItemPool, shopsanityRupees); //Shopsanity gets extra large rupees + AddItemsToPool(ItemPool, shopItems); + } else { + AddItemsToPool(ItemPool, normalRupees); + PlaceVanillaShopItems(); + } + if (Scrubsanity) { + AddItemsToPool(ItemPool, scrubPurchases); + } + else { + PlaceVanillaScrubPurchases(); + } //Then Place Tingle Maps if (ShuffleTingleMaps) { diff --git a/source/location_access.cpp b/source/location_access.cpp index 17be4ff..60bc5dc 100644 --- a/source/location_access.cpp +++ b/source/location_access.cpp @@ -24,7 +24,7 @@ bool LocationAccess::ConditionsMet() const { conditionsMet= true; } - return conditionsMet;// && CanBuy(); + return conditionsMet && CanBuy(); } bool LocationAccess::CanBuy() const { @@ -36,13 +36,13 @@ bool LocationAccess::CanBuy() const { //Check if current walet is large enough bool SufficientWallet = true; if (Location(location)->GetPrice() > 500) { - SufficientWallet = Logic::ProgressiveWallet >= 3; + SufficientWallet = Logic::ProgressiveWallet >= 2; } else if (Location(location)->GetPrice() > 200) { - SufficientWallet = Logic::ProgressiveWallet >= 2; + SufficientWallet = Logic::ProgressiveWallet >= 1; } else if (Location(location)->GetPrice() > 99) { - SufficientWallet = Logic::ProgressiveWallet >= 1; + SufficientWallet = Logic::ProgressiveWallet >= 0; } bool OtherCondition = true; diff --git a/source/setting_descriptions.cpp b/source/setting_descriptions.cpp index a68a71d..c7c8894 100644 --- a/source/setting_descriptions.cpp +++ b/source/setting_descriptions.cpp @@ -455,29 +455,9 @@ string_view linksPocketNothing = "**OPTION CURRENTLY WIP**\n" | SHOPSANITY | // ------------------------------*/ // string_view shopsOff = "All shop items will be the same as vanilla."; // -string_view shopsZero = "**OPTION CURRENTLY WIP**\n" // - "Vanilla shop items will be shuffled among\n" // - "different shops."; // -string_view shopsOne = "**OPTION CURRENTLY WIP**\n" // - "Vanilla shop items will be shuffled among\n" // - "different shops, and each shop will contain\n" // - "one non-vanilla shop item."; // -string_view shopsTwo = "**OPTION CURRENTLY WIP**\n" // - "Vanilla shop items will be shuffled among\n" // - "different shops, and each shop will contain\n" // - "two non-vanilla shop items."; // -string_view shopsThree = "**OPTION CURRENTLY WIP**\n" // - "Vanilla shop items will be shuffled among\n" // - "different shops, and each shop will contain\n" // - "three non-vanilla shop items."; // -string_view shopsFour = "**OPTION CURRENTLY WIP**\n" // - "Vanilla shop items will be shuffled among\n" // - "different shops, and each shop will contain\n" // - "four non-vanilla shop items."; // -string_view shopsRandom = "**OPTION CURRENTLY WIP**\n" // - "Vanilla shop items will be shuffled among\n" // - "different shops, and each shop will contain\n" // - "1-4 non-vanilla shop items."; // +string_view shopsOn = "Items in Shops will be randomized, this includes\n"// + "Trading Post, Bomb Shop, Swamp Potion Shop, Goron\n"// + "Village and Zora Hall Shops.";// /*------------------------------ // | TOKENSANITY | // ------------------------------*/ // @@ -488,20 +468,14 @@ string_view tokensAllTokens = "Effectively adds 60 new locations for i /*------------------------------ // | SCRUB SHUFFLE | // ------------------------------*/ // -string_view scrubsOff = "Deku Scrub Salesmen will not be randomized"; // -string_view scrubsAffordable = "**OPTION CURRENTLY WIP**\n" // - "All Scrub prices will be reduced to 10 rupees each"; -string_view scrubsExpensive = "**OPTION CURRENTLY WIP**\n" // - "All Scrub prices will be their vanilla prices.\n";// -string_view scrubsRandomPrices = "**OPTION CURRENTLY WIP**\n" // - "All Scrub prices will be between 0-95 rupees. This" - "will on average be very, very expensive overall.";// +string_view scrubsOff = "Deku Scrub Purchases will not be randomized."; // +string_view scrubsOn = "Deku Scrub Purchases will be randomized."; // /*------------------------------ // | SHUFFLE COWS | // ------------------------------*/ // string_view shuffleCowsDesc = "Enabling this will let cows give you items upon\n"// "performing Epona's song in front of them. There\n"// - "are 7 cows"; // + "are 7 cows."; // // /*------------------------------ // | SHUFFLE OCARINAS | // @@ -509,7 +483,7 @@ string_view shuffleCowsDesc = "Enabling this will let cows give you it string_view ocarinasDesc = "Setting this to No shuffles the Ocarina of Time\n"// "into the item pool." // "\n" // - "This will require finding an Ocarina before being\n" + "This will require finding the Ocarina before being\n" "able to play songs or restart the cycle"; // /*------------------------------ // diff --git a/source/settings.cpp b/source/settings.cpp index 1422cc3..d50912f 100644 --- a/source/settings.cpp +++ b/source/settings.cpp @@ -375,9 +375,9 @@ namespace Settings { Option ShuffleSongs = Option::U8 ("Shuffle Songs", {"Off", "Song Locations", "Anywhere"}, {songsVanilla, songsSongLocations, songsAllLocations}, OptionCategory::Setting, 0); Option ShuffleSoaring = Option::Bool("Shuffle Song of Soaring",{"Off", "On"}, {shuffleSoaringVanilla, shuffleSoaringRandom}, OptionCategory::Setting, 0); Option ShuffleSongOfTime = Option::Bool("Shuffle Song of Time", {"Off", "On"}, {songTimeVanilla, songTimeRandom}, OptionCategory::Setting, 0); - Option Shopsanity = Option::U8 ("Shopsanity", {"Off", "0", "1", "2", "3", "4", "Random"}, {shopsOff, shopsZero, shopsOne, shopsTwo, shopsThree, shopsFour, shopsRandom}); - Option Tokensanity = Option::Bool("Tokensanity", {"Off", "On"}, {tokensOff, tokensAllTokens}); - Option Scrubsanity = Option::U8 ("Shuffle Scrub Wares", {"Off", "Affordable", "Expensive", "Random Prices"}, {scrubsOff, scrubsAffordable, scrubsExpensive, scrubsRandomPrices}); + Option Shopsanity = Option::Bool("Shopsanity", {"Off", "On"}, {shopsOff, shopsOn}, OptionCategory::Setting, 0); + Option Tokensanity = Option::Bool("Tokensanity", {"Off", "On"}, {tokensOff, tokensAllTokens}, OptionCategory::Setting, 0); + Option Scrubsanity = Option::Bool("Shuffle Scrub Purchases",{"Off", "On"}, {scrubsOff, scrubsOn}, OptionCategory::Toggle, 0); Option ShuffleMerchants = Option::Bool("Shuffle Scrub Trades", {"Off", "On"}, {shuffleMerchantsDesc}); Option ShuffleTradeItems = Option::Bool("Shuffle Anju and Kafei",{"Off", "On"}, {shuffleTradeItemsDesc}); Option ShuffleGFRewards = Option::U8 ("Shuffle Fairy Rewards", {"Off", "Great Fairies", "Anywhere" }, {shuffleGFVanilla, shuffleGFSelf, shuffleGFAnywhere}, OptionCategory::Setting, (u8)GreatFairyRewardShuffleSetting::GFREWARDSHUFFLE_VANILLA); @@ -402,7 +402,8 @@ namespace Settings { &ShuffleSoaring, &ShuffleSongOfTime, &Tokensanity, - //&Shopsanity, + &Shopsanity, + &Scrubsanity, &ShuffleGFRewards, }; From 63434a2180c4e8382baf8f6993ac8bd03bf6df83 Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Sat, 29 Aug 2026 18:10:17 -0500 Subject: [PATCH 03/63] Update Z3DR --- Z3DR | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Z3DR b/Z3DR index b0d0dd3..93b19dc 160000 --- a/Z3DR +++ b/Z3DR @@ -1 +1 @@ -Subproject commit b0d0dd3240427b3a5ea6e6776ff0b04ce6b870b6 +Subproject commit 93b19dc131f17dbcf8407f0856f514638254bd40 From 2bcb347e8fb44cf065a5e6c0ffb6b14aa41b76fc Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Sat, 29 Aug 2026 19:52:20 -0500 Subject: [PATCH 04/63] Shop Updates Fixes a few issues with compiling --- source/include/setting_descriptions.hpp | 4 +--- source/item_pool.cpp | 7 +++++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/source/include/setting_descriptions.hpp b/source/include/setting_descriptions.hpp index cdc3ac9..9877c47 100644 --- a/source/include/setting_descriptions.hpp +++ b/source/include/setting_descriptions.hpp @@ -131,9 +131,7 @@ extern string_view tokensOverworld; extern string_view tokensAllTokens; extern string_view scrubsOff; -extern string_view scrubsAffordable; -extern string_view scrubsExpensive; -extern string_view scrubsRandomPrices; +extern string_view scrubsOn; extern string_view shuffleCowsDesc; diff --git a/source/item_pool.cpp b/source/item_pool.cpp index 6600783..bc9a2d2 100644 --- a/source/item_pool.cpp +++ b/source/item_pool.cpp @@ -504,6 +504,13 @@ std::array tingleMaps = { ROMANI_RANCH_MAP, }; +std::array shopItems = { // Only include non junk items/potions/milk + HEROS_SHIELD, + HEROS_SHIELD, + MAGIC_BEAN, + PROGRESSIVE_BOMB_BAG, + PROGRESSIVE_BOMB_BAG, +}; void AddItemToPool(std::vector& pool, ItemKey item, size_t count /*= 1*/) { pool.insert(pool.end(), count, item); } From 3a66a88c8a81e0dc88f5c7638705fa379c23bab7 Mon Sep 17 00:00:00 2001 From: pizza1398 <259104093+pizza1398@users.noreply.github.com> Date: Sun, 30 Aug 2026 19:01:49 +0200 Subject: [PATCH 05/63] Shopsanity text base (#203) * Add choice markers, CreateShopMessage - Use ># in Tingle and other shops - Create both halves of shop text from first ID - Write price to field_4 and to text * Tweak CreateShopMessage - Make part-timer variants of shop messages (En & Fr only so far) - Make out of stock variant of blue potion message automatically - Draft per-language same-line separators - Center ice trap message --- source/custom_messages.cpp | 8 +-- source/hints.cpp | 118 ++++++++++++++++++++++++++++++++----- 2 files changed, 108 insertions(+), 18 deletions(-) diff --git a/source/custom_messages.cpp b/source/custom_messages.cpp index 3f2c3fc..ae574e1 100644 --- a/source/custom_messages.cpp +++ b/source/custom_messages.cpp @@ -335,13 +335,13 @@ void CreateBaselineCustomMessages() { // Ice Trap CreateMessage(0x0012, 0xFFFF, 0x3FFFFFFF, 0xFF0000, - {" #FOOL!#", + {"><#FOOL!#", // French - "#IDIOT!#", + "><#IDIOT!#", // NOT Spanish - " #FOOL!#", + "><#FOOL!#", // German - "#NARR!#", + "><#NARR!#", }, {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_NORMAL); diff --git a/source/hints.cpp b/source/hints.cpp index f2c85e6..3305fd7 100644 --- a/source/hints.cpp +++ b/source/hints.cpp @@ -441,51 +441,141 @@ void CreateTingleHintText() { if (Settings::ShuffleTingleMaps.Is(true)) { // Logic: Get item names from location. // Create custom message for each tingle location (6) - Text clockTownMap = Text{"#"}+ItemTable(Location(TINGLE_N_CLOCK_TOWN_CT)->GetPlacedItemKey()).GetName(); - Text woodfallMap = Text{"#"}+ItemTable(Location(TINGLE_N_CLOCK_TOWN_WF)->GetPlacedItemKey()).GetName(); - Text snowHeadMap = Text{"#"}+ItemTable(Location(TINGLE_TWIN_ISLANDS_SH)->GetPlacedItemKey()).GetName(); - Text romaniMap = Text{"#"}+ItemTable(Location(TINGLE_TWIN_ISLANDS_RR)->GetPlacedItemKey()).GetName(); - Text greatBayMap = Text{"#"}+ItemTable(Location(TINGLE_GBC_GB)->GetPlacedItemKey()).GetName(); - Text ikanaMap = Text{"#"}+ItemTable(Location(TINGLE_GBC_ST)->GetPlacedItemKey()).GetName(); + Text clockTownMap = ItemTable(Location(TINGLE_N_CLOCK_TOWN_CT)->GetPlacedItemKey()).GetName(); + Text woodfallMap = ItemTable(Location(TINGLE_N_CLOCK_TOWN_WF)->GetPlacedItemKey()).GetName(); + Text snowHeadMap = ItemTable(Location(TINGLE_TWIN_ISLANDS_SH)->GetPlacedItemKey()).GetName(); + Text romaniMap = ItemTable(Location(TINGLE_TWIN_ISLANDS_RR)->GetPlacedItemKey()).GetName(); + Text greatBayMap = ItemTable(Location(TINGLE_GBC_GB)->GetPlacedItemKey()).GetName(); + Text ikanaMap = ItemTable(Location(TINGLE_GBC_ST)->GetPlacedItemKey()).GetName(); // {"English", "French", "Spanish" "German" }; "Italian" - Text priceFive = {" ##5 Rupees#&", " ##5 Rubis#&", " ##5 rupias#&", " - ##5 Rubine#&" }; // , " ##5 rupie#&" - Text priceTwenty = {" ##20 Rupees#&", " ##20 Rubis#&", " ##20 rupias#&", " - ##20 Rubine#&"}; // , " ##20 rupie#&" + Text priceFive = {" ##5 Rupees#&#", " ##5 Rubis#&#", " ##5 rupias#&#", " - ##5 Rubine#&#" }; // , " ##5 rupie#&" + Text priceTwenty = {" ##20 Rupees#&#", " ##20 Rubis#&#", " ##20 rupias#&#", " - ##20 Rubine#&#"}; // , " ##20 rupie#&" Text priceForty = {" ##40 Rupees#", " ##40 Rubis#", " ##40 rupias#", " - ##40 Rubine#" }; // , " ##40 rupie#" Text leaveShop = {"&#No thanks#", "&#Non merci#", "&#No, gracias#", "&#Nein, danke!#" }; // , "&#No, grazie#" // Clock Town message CustomMessages::CreateMessageFromTextObject(0x1D11, 0xFFFF, 0x3FF0A005, 0xFF1001, - clockTownMap+priceFive+woodfallMap+priceForty+leaveShop, + Text{">3#"}+clockTownMap+priceFive+woodfallMap+priceForty+leaveShop, {QM_GREEN, QM_RED, QM_GREEN, QM_RED, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); // Woodfall message CustomMessages::CreateMessageFromTextObject(0x1D12, 0xFFFF, 0x3FF0A014, 0xFF1001, - woodfallMap+priceTwenty+snowHeadMap+priceForty+leaveShop, + Text{">3#"}+woodfallMap+priceTwenty+snowHeadMap+priceForty+leaveShop, {QM_GREEN, QM_RED, QM_GREEN, QM_RED, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); // Snowhead message CustomMessages::CreateMessageFromTextObject(0x1D13, 0xFFFF, 0x3FF0A014, 0xFF1001, - snowHeadMap+priceTwenty+romaniMap+priceForty+leaveShop, + Text{">3#"}+snowHeadMap+priceTwenty+romaniMap+priceForty+leaveShop, {QM_GREEN, QM_RED, QM_GREEN, QM_RED, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); // Milk Road message CustomMessages::CreateMessageFromTextObject(0x1D14, 0xFFFF, 0x3FF0A014, 0xFF1001, - romaniMap+priceTwenty+greatBayMap+priceForty+leaveShop, + Text{">3#"}+romaniMap+priceTwenty+greatBayMap+priceForty+leaveShop, {QM_GREEN, QM_RED, QM_GREEN, QM_RED, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); // Great Bay message CustomMessages::CreateMessageFromTextObject(0x1D15, 0xFFFF, 0x3FF0A014, 0xFF1001, - greatBayMap+priceTwenty+ikanaMap+priceForty+leaveShop, + Text{">3#"}+greatBayMap+priceTwenty+ikanaMap+priceForty+leaveShop, {QM_GREEN, QM_RED, QM_GREEN, QM_RED, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); // Ikana message CustomMessages::CreateMessageFromTextObject(0x1D16, 0xFFFF, 0x3FF0A014, 0xFF1001, - ikanaMap+priceTwenty+clockTownMap+priceForty+leaveShop, + Text{">3#"}+ikanaMap+priceTwenty+clockTownMap+priceForty+leaveShop, {QM_GREEN, QM_RED, QM_GREEN, QM_RED, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); } } +void CreateShopMessage(u16 messageID, ItemKey shopItem, u16 buyingPrice, bool isRepeatable) { + Text itemName = ItemTable(shopItem).GetName(); + Text shopIntro = Text{"#"}+itemName+Text{ + "&>>" + // itemName.NAenglish.length() <= 30 ? ": " : "&>>", + // itemName.NAfrench.length() <= 30 ? " : " : "&>>", + // itemName.NAspanish.length() <= 30 ? ": " : "&>>", + // itemName.EURgerman.length() <= 30 ? ": " : "&>>", + // // itemName.EURitalian.length() <= 30 ? ": " : "&>>", + // itemName.EURenglish.length() <= 30 ? ": " : "&>>", + // itemName.EURfrench.length() <= 30 ? " : " : "&>>", + // itemName.EURspanish.length() <= 30 ? ": " : "&>>", + }+std::to_string(buyingPrice)+Text{ + " Rupees#&", " rubis#&", " rupias#&", " Rubine#&",// " rupie#&" + }; + Text shopDescription = {"oops"}; + if ((messageID < 0x06C9) || (messageID > 0x06D8)) { + // Regular shop + if (isRepeatable) { + shopDescription = { + /*NaEnglish*/"Special deal!&Buy as many as you want!", + /*NaFrench */"Offre spéciale!&Achetez-en à volonté!", + /*NaSpanish*/"¡Oferta especial!&¡Compra todo lo que quieras!", + /*EuGerman */"Sonderangebot!&Kauft so viel ihr wollt!", + // /*EuItalian*/"Offerta speciale!&Compratene a volontà!", + /*EuEnglish*/"", + /*EuFrench */"Offre spéciale !&Achetez-en à volonté !", + /*EuSpanish*/"", + }; + } else { + shopDescription = { + /*NaEnglish*/"Special deal! ONE LEFT!&Get it while it lasts!", + /*NaFrench */"Offre spéciale! DERNIER EN STOCK!&Maintenant ou jamais!", + /*NaSpanish*/"¡Oferta especial! ¡SOLO QUEDA UNA UNIDAD!&¡Hazte con ella antes de que se agote!", + /*EuGerman */"Sonderangebot! NUR EINS AUF LAGER!&Schlagt zu solange ihr noch könnt!", + // /*EuItalian*/"Offerta speciale! ULTIMO PEZZO!&Affrettatevi ad aquistarlo!", + /*EuEnglish*/"", + /*EuFrench */"Offre spéciale ! DERNIER EN STOCK !&Maintenant ou jamais !", + /*EuSpanish*/"", + }; + } + } else { + // Trading post part-timer + if (isRepeatable) { + shopDescription = { + /*English*/"Pretty sure we've got a bunch.&Oh and it's, like, a special deal.", + /*French */"On doit en avoir un tas dans le stock.&Ah oui, et c'est une offre spéciale.", + /*Spanish?*/"¡Oferta especial!&¡Compra todo lo que quieras!", + /*German ?*/"Sonderangebot!&Kauft so viel ihr wollt!", + // /*Italian?*/"Offerta speciale!&Compratene a volontà!", + }; + } else { + shopDescription = { + /*English*/"This one's a special deal, and uh,&I think we only have the one...", + /*French */"C't'un genre d'offre spéciale, ouais.&Et j'crois qu'c'est tout ce qu'on a...", + /*Spanish?*/"¡Oferta especial! ¡SOLO QUEDA UNA UNIDAD!&¡Hazte con ella antes de que se agote!", + /*German ?*/"Sonderangebot! NUR EINS AUF LAGER!&Schlagt zu solange ihr noch könnt!", + // /*Italian?*/"Offerta speciale! ULTIMO PEZZO!&Affrettatevi ad aquistarlo!", + }; + } + } + + CustomMessages::CreateMessageFromTextObject(messageID, 0xFFFF, (0x3FFFFC00 | buyingPrice), 0xFF0301, + shopIntro+shopDescription, {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + // Handle blue potion variant for mushroomless hag + // WILL OVERFLOW IN MOST LANGUAGES WHEN ITEM NAME TRIGGERS LINE BREAK + if (messageID == 0x0843) { + CustomMessages::CreateMessageFromTextObject(0x0880, 0xFFFF, (0x3FFFFC00 | buyingPrice), 0xFF0301, + shopIntro+Text{ + /*NaEnglish*/"Actually, I can't get the ingredients&for this, so I'm sold out. Sorry.", + /*NaFrench */"En fait, je n'arrive pas à trouver&les ingrédients pour ça, alors je&n'en ai plus. Désolée.", + /*NaSpanish*/"No puedo conseguir los&ingredientes, así que está&agotada. Lo siento.", + /*EuGerman */"Leider habe ich nicht die passenden&Zutaten auf Lager, daher ist dieser&Artikel gerade nicht lieferbar.", + // /*EuItalian*/"In realtà, questa pozione è esaurita&e non ho gli ingredienti per&prepararne altra. Mi spiace.", + /*EuEnglish*/"", + /*EuFrench */"", + /*EuSpanish*/"En realidad, no puedo conseguir&los ingredientes para esto, así que&no me queda más. Lo siento.", + }, {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + } + + CustomMessages::CreateMessageFromTextObject(messageID + 1, 0xFFFF, (0x3FFFFC00 | buyingPrice), 0xFF1301, + shopIntro+">2"+Text{ + /*English*/"#Buy&Don't Buy#", + /*French */"#J'achète&J'achète pas#", + /*Spanish*/"#Comprar&No comprar#", + /*German */"#Kaufen!&Nicht kaufen!#", + // /*Italian*/"#Compra&Non comprare#", + }, {QM_WHITE, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); +} + void CreateOtherHints() { // Create other hints for various texts From a2acd469566c841522a825266f54fbe497c02301 Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Wed, 2 Sep 2026 20:46:33 -0500 Subject: [PATCH 06/63] Trick Names - Implements new shops.cpp files for calculating prices and setting fake names for ice trap items - Fake names are dummied out for now pending creation - Adds new Shopsanity and Shopsanity price settings --- source/fill.cpp | 2 +- source/include/item_location.hpp | 2 +- source/include/setting_descriptions.hpp | 2 + source/include/settings.hpp | 1 + source/include/shops.hpp | 22 + source/item_location.cpp | 3 +- source/patch.cpp | 2 +- source/setting_descriptions.cpp | 4 +- source/settings.cpp | 5 +- source/shops.cpp | 894 ++++++++++++++++++++++++ 10 files changed, 929 insertions(+), 8 deletions(-) create mode 100644 source/include/shops.hpp create mode 100644 source/shops.cpp diff --git a/source/fill.cpp b/source/fill.cpp index 62faa15..f003cd2 100644 --- a/source/fill.cpp +++ b/source/fill.cpp @@ -12,7 +12,7 @@ #include "hints.hpp" #include "hint_list.hpp" #include "entrance.hpp" -//#include "shops.hpp" +#include "shops.hpp" #include "debug.hpp" #include diff --git a/source/include/item_location.hpp b/source/include/item_location.hpp index b4181b0..e8bae3b 100644 --- a/source/include/item_location.hpp +++ b/source/include/item_location.hpp @@ -453,7 +453,7 @@ void LocationTable_Init(); ItemLocation* Location(LocationKey locKey); -//extern std::vector> ShopLocationLists; +extern std::vector> ShopLocationLists; extern std::vector gossipStoneLocations; diff --git a/source/include/setting_descriptions.hpp b/source/include/setting_descriptions.hpp index 9877c47..15ed4ce 100644 --- a/source/include/setting_descriptions.hpp +++ b/source/include/setting_descriptions.hpp @@ -124,6 +124,8 @@ extern string_view skipSongReplaysDesc; extern string_view shopsOff; extern string_view shopsOn; +extern string_view shopPricesRandom; +extern string_view shopPricesAffordable; extern string_view tokensOff; extern string_view tokensDungeon; diff --git a/source/include/settings.hpp b/source/include/settings.hpp index 169e09c..325b714 100644 --- a/source/include/settings.hpp +++ b/source/include/settings.hpp @@ -414,6 +414,7 @@ namespace Settings { extern Option ShuffleMagicBeans; extern Option ShuffleKokiriSword; extern Option Shopsanity; + extern Option ShopsanityPrices; extern Option Tokensanity; extern Option Scrubsanity; extern Option ShuffleCows; diff --git a/source/include/shops.hpp b/source/include/shops.hpp new file mode 100644 index 0000000..0514cfa --- /dev/null +++ b/source/include/shops.hpp @@ -0,0 +1,22 @@ +#pragma once +#include "item.hpp" +#include "item_location.hpp" + +#include +#include +#include + +struct ItemAndPrice { + Text Name; + int price; + bool Repurchaseable; +}; + +extern void PlaceVanillaShopItems(); +extern int GetShopPrice(); +extern s16 GetRandomScrubPrice(); +extern Text GetIceTrapName(u8 id); +extern int GetShopIndex(LocationKey loc); +extern int TransformShopIndex(int index); + +extern std::vector NonShopItems; \ No newline at end of file diff --git a/source/item_location.cpp b/source/item_location.cpp index 0393372..cc78903 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -3,7 +3,7 @@ #include "dungeon.hpp" #include "settings.hpp" #include "spoiler_log.hpp" -//#include "shops.hpp" +#include "shops.hpp" #include "debug.hpp" #include "keys.hpp" #include "fill.hpp" @@ -720,7 +720,6 @@ std::vector> ShopLocationLists = { SS_ShopLocations, GV_ShopLocations, ZH_ShopLocations, - TingleMapLocations, }; //List of gossip stone locations for hints diff --git a/source/patch.cpp b/source/patch.cpp index 863f313..139d1c6 100644 --- a/source/patch.cpp +++ b/source/patch.cpp @@ -3,7 +3,7 @@ #include "cosmetics.hpp" #include "custom_messages.hpp" //#include "music.hpp" -//#include "shops.hpp" +#include "shops.hpp" #include "spoiler_log.hpp" //#include "entrance.hpp" #include "item_location.hpp" diff --git a/source/setting_descriptions.cpp b/source/setting_descriptions.cpp index c7c8894..1fda9db 100644 --- a/source/setting_descriptions.cpp +++ b/source/setting_descriptions.cpp @@ -457,7 +457,9 @@ string_view linksPocketNothing = "**OPTION CURRENTLY WIP**\n" string_view shopsOff = "All shop items will be the same as vanilla."; // string_view shopsOn = "Items in Shops will be randomized, this includes\n"// "Trading Post, Bomb Shop, Swamp Potion Shop, Goron\n"// - "Village and Zora Hall Shops.";// + "Village and Zora Hall Shops."; // +string_view shopPricesRandom = "Shop items will have random prices."; // +string_view shopPricesAffordable = "Shop items will have affordable prices."; // /*------------------------------ // | TOKENSANITY | // ------------------------------*/ // diff --git a/source/settings.cpp b/source/settings.cpp index d50912f..7d773d9 100644 --- a/source/settings.cpp +++ b/source/settings.cpp @@ -375,8 +375,9 @@ namespace Settings { Option ShuffleSongs = Option::U8 ("Shuffle Songs", {"Off", "Song Locations", "Anywhere"}, {songsVanilla, songsSongLocations, songsAllLocations}, OptionCategory::Setting, 0); Option ShuffleSoaring = Option::Bool("Shuffle Song of Soaring",{"Off", "On"}, {shuffleSoaringVanilla, shuffleSoaringRandom}, OptionCategory::Setting, 0); Option ShuffleSongOfTime = Option::Bool("Shuffle Song of Time", {"Off", "On"}, {songTimeVanilla, songTimeRandom}, OptionCategory::Setting, 0); - Option Shopsanity = Option::Bool("Shopsanity", {"Off", "On"}, {shopsOff, shopsOn}, OptionCategory::Setting, 0); - Option Tokensanity = Option::Bool("Tokensanity", {"Off", "On"}, {tokensOff, tokensAllTokens}, OptionCategory::Setting, 0); + Option Shopsanity = Option::Bool("Shopsanity", {"Off", "On"}, {shopsOff, shopsOn}, OptionCategory::Setting, 0); + Option ShopsanityPrices = Option::U8 ("Shopsanity Prices", {"Random", "Affordable"}, {shopPricesRandom, shopPricesAffordable}, OptionCategory::Setting, 0); + Option Tokensanity = Option::Bool("Tokensanity", {"Off", "On"}, {tokensOff, tokensAllTokens}, OptionCategory::Setting, 0); Option Scrubsanity = Option::Bool("Shuffle Scrub Purchases",{"Off", "On"}, {scrubsOff, scrubsOn}, OptionCategory::Toggle, 0); Option ShuffleMerchants = Option::Bool("Shuffle Scrub Trades", {"Off", "On"}, {shuffleMerchantsDesc}); Option ShuffleTradeItems = Option::Bool("Shuffle Anju and Kafei",{"Off", "On"}, {shuffleTradeItemsDesc}); diff --git a/source/shops.cpp b/source/shops.cpp new file mode 100644 index 0000000..ca96620 --- /dev/null +++ b/source/shops.cpp @@ -0,0 +1,894 @@ +#include "item_location.hpp" +#include "item_pool.hpp" +#include "shops.hpp" +#include "random.hpp" +#include "location_access.hpp" +#include "item.hpp" +#include "debug.hpp" + +#include +#include +#include +#include + +using namespace Settings; + +std::vector NonShopItems = {}; + +static std::array, 0xD5> trickNameTable; //Table of trick ice trap names +bool initTrickNames = false; //indicates if trick ice trap names have been initialized yet + +//Set vanilla shop item locations before potential randomization +void PlaceVanillaShopItems() { + // Loop to place vanilla items in each location + for (size_t i = 0; i < ShopLocationLists.size(); i++) { + for (size_t j = 0; j < ShopLocationLists[i].size(); j++) { + Location(ShopLocationLists[i][j])->PlaceVanillaItem(); + } + } +} +// This table contains a cumulative probability for each possible shop price based on +// a beta distribution with alpha = 1.5, beta = 2, and the result of the distribution, a float in [0.0, 1.0), +// being multiplied by 60, cast to an integer, then multiplied by 5 to give a value in range [0, 495] in increments +// of 5. Meaning the first value is the probability of 0, the next value is the probability of 0 plus the probability +// of 5, etc. +// Probabilities generated using a python script with 1 billion trials, so should hopefully be pretty good +// Average price ~126 +// ~38% chance of needing no wallet, ~45% chance of needing 1, ~17% chance of needing 2 +static constexpr std::array ShopPriceProbability = { + 0.005326994, 0.014908518, 0.027114719, 0.041315285, 0.057136304, 0.074325887, 0.092667151, 0.112002061, 0.132198214, + 0.153125390, 0.174696150, 0.196810540, 0.219388148, 0.242361379, 0.265657012, 0.289205134, 0.312970402, 0.336877590, + 0.360881110, 0.384932772, 0.408976198, 0.432982176, 0.456902494, 0.480686053, 0.504313389, 0.527746488, 0.550938554, + 0.573856910, 0.596465330, 0.618736235, 0.640646600, 0.662162782, 0.683240432, 0.703859801, 0.724001242, 0.743631336, + 0.762722631, 0.781259986, 0.799198449, 0.816521905, 0.833208595, 0.849243398, 0.864579161, 0.879211177, 0.893112051, + 0.906263928, 0.918639420, 0.930222611, 0.940985829, 0.950914731, 0.959992180, 0.968187000, 0.975495390, 0.981884488, + 0.987344345, 0.991851853, 0.995389113, 0.997937921, 0.999481947, 1.000000000, +}; + +size_t GetNumberOfBins(int maxPrice, int stepSize) { + if (maxPrice <= 0) { + return 1; + } + + double rawResult = floor((double)maxPrice / (double)stepSize) + 1.0; + return (size_t)rawResult; +} + +double GetFractionForOneBin(size_t numberOfBins) { + return 1.0 / (double)numberOfBins; +} + +double CalculateCumulativeDistributionFunction(double input) { + return 2.5 * (1 - 0.6 * input) * pow(input, 1.5); +} + +int GetShopPrice() { + const int stepSize = 5; + if (Settings::ShopsanityPrices.Value() == 1) /*Affordable*/ { + // Affordable option is like affordable scrubs. All items cost 10 rupees. + return 10; + } else if (Settings::ShopsanityPrices.Value() == 0) /*Random*/ { + // "Original" Shopsanity price behaviour. Using the precomputed probability values from the ShopPriceProbability + // array. + double random = RandomDouble(); // Randomly generated probability value + for (size_t i = 0; i < ShopPriceProbability.size(); i++) { + if (random < ShopPriceProbability[i]) { + // The randomly generated value has surpassed the total probability up to this point, so this is the + // generated price + return i * stepSize; // i in range [0, 59], output in range [0, 295] in increments of 5 + } + } + } + + // Shopsanity price behaviour with caps for each wallet size. /*TO-DO?*/ + int maxPrice = 495; + + // switch (Settings::ShopsanityPrices.Value()) { + // case SHOPSANITY_PRICE_CHILD: + // maxPrice = 99; + // break; + // case SHOPSANITY_PRICE_ADULT: + // maxPrice = 200; + // break; + // case SHOPSANITY_PRICE_GIANT: + // maxPrice = 500; + // break; + // case SHOPSANITY_PRICE_TYCOON: + // maxPrice = 999; + // break; + // } + + // Since there are a different amount of multiples of 5 rupees between the different settings we need to calculate + // the amount of "bins" aka how many options are available. + size_t numberOfBins = GetNumberOfBins(maxPrice, stepSize); + + // We then need to calculate how those bins relate to a fraction between 0.0 and 1.0 so we can use that to run + // the distribution calculation. + double fractionForOneBin = GetFractionForOneBin(numberOfBins); + + // The diceroll that gives us the randomness for choosing the price. + double random = RandomDouble(); + + // We loop through the amount of bins to look for the bin that the random double fits in with the Cumulative + // Distribution Function + for (size_t i = 0; i < numberOfBins; i++) { + if (random < CalculateCumulativeDistributionFunction(fractionForOneBin * (i + 1))) { + return i * stepSize; // We've found which bin it is in so we can multiply by stepSize so we then get the + // resulting price. + } + } + + return -1; // Shouldn't happen +} + +// Similar to above, beta distribution with alpha = 1, beta = 2, +// multiplied by 20 instead of 60 to give values in rage [0, 95] in increments of 5 +// Average price ~31 +static constexpr std::array ScrubPriceProbability = { + 0.097500187, 0.190002748, 0.277509301, 0.360018376, 0.437522571, 0.510021715, 0.577520272, + 0.640029304, 0.697527584, 0.750024535, 0.797518749, 0.840011707, 0.877508776, 0.910010904, + 0.937504342, 0.960004661, 0.977502132, 0.989998967, 0.997500116, 1.000000000, +}; +s16 GetRandomScrubPrice() { + double random = RandomDouble(); + for (size_t i = 0; i < ScrubPriceProbability.size(); i++) { + if (random < ScrubPriceProbability[i]) { + return i * 5; // i in range [0, 19], output in range [0, 95] in increments of 5 + } + } + return -1; +} + +// Initialize the trick names table with 3 potential options, Easy, Medium, and Hard in each language +void InitTrickNames() { + trickNameTable[(u32)GetItemID::GI_GREAT_FAIRY_SWORD] = { + Text{"Biggoron's Sword", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"Fairy Blade", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"Rainbow Sword", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_SHIELD_HERO] = { + Text{"Hylian Shield", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"Shield of the Hero", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"Legendary Shield", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_STICKS_1] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_TOWN_TITLE_DEED] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_SWAMP_TITLE_DEED] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MOUNTAIN_TITLE_DEED] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_OCEAN_TITLE_DEED] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_BOMBERS_NOTEBOOK] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_ROOM_KEY] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_LETTER_TO_KAFEI] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_PENDANT_OF_MEMORIES] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_LETTER_TO_MAMA] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MOONS_TEAR] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x2C] = { /*Spin Attack*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_LENS_OF_TRUTH] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_FIRE_ARROW] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_ICE_ARROW] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_LIGHT_ARROW] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_HOOKSHOT] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MAGIC_BEAN] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0xB2] = { /*Double Defense*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_OCARINA_OF_TIME] = { + Text{"Fairy Ocarina", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_PICTOGRAPH_BOX] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_POWDER_KEG] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_KEATON] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_BUNNY_HOOD] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_GORON] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_ZORA] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_DEKU] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_POSTMANS] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_ALL_NIGHT] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_BLAST] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_STONE] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_GREAT_FAIRYS] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_BREMEN] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_DON_GEROS] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_OF_SCENTS] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_ROMANIS] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_TROUPE_LEADERS] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_KAFEIS] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_COUPLES] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_KAMARAOS] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_GIBDO] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_GARO] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_CAPTAINS_HAT] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_GIANTS] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_FIERCE_DEITY] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_OF_TRUTH] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0xBA] = { /*Fishing Pass*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x44] = { /*Swamp Skulltula Token*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x6D] = { /*Ocean Skulltula Token*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0xBB] = { /*Clock Town Stray Fairy*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0xBC] = { /*Woodfall Stray Fairy*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0xBD] = { /*Snowhead Stray Fairy*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0xBE] = { /*Great Bay Stray Fairy*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0xBF] = { /*Stone Tower Stray Fairy*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_BOTTLE_EMPTY] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_BOTTLE_MILK] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_BOTTLE_POTION_RED] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_BOTTLE_GOLD_DUST] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_BOTTLE_CHATEAU_ROMANI] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_BOTTLE_MYSTERY_MILK] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_DEKU_PRINCESS_FAIRY] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_POTION_GREEN] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_POTION_BLUE] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_FAIRY] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_BOTTLE_BUG] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_BOTTLE_FISH] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_BOTTLE_POE_TEXT] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_BOTTLE_BIG_POE] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_BOTTLE_SPRING_WATER] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_BOTTLE_HOT_SPRING_WATER] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_BOTTLE_ZORA_EGG] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_BOTTLE_MAGIC_MUSHROOM] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_BOTTLE_SEAHORSE] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x53] = { /*Song of Time*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x73] = { /*Song of Storms*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x4B] = { /*Sonata of Awakening*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x4E] = { /*New Wave Bossa Nova*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x4F] = { /*Elegy of Emptiness*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x51] = { /*Oath to Order*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x6C] = { /*Epona's Song*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0xC2] = { /*Inverted Song of Time*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0xC3] = { /*Song of Double Time*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x54] = { /*Song of Healing*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x72] = { /*Song of Soaring*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0xAE] = { /*Woodfall Temple Map*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0xAF] = { /*Snowhead Temple Map*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0xB0] = { /*Great Bay Temple Map*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0xB1] = { /*Stone Tower Temple Map*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MAP_OF_CLOCK_TOWN] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MAP_OF_WOODFALL] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MAP_OF_SNOWHEAD] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MAP_OF_GREAT_BAY] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MAP_OF_STONE_TOWER] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MAP_OF_ROMANI_RANCH] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0xA7] = { /*Woodfall Temple Compass*/ + Text{"Forest Temple Compass", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0xA8] = { /*Snowhead Temple Compass*/ + Text{"Ice Cavern Compass", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0xAC] = { /*Great Bay Temple Compass*/ + Text{"Water Temple Compass", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0xAD] = { /*Stone Tower Temple Compass*/ + Text{"Spirit Temple Compass", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0xA3] = { /*Woodfall Temple Boss Key*/ + Text{"Forest Temple Boss Key", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0xA4] = { /*Snowhead Temple Boss Key*/ + Text{"Ice Cavern Boss Key", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0xA5] = { /*Great Bay Temple Boss Key*/ + Text{"Water Temple Boss Key", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0xA6] = { /*Stone Tower Temple Boss Key*/ + Text{"Spirit Temple Boss Key", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x76] = { /*Woodfall Temple Small Key*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x77] = { /*Snowhead Temple Small Key*/ + Text{"Ice Cavern Small Key", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x90] = { /*Great Bay Temple Small Key*/ + Text{"Water Temple Small Key", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0xA2] = { /*Stone Tower Temple Small Key*/ + Text{"Spirit Temple Small Key", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_ODOLWAS_REMAINS] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_GOHTS_REMAINS] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_GYORGS_REMAINS] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_TWINMOLDS_REMAINS] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_RECOVERY_HEART_SINGLE] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_RUPEE_GREEN] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_RUPEE_BLUE] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_RUPEE_RED] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_RUPEE_PURPLE] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_RUPEE_GOLD] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_RUPEE_SILVER] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_HEART_PIECE] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_HEART_CONTAINER] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x92] = { /*Milk*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_BOMBS_5] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_BOMBS_10] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_BOMBS_20] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_BOMBCHUS_5] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_BOMBCHUS_10] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_BOMBCHU_20] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x1E] = { /*Arrows (10)*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x1F] = { /*Arrows (30)*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x20] = { /*Arrows (40)*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x21] = { /*Arrows (50)*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_NUTS_5] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_NUTS_10] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_ARROWS_MEDIUM] = { /*Arrows (10) again?*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_ARROWS_LARGE] = { /*Arrows (30)*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_FAIRY] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x4A] = { /*Progressive Sword*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x46] = { /*Progressive Bomb Bag*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x47] = { /*Progressive Bow*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x48] = { /*Progressive Wallet*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x49] = { /*Progressive Magic*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x45] = { /*Progressive Lullaby*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; +} + +// Generate a fake name for the ice trap based on the item it's displayed as +Text GetIceTrapName(u8 id) { + // If the trick names table has not been initialized, do so + if (!initTrickNames) { + InitTrickNames(); + initTrickNames = true; + } + // Randomly get the easy, medium, or hard name for the given item id + return RandomElement(trickNameTable[id]); +} + +// Get shop index based on a given location +static std::map ShopNameToNum = { { "Trading Post", 0 }, { "Bomb Shop", 1 }, + { "Swamp Potion Shop", 2 }, { "Goron Village Shop", 3 }, + { "Zora Hall Shop", 4 }, }; +int GetShopIndex(LocationKey loc) { + // Kind of hacky, but extract the shop and item position from the name + const std::string& name(Location(loc)->GetName()); + int split = name.find(" Item "); + std::string_view shop(name.c_str(), split); + int pos = std::stoi(name.substr(split + 6, 1)) - 1; + int shopnum = ShopNameToNum[shop]; + return shopnum * 8 + pos; +} + +// Without this transformed index, shop-related tables and arrays would need 64 entries- But only half of that is needed +// for shopsanity So we use this transformation to map only important indices to an array with 32 entries in the +// following manner: Shop index: 4 5 6 7 12 13 14 15 20 21 22 23... Transformed: 0 1 2 3 4 5 6 7 8 9 +// 10 11... So we first divide the shop index by 4, then by 2 which basically tells us the index of the shop it's in, +// then multiply by 4 since there are 4 items per shop +// And finally we use a modulo by 4 to get the index within the "shop" of 4 items, and add +int TransformShopIndex(int index) { + return 4 * ((index / 4) / 2) + index % 4; +} \ No newline at end of file From c40d95bbf86179697414d15fc6419c4a5e131c04 Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Sat, 29 Aug 2026 18:05:04 -0500 Subject: [PATCH 07/63] Shopsanity Initial - Changes settings to include Shopsanity and Scrubsanity and edits descriptions - Adjusts Item Pool to split Scrub Purchases from Shops, Also implements item pool logic for Shopsanity and Scrubsanity - Adjusts Item Locations for proper override values for shops --- source/include/item_location.hpp | 2 +- source/include/setting_descriptions.hpp | 7 +- source/item_location.cpp | 47 ++++++----- source/item_pool.cpp | 105 ++++++------------------ source/location_access.cpp | 8 +- source/setting_descriptions.cpp | 40 ++------- source/settings.cpp | 9 +- 7 files changed, 67 insertions(+), 151 deletions(-) diff --git a/source/include/item_location.hpp b/source/include/item_location.hpp index e28a8f8..b4181b0 100644 --- a/source/include/item_location.hpp +++ b/source/include/item_location.hpp @@ -225,7 +225,7 @@ class ItemLocation { void SetPlacedItem(const ItemKey item) { placedItem = item; - //SetPrice(ItemTable(placedItem).GetPrice()); + SetPrice(ItemTable(placedItem).GetPrice()); } //Saves an item to be set as placedItem later diff --git a/source/include/setting_descriptions.hpp b/source/include/setting_descriptions.hpp index c3fa332..cdc3ac9 100644 --- a/source/include/setting_descriptions.hpp +++ b/source/include/setting_descriptions.hpp @@ -123,12 +123,7 @@ extern string_view fastElegyStatuesDesc; extern string_view skipSongReplaysDesc; extern string_view shopsOff; -extern string_view shopsZero; -extern string_view shopsOne; -extern string_view shopsTwo; -extern string_view shopsThree; -extern string_view shopsFour; -extern string_view shopsRandom; +extern string_view shopsOn; extern string_view tokensOff; extern string_view tokensDungeon; diff --git a/source/item_location.cpp b/source/item_location.cpp index 1c691b7..0393372 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -229,15 +229,13 @@ void LocationTable_Init() { locationTable[TWIN_ISLANDS_CAVE_CHEST] = ItemLocation::Chest (0x5E, 0x00, true, "TI Cave Chest", TWIN_ISLANDS_CAVE_CHEST, RED_RUPEE, {Category::cTwinIslands,Category::cChest ,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_TWIN_ISLANDS ); locationTable[TWIN_ISLANDS_LULLABY_INTRO] = ItemLocation::Base (0x5D, 0x74, false, "TI Lullaby Intro", TWIN_ISLANDS_LULLABY_INTRO, PROGRESSIVE_LULLABY, {Category::cTwinIslands, Category::cSong, Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_TWIN_ISLANDS ); //W Clock Town - locationTable[W_CLOCK_TOWN_BOMB_BAG_BUY] = ItemLocation::Base (0x0D, 0x1B, false, "WCT Bomb Bag Purchase", W_CLOCK_TOWN_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG, {Category::cWestClockTown,Category::cDayOne, Category::cShop, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); - locationTable[W_CLOCK_TOWN_BIG_BOMB_BAG_BUY] = ItemLocation::Base (0x0D, 0x1C, false, "WCT Big Bomb Bag Purchase", W_CLOCK_TOWN_BIG_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG, {Category::cWestClockTown,Category::cDayTwo, Category::cShop, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); locationTable[W_CLOCK_TOWN_POSTMANS_GAME] = ItemLocation::Base (0x2E, 0x0C, false, "WCT Postman's Game", W_CLOCK_TOWN_POSTMANS_GAME, PIECE_OF_HEART, {Category::cWestClockTown, Category::cVanillaHeartPiece,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); locationTable[W_CLOCK_TOWN_ROSA_SISTERS] = ItemLocation::Base (0x6D, 0x0C, false, "WCT Rosa Sisters", W_CLOCK_TOWN_ROSA_SISTERS, PIECE_OF_HEART, {Category::cWestClockTown, Category::cVanillaHeartPiece,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); locationTable[W_CLOCK_TOWN_SWORDSMANS_SCHOOL] = ItemLocation::Base (0x54, 0x0C, false, "WCT Swordsman's School", W_CLOCK_TOWN_SWORDSMANS_SCHOOL, PIECE_OF_HEART, {Category::cWestClockTown, Category::cVanillaHeartPiece,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); locationTable[W_CLOCK_TOWN_ALL_NIGHT_MASK_BUY] = ItemLocation::Base (0x0D, 0x7E, false, "WCT All-Night Mask Purchase", W_CLOCK_TOWN_ALL_NIGHT_MASK_BUY, ALL_NIGHT_MASK, {Category::cWestClockTown, Category::cVanillaMask,Category::cDayThree}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); //locationTable[W_CLOCK_TOWN_LOTTERY] = ItemLocation::Base (0x39, 0x00, true, "WCT Lottery", W_CLOCK_TOWN_LOTTERY, PURPLE_RUPEE, {Category::cWestClockTown}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); locationTable[W_CLOCK_TOWN_BOMB_SHOP_GORON] = ItemLocation::Base (0x0D, 0x34, true, "WCT Bomb Shop Goron", W_CLOCK_TOWN_BOMB_SHOP_GORON, POWDER_KEG, {Category::cWestClockTown, Category::cMerchant,Category::cDayOne, Category::cShop, Category::cMainInventory}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); - locationTable[W_CLOCK_TOWN_CURIOSITY_BOMB_BAG] = ItemLocation::Base (0x0D, 0x00, true, "WCT Curiosity Shop Bomb Bag", W_CLOCK_TOWN_CURIOSITY_BOMB_BAG, PROGRESSIVE_BOMB_BAG, {Category::cWestClockTown, Category::cDayTwo, Category::cShop, Category::cMainInventory}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); + locationTable[W_CLOCK_TOWN_CURIOSITY_BOMB_BAG] = ItemLocation::Base (0x0D, 0x1D, true, "WCT Curiosity Shop Bomb Bag", W_CLOCK_TOWN_CURIOSITY_BOMB_BAG, PROGRESSIVE_BOMB_BAG, {Category::cWestClockTown, Category::cDayTwo, Category::cShop, Category::cMainInventory}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); //Woodfall locationTable[WOODFALL_BRIDGE_CHEST] = ItemLocation::Chest (0x46, 0x01, true, "WF Bridge Chest", WOODFALL_BRIDGE_CHEST, PIECE_OF_HEART, {Category::cWoodfall, Category::cVanillaHeartPiece, Category::cChest, Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_WOODFALL ); locationTable[WOODFALL_BEHIND_OWL_CHEST] = ItemLocation::Chest (0x46, 0x02, true, "WF Behind Owl Chest", WOODFALL_BEHIND_OWL_CHEST, BLUE_RUPEE, {Category::cWoodfall,Category::cChest ,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_WOODFALL ); @@ -557,30 +555,31 @@ void LocationTable_Init() { 3 4 7 8 1 2 3 ------------------------------- -----------------------*/ - locationTable[TRADING_POST_ITEM_1] = ItemLocation::Base (0x34,0x00, true, "Trading Post Item 1", TRADING_POST_ITEM_1, BUY_RED_POTION, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_2] = ItemLocation::Base (0x34,0x00, true, "Trading Post Item 2", TRADING_POST_ITEM_2, BUY_GREEN_POTION, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 1), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_3] = ItemLocation::Base (0x34,0x00, true, "Trading Post Item 3", TRADING_POST_ITEM_3, BUY_HEROS_SHIELD, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 2), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_4] = ItemLocation::Base (0x34,0x00, true, "Trading Post Item 4", TRADING_POST_ITEM_4, BUY_FAIRYS_SPIRIT, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 3), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_5] = ItemLocation::Base (0x34,0x00, true, "Trading Post Item 5", TRADING_POST_ITEM_5, BUY_DEKU_STICK_1, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 4), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_6] = ItemLocation::Base (0x34,0x00, true, "Trading Post Item 6", TRADING_POST_ITEM_6, BUY_ARROWS_30, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 5), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_7] = ItemLocation::Base (0x34,0x00, true, "Trading Post Item 7", TRADING_POST_ITEM_7, BUY_DEKU_NUT_10, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 6), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_8] = ItemLocation::Base (0x34,0x00, true, "Trading Post Item 8", TRADING_POST_ITEM_8, BUY_MAGIC_BEAN, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 7), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_1] = ItemLocation::Base (0x34,0x01, true, "Trading Post Item 1", TRADING_POST_ITEM_1, BUY_RED_POTION, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_2] = ItemLocation::Base (0x34,0x02, true, "Trading Post Item 2", TRADING_POST_ITEM_2, BUY_GREEN_POTION, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 1), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_3] = ItemLocation::Base (0x34,0x03, true, "Trading Post Item 3", TRADING_POST_ITEM_3, BUY_HEROS_SHIELD, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 2), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_4] = ItemLocation::Base (0x34,0x04, true, "Trading Post Item 4", TRADING_POST_ITEM_4, BUY_FAIRYS_SPIRIT, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 3), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_5] = ItemLocation::Base (0x34,0x05, true, "Trading Post Item 5", TRADING_POST_ITEM_5, BUY_DEKU_STICK_1, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 4), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_6] = ItemLocation::Base (0x34,0x06, true, "Trading Post Item 6", TRADING_POST_ITEM_6, BUY_ARROWS_30, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 5), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_7] = ItemLocation::Base (0x34,0x07, true, "Trading Post Item 7", TRADING_POST_ITEM_7, BUY_DEKU_NUT_10, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 6), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_8] = ItemLocation::Base (0x34,0x08, true, "Trading Post Item 8", TRADING_POST_ITEM_8, BUY_MAGIC_BEAN, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 7), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[BOMB_SHOP_ITEM_1] = ItemLocation::Base (0x68,0x00, true, "Bomb Shop Item 1", BOMB_SHOP_ITEM_1, BOMBS_10, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x68, 0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[BOMB_SHOP_ITEM_2] = ItemLocation::Base (0x68,0x00, true, "Bomb Shop Item 2", BOMB_SHOP_ITEM_2, BOMBCHU_10, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x68, 1), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - //locationTable[BOMB_SHOP_ITEM_3] = ItemLocation::Base(0x68,0x00, true, "Bomb Shop Item 3", BOMB_SHOP_ITEM_3, BOMBS_20, {Category::cEastClockTown,Category::cShop,Category::cDayOne}, SpoilerCollectionCheck::ShopItem(0x00, 0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - - locationTable[POTION_SHOP_ITEM_1] = ItemLocation::Base (0x0A,0x00, true, "Potion Shop Item 1", POTION_SHOP_ITEM_1, BLUE_POTION_REFILL, {Category::cSouthernSwamp,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x0A, 0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP); - locationTable[POTION_SHOP_ITEM_2] = ItemLocation::Base (0x0A,0x00, true, "Potion Shop Item 2", POTION_SHOP_ITEM_2, GREEN_POTION_REFILL, {Category::cSouthernSwamp,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x0A, 1), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP); - locationTable[POTION_SHOP_ITEM_3] = ItemLocation::Base (0x0A,0x00, true, "Potion Shop Item 3", POTION_SHOP_ITEM_3, RED_POTION_REFILL, {Category::cSouthernSwamp,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x0A, 2), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP); + locationTable[BOMB_SHOP_ITEM_1] = ItemLocation::Base (0x68,0x01, true, "Bomb Shop Item 1", BOMB_SHOP_ITEM_1, BOMBS_10, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x68, 0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[BOMB_SHOP_ITEM_2] = ItemLocation::Base (0x68,0x02, true, "Bomb Shop Item 2", BOMB_SHOP_ITEM_2, BOMBCHU_10, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x68, 1), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[W_CLOCK_TOWN_BOMB_BAG_BUY] = ItemLocation::Base (0x68,0x03, false, "WCT Bomb Bag Purchase", W_CLOCK_TOWN_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG, {Category::cWestClockTown,Category::cDayOne, Category::cShop, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); + locationTable[W_CLOCK_TOWN_BIG_BOMB_BAG_BUY] = ItemLocation::Base (0x68,0x04, false, "WCT Big Bomb Bag Purchase", W_CLOCK_TOWN_BIG_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG, {Category::cWestClockTown,Category::cDayTwo, Category::cShop, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); + + locationTable[POTION_SHOP_ITEM_1] = ItemLocation::Base (0x0A,0x01, true, "Potion Shop Item 1", POTION_SHOP_ITEM_1, BLUE_POTION_REFILL, {Category::cSouthernSwamp,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x0A, 0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP); + locationTable[POTION_SHOP_ITEM_2] = ItemLocation::Base (0x0A,0x02, true, "Potion Shop Item 2", POTION_SHOP_ITEM_2, GREEN_POTION_REFILL, {Category::cSouthernSwamp,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x0A, 1), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP); + locationTable[POTION_SHOP_ITEM_3] = ItemLocation::Base (0x0A,0x03, true, "Potion Shop Item 3", POTION_SHOP_ITEM_3, RED_POTION_REFILL, {Category::cSouthernSwamp,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x0A, 2), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP); - locationTable[GORON_SHOP_ITEM_1] = ItemLocation::Base (0x3D,0x00, true, "Goron Shop Item 1", GORON_SHOP_ITEM_1, BOMBS_10, {Category::cGoronVillage,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x3D, 0), SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE); - locationTable[GORON_SHOP_ITEM_2] = ItemLocation::Base (0x3D,0x00, true, "Goron Shop Item 2", GORON_SHOP_ITEM_2, ARROWS_10, {Category::cGoronVillage,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x3D, 1), SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE); - locationTable[GORON_SHOP_ITEM_3] = ItemLocation::Base (0x3D,0x00, true, "Goron Shop Item 3", GORON_SHOP_ITEM_3, RED_POTION_REFILL, {Category::cGoronVillage,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x3D, 2), SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE); + locationTable[GORON_SHOP_ITEM_1] = ItemLocation::Base (0x3D,0x01, true, "Goron Shop Item 1", GORON_SHOP_ITEM_1, BOMBS_10, {Category::cGoronVillage,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x3D, 0), SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE); + locationTable[GORON_SHOP_ITEM_2] = ItemLocation::Base (0x3D,0x02, true, "Goron Shop Item 2", GORON_SHOP_ITEM_2, ARROWS_10, {Category::cGoronVillage,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x3D, 1), SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE); + locationTable[GORON_SHOP_ITEM_3] = ItemLocation::Base (0x3D,0x03, true, "Goron Shop Item 3", GORON_SHOP_ITEM_3, RED_POTION_REFILL, {Category::cGoronVillage,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x3D, 2), SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE); - locationTable[ZORA_SHOP_ITEM_1] = ItemLocation::Base (0x4C,0x00, true, "Zora Shop Item 1", ZORA_SHOP_ITEM_1, HEROS_SHIELD, {Category::cZoraHall,Category::cShop,Category::cDayOne}, SpoilerCollectionCheck::ShopItem(0x4C, 0), SpoilerCollectionCheckGroup::GROUP_ZORA_HALL); - locationTable[ZORA_SHOP_ITEM_2] = ItemLocation::Base (0x4C,0x00, true, "Zora Shop Item 2", ZORA_SHOP_ITEM_2, ARROWS_10, {Category::cZoraHall,Category::cShop,Category::cDayOne}, SpoilerCollectionCheck::ShopItem(0x4C, 1), SpoilerCollectionCheckGroup::GROUP_ZORA_HALL); - locationTable[ZORA_SHOP_ITEM_3] = ItemLocation::Base (0x4C,0x00, true, "Zora Shop Item 3", ZORA_SHOP_ITEM_3, RED_POTION_REFILL, {Category::cZoraHall,Category::cShop,Category::cDayOne}, SpoilerCollectionCheck::ShopItem(0x4C, 2), SpoilerCollectionCheckGroup::GROUP_ZORA_HALL); + locationTable[ZORA_SHOP_ITEM_1] = ItemLocation::Base (0x4C,0x01, true, "Zora Shop Item 1", ZORA_SHOP_ITEM_1, HEROS_SHIELD, {Category::cZoraHall,Category::cShop,Category::cDayOne}, SpoilerCollectionCheck::ShopItem(0x4C, 0), SpoilerCollectionCheckGroup::GROUP_ZORA_HALL); + locationTable[ZORA_SHOP_ITEM_2] = ItemLocation::Base (0x4C,0x02, true, "Zora Shop Item 2", ZORA_SHOP_ITEM_2, ARROWS_10, {Category::cZoraHall,Category::cShop,Category::cDayOne}, SpoilerCollectionCheck::ShopItem(0x4C, 1), SpoilerCollectionCheckGroup::GROUP_ZORA_HALL); + locationTable[ZORA_SHOP_ITEM_3] = ItemLocation::Base (0x4C,0x03, true, "Zora Shop Item 3", ZORA_SHOP_ITEM_3, RED_POTION_REFILL, {Category::cZoraHall,Category::cShop,Category::cDayOne}, SpoilerCollectionCheck::ShopItem(0x4C, 2), SpoilerCollectionCheckGroup::GROUP_ZORA_HALL); diff --git a/source/item_pool.cpp b/source/item_pool.cpp index 9ad2175..6600783 100644 --- a/source/item_pool.cpp +++ b/source/item_pool.cpp @@ -469,6 +469,13 @@ const std::array scrubTradeItems = { OCEAN_TITLE, }; +const std::array scrubPurchases = { + MAGIC_BEAN, + PROGRESSIVE_BOMB_BAG,//BIGGEST_BOMB_BAG + BLUE_POTION_REFILL, + GREEN_POTION_REFILL, +}; + const std::array anjuKafeiTradeItems = { LETTER_KAFEI, LETTER_MAMA, @@ -603,74 +610,6 @@ static void PlaceVanillaStrayFairies() { dungeon->PlaceVanillaGBTStray(); dungeon->PlaceVanillaSTStray(); } - //Clock Town - PlaceItemInLocation(LAUNDRY_POOL_SF, CT_STRAY_FAIRY); - /* - //Woodfall Temple - PlaceItemInLocation(WF_SF_ENTRANCE_FAIRY, WF_STRAY_FAIRY); - PlaceItemInLocation(WF_SF_ENTRANCE_PLATFORM, WF_STRAY_FAIRY); - PlaceItemInLocation(WF_SF_MAIN_ROOM_BUBBLE, WF_STRAY_FAIRY); - PlaceItemInLocation(WF_SF_MAIN_ROOM_SWITCH, WF_STRAY_FAIRY); - PlaceItemInLocation(WF_SF_PRE_BOSS_LOWER_RIGHT_BUBBLE, WF_STRAY_FAIRY); - PlaceItemInLocation(WF_SF_PRE_BOSS_UPPER_RIGHT_BUBBLE, WF_STRAY_FAIRY); - PlaceItemInLocation(WF_SF_PRE_BOSS_UPPER_LEFT_BUBBLE, WF_STRAY_FAIRY); - PlaceItemInLocation(WF_SF_PRE_BOSS_PILLAR_BUBBLE, WF_STRAY_FAIRY); - PlaceItemInLocation(WF_SF_DEKU_BABA, WF_STRAY_FAIRY); - PlaceItemInLocation(WF_SF_DRAGONFLY_ROOM_BUBBLE, WF_STRAY_FAIRY); - PlaceItemInLocation(WF_SF_SKULLTULA, WF_STRAY_FAIRY); - PlaceItemInLocation(WF_SF_DARK_ROOM, WF_STRAY_FAIRY); - PlaceItemInLocation(WF_SF_JAR_FAIRY, WF_STRAY_FAIRY); - PlaceItemInLocation(WF_SF_BRIDGE_ROOM_BEEHIVE, WF_STRAY_FAIRY); - PlaceItemInLocation(WF_SF_PLATFORM_ROOM_BEEHIVE, WF_STRAY_FAIRY); - //SnowheadTemple - PlaceItemInLocation(SH_SF_SNOW_ROOM_BUBBLE, SH_STRAY_FAIRY); - PlaceItemInLocation(SH_SF_CEILING_BUBBLE, SH_STRAY_FAIRY); - PlaceItemInLocation(SH_SF_DINOLFOS_1, SH_STRAY_FAIRY); - PlaceItemInLocation(SH_SF_DINOLFOS_2, SH_STRAY_FAIRY); - PlaceItemInLocation(SH_SF_BRIDGE_ROOM_LEDGE_BUBBLE, SH_STRAY_FAIRY); - PlaceItemInLocation(SH_SF_BRIDGE_ROOM_PILLAR_BUBBLE, SH_STRAY_FAIRY); - PlaceItemInLocation(SH_SF_MAP_ROOM_FAIRY, SH_STRAY_FAIRY); - PlaceItemInLocation(SH_SF_MAP_ROOM_LEDGE, SH_STRAY_FAIRY); - PlaceItemInLocation(SH_SF_BASEMENT, SH_STRAY_FAIRY); - PlaceItemInLocation(SH_SF_TWIN_BLOCK, SH_STRAY_FAIRY); - PlaceItemInLocation(SH_SF_ICICLE_ROOM_WALL, SH_STRAY_FAIRY); - PlaceItemInLocation(SH_SF_MAIN_ROOM_WALL, SH_STRAY_FAIRY); - PlaceItemInLocation(SH_SF_PILLAR_FREEZARDS, SH_STRAY_FAIRY); - PlaceItemInLocation(SH_SF_ICE_PUZZLE, SH_STRAY_FAIRY); - PlaceItemInLocation(SH_SF_CRATE, SH_STRAY_FAIRY); - //Great Bay Temple - PlaceItemInLocation(GBT_SF_SKULLTULA, GBT_STRAY_FAIRY); - PlaceItemInLocation(GBT_SF_WATER_CONTROL_UNDERWATER_BUBBLE, GBT_STRAY_FAIRY); - PlaceItemInLocation(GBT_SF_WATERWHEEL_ROOM_LOWER, GBT_STRAY_FAIRY); - PlaceItemInLocation(GBT_SF_WATERWHEEL_ROOM_UPPER, GBT_STRAY_FAIRY); - PlaceItemInLocation(GBT_SF_GREEN_VALVE, GBT_STRAY_FAIRY); - PlaceItemInLocation(GBT_SF_SEESAW_ROOM, GBT_STRAY_FAIRY); - PlaceItemInLocation(GBT_SF_ENTRANCE_TORCHES, GBT_STRAY_FAIRY); - PlaceItemInLocation(GBT_SF_BIO_BABAS, GBT_STRAY_FAIRY); - PlaceItemInLocation(GBT_SF_UNDERWATER_BARREL, GBT_STRAY_FAIRY); - PlaceItemInLocation(GBT_SF_WHIRLPOOL_JAR, GBT_STRAY_FAIRY); - PlaceItemInLocation(GBT_SF_WHIRLPOOL_BARREL, GBT_STRAY_FAIRY); - PlaceItemInLocation(GBT_SF_DEXIHANDS_JAR, GBT_STRAY_FAIRY); - PlaceItemInLocation(GBT_SF_LEDGE_JAR, GBT_STRAY_FAIRY); - PlaceItemInLocation(GBT_SF_PRE_BOSS_ROOM_BUBBLE, GBT_STRAY_FAIRY); - PlaceItemInLocation(GBT_SF_PRE_BOSS_ROOM_UNDERWATER_BUBBLE, GBT_STRAY_FAIRY); - //Stone Tower Temple - PlaceItemInLocation(ST_SF_MIRROR_SUN_BLOCK, ST_STRAY_FAIRY); - PlaceItemInLocation(ST_SF_LAVA_ROOM_LEDGE, ST_STRAY_FAIRY); - PlaceItemInLocation(ST_SF_LAVA_ROOM_FIRE_RING, ST_STRAY_FAIRY); - PlaceItemInLocation(ST_SF_EYEGORE, ST_STRAY_FAIRY); - PlaceItemInLocation(ST_SF_UPDRAFT_FIRE_RING, ST_STRAY_FAIRY); - PlaceItemInLocation(ST_SF_MIRROR_SUN_SWITCH, ST_STRAY_FAIRY); - PlaceItemInLocation(ST_SF_BOSS_WARP, ST_STRAY_FAIRY); - PlaceItemInLocation(ST_SF_WIZZROBE, ST_STRAY_FAIRY); - PlaceItemInLocation(ST_SF_DEATH_ARMOS, ST_STRAY_FAIRY); - PlaceItemInLocation(ST_SF_UPDRAFT_FROZEN_EYE, ST_STRAY_FAIRY); - PlaceItemInLocation(ST_SF_THIN_BRIDGE, ST_STRAY_FAIRY); - PlaceItemInLocation(ST_SF_BASEMENT_LEDGE, ST_STRAY_FAIRY); - PlaceItemInLocation(ST_SF_STATUE_EYE, ST_STRAY_FAIRY); - PlaceItemInLocation(ST_SF_UNDERWATER, ST_STRAY_FAIRY); - PlaceItemInLocation(ST_SF_BRIDGE_CRYSTAL, ST_STRAY_FAIRY); - */ }; static void PlaceVanillaSkulltulaTokens() { @@ -713,12 +652,15 @@ static void PlaceVanillaShopItems() { PlaceItemInLocation(ZORA_SHOP_ITEM_1, BUY_HEROS_SHIELD); PlaceItemInLocation(ZORA_SHOP_ITEM_2, BUY_ARROWS_10); PlaceItemInLocation(ZORA_SHOP_ITEM_3, BUY_RED_POTION); + PlaceItemInLocation(MILK_ROAD_GORMAN_MILK_BUY, MILK); + //other 2 scrub sales handled in beans and main inventory +}; + +static void PlaceVanillaScrubPurchases() { PlaceItemInLocation(GORON_VILLAGE_SCRUB_PURCHASE, PROGRESSIVE_BOMB_BAG); PlaceItemInLocation(GORON_VILLAGE_SCRUB_PURCHASE_SPRING, PROGRESSIVE_BOMB_BAG); PlaceItemInLocation(IKANA_CANYON_SCRUB_PURCHASE, BLUE_POTION_REFILL); PlaceItemInLocation(ZORA_HALL_SCRUB_PURCHASE, GREEN_POTION_REFILL); - PlaceItemInLocation(MILK_ROAD_GORMAN_MILK_BUY, MILK); - //other 2 scrub sales handled in beans and main inventory }; static void SetScarceItemPool() { @@ -1021,15 +963,20 @@ void GenerateItemPool() { PlaceItemInLocation(LAUNDRY_POOL_KAFEI,PENDANT_MEMORIES); } - //TO-DO----SHOP SANITY - //for now... its all vanilla lol - //if (Settings::Shopsanity.Is(ShopsanitySetting::SHOPSANITY_OFF) || Settings::Shopsanity.Is(ShopsanitySetting::SHOPSANITY_ZERO)) { - AddItemsToPool(ItemPool, normalRupees); - PlaceVanillaShopItems(); - // } else { //Shopsanity 1-4, random - //AddItemsToPool(ItemPool, shopsanityRupees); //Shopsanity gets extra large rupees - //PlaceVanillaShopItems(); - //} + //SHOPSANITY + if (Shopsanity) { + AddItemsToPool(ItemPool, shopsanityRupees); //Shopsanity gets extra large rupees + AddItemsToPool(ItemPool, shopItems); + } else { + AddItemsToPool(ItemPool, normalRupees); + PlaceVanillaShopItems(); + } + if (Scrubsanity) { + AddItemsToPool(ItemPool, scrubPurchases); + } + else { + PlaceVanillaScrubPurchases(); + } //Then Place Tingle Maps if (ShuffleTingleMaps) { diff --git a/source/location_access.cpp b/source/location_access.cpp index 17be4ff..60bc5dc 100644 --- a/source/location_access.cpp +++ b/source/location_access.cpp @@ -24,7 +24,7 @@ bool LocationAccess::ConditionsMet() const { conditionsMet= true; } - return conditionsMet;// && CanBuy(); + return conditionsMet && CanBuy(); } bool LocationAccess::CanBuy() const { @@ -36,13 +36,13 @@ bool LocationAccess::CanBuy() const { //Check if current walet is large enough bool SufficientWallet = true; if (Location(location)->GetPrice() > 500) { - SufficientWallet = Logic::ProgressiveWallet >= 3; + SufficientWallet = Logic::ProgressiveWallet >= 2; } else if (Location(location)->GetPrice() > 200) { - SufficientWallet = Logic::ProgressiveWallet >= 2; + SufficientWallet = Logic::ProgressiveWallet >= 1; } else if (Location(location)->GetPrice() > 99) { - SufficientWallet = Logic::ProgressiveWallet >= 1; + SufficientWallet = Logic::ProgressiveWallet >= 0; } bool OtherCondition = true; diff --git a/source/setting_descriptions.cpp b/source/setting_descriptions.cpp index 1a3bd0e..52c3ed7 100644 --- a/source/setting_descriptions.cpp +++ b/source/setting_descriptions.cpp @@ -455,29 +455,9 @@ string_view linksPocketNothing = "**OPTION CURRENTLY WIP**\n" | SHOPSANITY | // ------------------------------*/ // string_view shopsOff = "All shop items will be the same as vanilla."; // -string_view shopsZero = "**OPTION CURRENTLY WIP**\n" // - "Vanilla shop items will be shuffled among\n" // - "different shops."; // -string_view shopsOne = "**OPTION CURRENTLY WIP**\n" // - "Vanilla shop items will be shuffled among\n" // - "different shops, and each shop will contain\n" // - "one non-vanilla shop item."; // -string_view shopsTwo = "**OPTION CURRENTLY WIP**\n" // - "Vanilla shop items will be shuffled among\n" // - "different shops, and each shop will contain\n" // - "two non-vanilla shop items."; // -string_view shopsThree = "**OPTION CURRENTLY WIP**\n" // - "Vanilla shop items will be shuffled among\n" // - "different shops, and each shop will contain\n" // - "three non-vanilla shop items."; // -string_view shopsFour = "**OPTION CURRENTLY WIP**\n" // - "Vanilla shop items will be shuffled among\n" // - "different shops, and each shop will contain\n" // - "four non-vanilla shop items."; // -string_view shopsRandom = "**OPTION CURRENTLY WIP**\n" // - "Vanilla shop items will be shuffled among\n" // - "different shops, and each shop will contain\n" // - "1-4 non-vanilla shop items."; // +string_view shopsOn = "Items in Shops will be randomized, this includes\n"// + "Trading Post, Bomb Shop, Swamp Potion Shop, Goron\n"// + "Village and Zora Hall Shops.";// /*------------------------------ // | TOKENSANITY | // ------------------------------*/ // @@ -488,20 +468,14 @@ string_view tokensAllTokens = "Effectively adds 60 new locations for i /*------------------------------ // | SCRUB SHUFFLE | // ------------------------------*/ // -string_view scrubsOff = "Deku Scrub Salesmen will not be randomized"; // -string_view scrubsAffordable = "**OPTION CURRENTLY WIP**\n" // - "All Scrub prices will be reduced to 10 rupees each"; -string_view scrubsExpensive = "**OPTION CURRENTLY WIP**\n" // - "All Scrub prices will be their vanilla prices.\n";// -string_view scrubsRandomPrices = "**OPTION CURRENTLY WIP**\n" // - "All Scrub prices will be between 0-95 rupees. This" - "will on average be very, very expensive overall.";// +string_view scrubsOff = "Deku Scrub Purchases will not be randomized."; // +string_view scrubsOn = "Deku Scrub Purchases will be randomized."; // /*------------------------------ // | SHUFFLE COWS | // ------------------------------*/ // string_view shuffleCowsDesc = "Enabling this will let cows give you items upon\n"// "performing Epona's song in front of them. There\n"// - "are 7 cows"; // + "are 7 cows."; // // /*------------------------------ // | SHUFFLE OCARINAS | // @@ -509,7 +483,7 @@ string_view shuffleCowsDesc = "Enabling this will let cows give you it string_view ocarinasDesc = "Setting this to No shuffles the Ocarina of Time\n"// "into the item pool." // "\n" // - "This will require finding an Ocarina before being\n" + "This will require finding the Ocarina before being\n" "able to play songs or restart the cycle"; // /*------------------------------ // diff --git a/source/settings.cpp b/source/settings.cpp index de57cf7..c906ba5 100644 --- a/source/settings.cpp +++ b/source/settings.cpp @@ -375,9 +375,9 @@ namespace Settings { Option ShuffleSongs = Option::U8 ("Shuffle Songs", {"Off", "Song Locations", "Anywhere"}, {songsVanilla, songsSongLocations, songsAllLocations}, OptionCategory::Setting, 0); Option ShuffleSoaring = Option::Bool("Shuffle Song of Soaring",{"Off", "On"}, {shuffleSoaringVanilla, shuffleSoaringRandom}, OptionCategory::Setting, 0); Option ShuffleSongOfTime = Option::Bool("Shuffle Song of Time", {"Off", "On"}, {songTimeVanilla, songTimeRandom}, OptionCategory::Setting, 0); - Option Shopsanity = Option::U8 ("Shopsanity", {"Off", "0", "1", "2", "3", "4", "Random"}, {shopsOff, shopsZero, shopsOne, shopsTwo, shopsThree, shopsFour, shopsRandom}); - Option Tokensanity = Option::Bool("Tokensanity", {"Off", "On"}, {tokensOff, tokensAllTokens}); - Option Scrubsanity = Option::U8 ("Shuffle Scrub Wares", {"Off", "Affordable", "Expensive", "Random Prices"}, {scrubsOff, scrubsAffordable, scrubsExpensive, scrubsRandomPrices}); + Option Shopsanity = Option::Bool("Shopsanity", {"Off", "On"}, {shopsOff, shopsOn}, OptionCategory::Setting, 0); + Option Tokensanity = Option::Bool("Tokensanity", {"Off", "On"}, {tokensOff, tokensAllTokens}, OptionCategory::Setting, 0); + Option Scrubsanity = Option::Bool("Shuffle Scrub Purchases",{"Off", "On"}, {scrubsOff, scrubsOn}, OptionCategory::Toggle, 0); Option ShuffleMerchants = Option::Bool("Shuffle Scrub Trades", {"Off", "On"}, {shuffleMerchantsDesc}); Option ShuffleTradeItems = Option::Bool("Shuffle Anju and Kafei",{"Off", "On"}, {shuffleTradeItemsDesc}); Option ShuffleGFRewards = Option::U8 ("Shuffle Fairy Rewards", {"Off", "Great Fairies", "Anywhere" }, {shuffleGFVanilla, shuffleGFSelf, shuffleGFAnywhere}, OptionCategory::Setting, (u8)GreatFairyRewardShuffleSetting::GFREWARDSHUFFLE_VANILLA); @@ -402,7 +402,8 @@ namespace Settings { &ShuffleSoaring, &ShuffleSongOfTime, &Tokensanity, - //&Shopsanity, + &Shopsanity, + &Scrubsanity, &ShuffleGFRewards, }; From 69a4e14acb641862ac9e03acd1e03a58b595c397 Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Sat, 29 Aug 2026 19:52:20 -0500 Subject: [PATCH 08/63] Shop Updates Fixes a few issues with compiling --- source/include/setting_descriptions.hpp | 4 +--- source/item_pool.cpp | 7 +++++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/source/include/setting_descriptions.hpp b/source/include/setting_descriptions.hpp index cdc3ac9..9877c47 100644 --- a/source/include/setting_descriptions.hpp +++ b/source/include/setting_descriptions.hpp @@ -131,9 +131,7 @@ extern string_view tokensOverworld; extern string_view tokensAllTokens; extern string_view scrubsOff; -extern string_view scrubsAffordable; -extern string_view scrubsExpensive; -extern string_view scrubsRandomPrices; +extern string_view scrubsOn; extern string_view shuffleCowsDesc; diff --git a/source/item_pool.cpp b/source/item_pool.cpp index 6600783..bc9a2d2 100644 --- a/source/item_pool.cpp +++ b/source/item_pool.cpp @@ -504,6 +504,13 @@ std::array tingleMaps = { ROMANI_RANCH_MAP, }; +std::array shopItems = { // Only include non junk items/potions/milk + HEROS_SHIELD, + HEROS_SHIELD, + MAGIC_BEAN, + PROGRESSIVE_BOMB_BAG, + PROGRESSIVE_BOMB_BAG, +}; void AddItemToPool(std::vector& pool, ItemKey item, size_t count /*= 1*/) { pool.insert(pool.end(), count, item); } From 9982fe4e54448730c979584b91556932a424d23f Mon Sep 17 00:00:00 2001 From: pizza1398 <259104093+pizza1398@users.noreply.github.com> Date: Sun, 30 Aug 2026 19:01:49 +0200 Subject: [PATCH 09/63] Shopsanity text base (#203) * Add choice markers, CreateShopMessage - Use ># in Tingle and other shops - Create both halves of shop text from first ID - Write price to field_4 and to text * Tweak CreateShopMessage - Make part-timer variants of shop messages (En & Fr only so far) - Make out of stock variant of blue potion message automatically - Draft per-language same-line separators - Center ice trap message --- source/custom_messages.cpp | 8 +-- source/hints.cpp | 118 ++++++++++++++++++++++++++++++++----- 2 files changed, 108 insertions(+), 18 deletions(-) diff --git a/source/custom_messages.cpp b/source/custom_messages.cpp index 3f2c3fc..ae574e1 100644 --- a/source/custom_messages.cpp +++ b/source/custom_messages.cpp @@ -335,13 +335,13 @@ void CreateBaselineCustomMessages() { // Ice Trap CreateMessage(0x0012, 0xFFFF, 0x3FFFFFFF, 0xFF0000, - {" #FOOL!#", + {"><#FOOL!#", // French - "#IDIOT!#", + "><#IDIOT!#", // NOT Spanish - " #FOOL!#", + "><#FOOL!#", // German - "#NARR!#", + "><#NARR!#", }, {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_NORMAL); diff --git a/source/hints.cpp b/source/hints.cpp index f2c85e6..3305fd7 100644 --- a/source/hints.cpp +++ b/source/hints.cpp @@ -441,51 +441,141 @@ void CreateTingleHintText() { if (Settings::ShuffleTingleMaps.Is(true)) { // Logic: Get item names from location. // Create custom message for each tingle location (6) - Text clockTownMap = Text{"#"}+ItemTable(Location(TINGLE_N_CLOCK_TOWN_CT)->GetPlacedItemKey()).GetName(); - Text woodfallMap = Text{"#"}+ItemTable(Location(TINGLE_N_CLOCK_TOWN_WF)->GetPlacedItemKey()).GetName(); - Text snowHeadMap = Text{"#"}+ItemTable(Location(TINGLE_TWIN_ISLANDS_SH)->GetPlacedItemKey()).GetName(); - Text romaniMap = Text{"#"}+ItemTable(Location(TINGLE_TWIN_ISLANDS_RR)->GetPlacedItemKey()).GetName(); - Text greatBayMap = Text{"#"}+ItemTable(Location(TINGLE_GBC_GB)->GetPlacedItemKey()).GetName(); - Text ikanaMap = Text{"#"}+ItemTable(Location(TINGLE_GBC_ST)->GetPlacedItemKey()).GetName(); + Text clockTownMap = ItemTable(Location(TINGLE_N_CLOCK_TOWN_CT)->GetPlacedItemKey()).GetName(); + Text woodfallMap = ItemTable(Location(TINGLE_N_CLOCK_TOWN_WF)->GetPlacedItemKey()).GetName(); + Text snowHeadMap = ItemTable(Location(TINGLE_TWIN_ISLANDS_SH)->GetPlacedItemKey()).GetName(); + Text romaniMap = ItemTable(Location(TINGLE_TWIN_ISLANDS_RR)->GetPlacedItemKey()).GetName(); + Text greatBayMap = ItemTable(Location(TINGLE_GBC_GB)->GetPlacedItemKey()).GetName(); + Text ikanaMap = ItemTable(Location(TINGLE_GBC_ST)->GetPlacedItemKey()).GetName(); // {"English", "French", "Spanish" "German" }; "Italian" - Text priceFive = {" ##5 Rupees#&", " ##5 Rubis#&", " ##5 rupias#&", " - ##5 Rubine#&" }; // , " ##5 rupie#&" - Text priceTwenty = {" ##20 Rupees#&", " ##20 Rubis#&", " ##20 rupias#&", " - ##20 Rubine#&"}; // , " ##20 rupie#&" + Text priceFive = {" ##5 Rupees#&#", " ##5 Rubis#&#", " ##5 rupias#&#", " - ##5 Rubine#&#" }; // , " ##5 rupie#&" + Text priceTwenty = {" ##20 Rupees#&#", " ##20 Rubis#&#", " ##20 rupias#&#", " - ##20 Rubine#&#"}; // , " ##20 rupie#&" Text priceForty = {" ##40 Rupees#", " ##40 Rubis#", " ##40 rupias#", " - ##40 Rubine#" }; // , " ##40 rupie#" Text leaveShop = {"&#No thanks#", "&#Non merci#", "&#No, gracias#", "&#Nein, danke!#" }; // , "&#No, grazie#" // Clock Town message CustomMessages::CreateMessageFromTextObject(0x1D11, 0xFFFF, 0x3FF0A005, 0xFF1001, - clockTownMap+priceFive+woodfallMap+priceForty+leaveShop, + Text{">3#"}+clockTownMap+priceFive+woodfallMap+priceForty+leaveShop, {QM_GREEN, QM_RED, QM_GREEN, QM_RED, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); // Woodfall message CustomMessages::CreateMessageFromTextObject(0x1D12, 0xFFFF, 0x3FF0A014, 0xFF1001, - woodfallMap+priceTwenty+snowHeadMap+priceForty+leaveShop, + Text{">3#"}+woodfallMap+priceTwenty+snowHeadMap+priceForty+leaveShop, {QM_GREEN, QM_RED, QM_GREEN, QM_RED, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); // Snowhead message CustomMessages::CreateMessageFromTextObject(0x1D13, 0xFFFF, 0x3FF0A014, 0xFF1001, - snowHeadMap+priceTwenty+romaniMap+priceForty+leaveShop, + Text{">3#"}+snowHeadMap+priceTwenty+romaniMap+priceForty+leaveShop, {QM_GREEN, QM_RED, QM_GREEN, QM_RED, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); // Milk Road message CustomMessages::CreateMessageFromTextObject(0x1D14, 0xFFFF, 0x3FF0A014, 0xFF1001, - romaniMap+priceTwenty+greatBayMap+priceForty+leaveShop, + Text{">3#"}+romaniMap+priceTwenty+greatBayMap+priceForty+leaveShop, {QM_GREEN, QM_RED, QM_GREEN, QM_RED, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); // Great Bay message CustomMessages::CreateMessageFromTextObject(0x1D15, 0xFFFF, 0x3FF0A014, 0xFF1001, - greatBayMap+priceTwenty+ikanaMap+priceForty+leaveShop, + Text{">3#"}+greatBayMap+priceTwenty+ikanaMap+priceForty+leaveShop, {QM_GREEN, QM_RED, QM_GREEN, QM_RED, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); // Ikana message CustomMessages::CreateMessageFromTextObject(0x1D16, 0xFFFF, 0x3FF0A014, 0xFF1001, - ikanaMap+priceTwenty+clockTownMap+priceForty+leaveShop, + Text{">3#"}+ikanaMap+priceTwenty+clockTownMap+priceForty+leaveShop, {QM_GREEN, QM_RED, QM_GREEN, QM_RED, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); } } +void CreateShopMessage(u16 messageID, ItemKey shopItem, u16 buyingPrice, bool isRepeatable) { + Text itemName = ItemTable(shopItem).GetName(); + Text shopIntro = Text{"#"}+itemName+Text{ + "&>>" + // itemName.NAenglish.length() <= 30 ? ": " : "&>>", + // itemName.NAfrench.length() <= 30 ? " : " : "&>>", + // itemName.NAspanish.length() <= 30 ? ": " : "&>>", + // itemName.EURgerman.length() <= 30 ? ": " : "&>>", + // // itemName.EURitalian.length() <= 30 ? ": " : "&>>", + // itemName.EURenglish.length() <= 30 ? ": " : "&>>", + // itemName.EURfrench.length() <= 30 ? " : " : "&>>", + // itemName.EURspanish.length() <= 30 ? ": " : "&>>", + }+std::to_string(buyingPrice)+Text{ + " Rupees#&", " rubis#&", " rupias#&", " Rubine#&",// " rupie#&" + }; + Text shopDescription = {"oops"}; + if ((messageID < 0x06C9) || (messageID > 0x06D8)) { + // Regular shop + if (isRepeatable) { + shopDescription = { + /*NaEnglish*/"Special deal!&Buy as many as you want!", + /*NaFrench */"Offre spéciale!&Achetez-en à volonté!", + /*NaSpanish*/"¡Oferta especial!&¡Compra todo lo que quieras!", + /*EuGerman */"Sonderangebot!&Kauft so viel ihr wollt!", + // /*EuItalian*/"Offerta speciale!&Compratene a volontà!", + /*EuEnglish*/"", + /*EuFrench */"Offre spéciale !&Achetez-en à volonté !", + /*EuSpanish*/"", + }; + } else { + shopDescription = { + /*NaEnglish*/"Special deal! ONE LEFT!&Get it while it lasts!", + /*NaFrench */"Offre spéciale! DERNIER EN STOCK!&Maintenant ou jamais!", + /*NaSpanish*/"¡Oferta especial! ¡SOLO QUEDA UNA UNIDAD!&¡Hazte con ella antes de que se agote!", + /*EuGerman */"Sonderangebot! NUR EINS AUF LAGER!&Schlagt zu solange ihr noch könnt!", + // /*EuItalian*/"Offerta speciale! ULTIMO PEZZO!&Affrettatevi ad aquistarlo!", + /*EuEnglish*/"", + /*EuFrench */"Offre spéciale ! DERNIER EN STOCK !&Maintenant ou jamais !", + /*EuSpanish*/"", + }; + } + } else { + // Trading post part-timer + if (isRepeatable) { + shopDescription = { + /*English*/"Pretty sure we've got a bunch.&Oh and it's, like, a special deal.", + /*French */"On doit en avoir un tas dans le stock.&Ah oui, et c'est une offre spéciale.", + /*Spanish?*/"¡Oferta especial!&¡Compra todo lo que quieras!", + /*German ?*/"Sonderangebot!&Kauft so viel ihr wollt!", + // /*Italian?*/"Offerta speciale!&Compratene a volontà!", + }; + } else { + shopDescription = { + /*English*/"This one's a special deal, and uh,&I think we only have the one...", + /*French */"C't'un genre d'offre spéciale, ouais.&Et j'crois qu'c'est tout ce qu'on a...", + /*Spanish?*/"¡Oferta especial! ¡SOLO QUEDA UNA UNIDAD!&¡Hazte con ella antes de que se agote!", + /*German ?*/"Sonderangebot! NUR EINS AUF LAGER!&Schlagt zu solange ihr noch könnt!", + // /*Italian?*/"Offerta speciale! ULTIMO PEZZO!&Affrettatevi ad aquistarlo!", + }; + } + } + + CustomMessages::CreateMessageFromTextObject(messageID, 0xFFFF, (0x3FFFFC00 | buyingPrice), 0xFF0301, + shopIntro+shopDescription, {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + // Handle blue potion variant for mushroomless hag + // WILL OVERFLOW IN MOST LANGUAGES WHEN ITEM NAME TRIGGERS LINE BREAK + if (messageID == 0x0843) { + CustomMessages::CreateMessageFromTextObject(0x0880, 0xFFFF, (0x3FFFFC00 | buyingPrice), 0xFF0301, + shopIntro+Text{ + /*NaEnglish*/"Actually, I can't get the ingredients&for this, so I'm sold out. Sorry.", + /*NaFrench */"En fait, je n'arrive pas à trouver&les ingrédients pour ça, alors je&n'en ai plus. Désolée.", + /*NaSpanish*/"No puedo conseguir los&ingredientes, así que está&agotada. Lo siento.", + /*EuGerman */"Leider habe ich nicht die passenden&Zutaten auf Lager, daher ist dieser&Artikel gerade nicht lieferbar.", + // /*EuItalian*/"In realtà, questa pozione è esaurita&e non ho gli ingredienti per&prepararne altra. Mi spiace.", + /*EuEnglish*/"", + /*EuFrench */"", + /*EuSpanish*/"En realidad, no puedo conseguir&los ingredientes para esto, así que&no me queda más. Lo siento.", + }, {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + } + + CustomMessages::CreateMessageFromTextObject(messageID + 1, 0xFFFF, (0x3FFFFC00 | buyingPrice), 0xFF1301, + shopIntro+">2"+Text{ + /*English*/"#Buy&Don't Buy#", + /*French */"#J'achète&J'achète pas#", + /*Spanish*/"#Comprar&No comprar#", + /*German */"#Kaufen!&Nicht kaufen!#", + // /*Italian*/"#Compra&Non comprare#", + }, {QM_WHITE, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); +} + void CreateOtherHints() { // Create other hints for various texts From f68f9946ce5a1f8c7242ae5d30ba8b607f79a4a1 Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Wed, 2 Sep 2026 20:46:33 -0500 Subject: [PATCH 10/63] Trick Names - Implements new shops.cpp files for calculating prices and setting fake names for ice trap items - Fake names are dummied out for now pending creation - Adds new Shopsanity and Shopsanity price settings --- source/fill.cpp | 2 +- source/include/item_location.hpp | 2 +- source/include/setting_descriptions.hpp | 2 + source/include/settings.hpp | 1 + source/include/shops.hpp | 22 + source/item_location.cpp | 3 +- source/patch.cpp | 2 +- source/setting_descriptions.cpp | 4 +- source/settings.cpp | 5 +- source/shops.cpp | 894 ++++++++++++++++++++++++ 10 files changed, 929 insertions(+), 8 deletions(-) create mode 100644 source/include/shops.hpp create mode 100644 source/shops.cpp diff --git a/source/fill.cpp b/source/fill.cpp index 62faa15..f003cd2 100644 --- a/source/fill.cpp +++ b/source/fill.cpp @@ -12,7 +12,7 @@ #include "hints.hpp" #include "hint_list.hpp" #include "entrance.hpp" -//#include "shops.hpp" +#include "shops.hpp" #include "debug.hpp" #include diff --git a/source/include/item_location.hpp b/source/include/item_location.hpp index b4181b0..e8bae3b 100644 --- a/source/include/item_location.hpp +++ b/source/include/item_location.hpp @@ -453,7 +453,7 @@ void LocationTable_Init(); ItemLocation* Location(LocationKey locKey); -//extern std::vector> ShopLocationLists; +extern std::vector> ShopLocationLists; extern std::vector gossipStoneLocations; diff --git a/source/include/setting_descriptions.hpp b/source/include/setting_descriptions.hpp index 9877c47..15ed4ce 100644 --- a/source/include/setting_descriptions.hpp +++ b/source/include/setting_descriptions.hpp @@ -124,6 +124,8 @@ extern string_view skipSongReplaysDesc; extern string_view shopsOff; extern string_view shopsOn; +extern string_view shopPricesRandom; +extern string_view shopPricesAffordable; extern string_view tokensOff; extern string_view tokensDungeon; diff --git a/source/include/settings.hpp b/source/include/settings.hpp index 3292c28..6f8384b 100644 --- a/source/include/settings.hpp +++ b/source/include/settings.hpp @@ -414,6 +414,7 @@ namespace Settings { extern Option ShuffleMagicBeans; extern Option ShuffleKokiriSword; extern Option Shopsanity; + extern Option ShopsanityPrices; extern Option Tokensanity; extern Option Scrubsanity; extern Option ShuffleCows; diff --git a/source/include/shops.hpp b/source/include/shops.hpp new file mode 100644 index 0000000..0514cfa --- /dev/null +++ b/source/include/shops.hpp @@ -0,0 +1,22 @@ +#pragma once +#include "item.hpp" +#include "item_location.hpp" + +#include +#include +#include + +struct ItemAndPrice { + Text Name; + int price; + bool Repurchaseable; +}; + +extern void PlaceVanillaShopItems(); +extern int GetShopPrice(); +extern s16 GetRandomScrubPrice(); +extern Text GetIceTrapName(u8 id); +extern int GetShopIndex(LocationKey loc); +extern int TransformShopIndex(int index); + +extern std::vector NonShopItems; \ No newline at end of file diff --git a/source/item_location.cpp b/source/item_location.cpp index 0393372..cc78903 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -3,7 +3,7 @@ #include "dungeon.hpp" #include "settings.hpp" #include "spoiler_log.hpp" -//#include "shops.hpp" +#include "shops.hpp" #include "debug.hpp" #include "keys.hpp" #include "fill.hpp" @@ -720,7 +720,6 @@ std::vector> ShopLocationLists = { SS_ShopLocations, GV_ShopLocations, ZH_ShopLocations, - TingleMapLocations, }; //List of gossip stone locations for hints diff --git a/source/patch.cpp b/source/patch.cpp index ac98fc1..1209e76 100644 --- a/source/patch.cpp +++ b/source/patch.cpp @@ -3,7 +3,7 @@ #include "cosmetics.hpp" #include "custom_messages.hpp" #include "music.hpp" -//#include "shops.hpp" +#include "shops.hpp" #include "spoiler_log.hpp" //#include "entrance.hpp" #include "item_location.hpp" diff --git a/source/setting_descriptions.cpp b/source/setting_descriptions.cpp index 52c3ed7..70c615a 100644 --- a/source/setting_descriptions.cpp +++ b/source/setting_descriptions.cpp @@ -457,7 +457,9 @@ string_view linksPocketNothing = "**OPTION CURRENTLY WIP**\n" string_view shopsOff = "All shop items will be the same as vanilla."; // string_view shopsOn = "Items in Shops will be randomized, this includes\n"// "Trading Post, Bomb Shop, Swamp Potion Shop, Goron\n"// - "Village and Zora Hall Shops.";// + "Village and Zora Hall Shops."; // +string_view shopPricesRandom = "Shop items will have random prices."; // +string_view shopPricesAffordable = "Shop items will have affordable prices."; // /*------------------------------ // | TOKENSANITY | // ------------------------------*/ // diff --git a/source/settings.cpp b/source/settings.cpp index c906ba5..76e6884 100644 --- a/source/settings.cpp +++ b/source/settings.cpp @@ -375,8 +375,9 @@ namespace Settings { Option ShuffleSongs = Option::U8 ("Shuffle Songs", {"Off", "Song Locations", "Anywhere"}, {songsVanilla, songsSongLocations, songsAllLocations}, OptionCategory::Setting, 0); Option ShuffleSoaring = Option::Bool("Shuffle Song of Soaring",{"Off", "On"}, {shuffleSoaringVanilla, shuffleSoaringRandom}, OptionCategory::Setting, 0); Option ShuffleSongOfTime = Option::Bool("Shuffle Song of Time", {"Off", "On"}, {songTimeVanilla, songTimeRandom}, OptionCategory::Setting, 0); - Option Shopsanity = Option::Bool("Shopsanity", {"Off", "On"}, {shopsOff, shopsOn}, OptionCategory::Setting, 0); - Option Tokensanity = Option::Bool("Tokensanity", {"Off", "On"}, {tokensOff, tokensAllTokens}, OptionCategory::Setting, 0); + Option Shopsanity = Option::Bool("Shopsanity", {"Off", "On"}, {shopsOff, shopsOn}, OptionCategory::Setting, 0); + Option ShopsanityPrices = Option::U8 ("Shopsanity Prices", {"Random", "Affordable"}, {shopPricesRandom, shopPricesAffordable}, OptionCategory::Setting, 0); + Option Tokensanity = Option::Bool("Tokensanity", {"Off", "On"}, {tokensOff, tokensAllTokens}, OptionCategory::Setting, 0); Option Scrubsanity = Option::Bool("Shuffle Scrub Purchases",{"Off", "On"}, {scrubsOff, scrubsOn}, OptionCategory::Toggle, 0); Option ShuffleMerchants = Option::Bool("Shuffle Scrub Trades", {"Off", "On"}, {shuffleMerchantsDesc}); Option ShuffleTradeItems = Option::Bool("Shuffle Anju and Kafei",{"Off", "On"}, {shuffleTradeItemsDesc}); diff --git a/source/shops.cpp b/source/shops.cpp new file mode 100644 index 0000000..ca96620 --- /dev/null +++ b/source/shops.cpp @@ -0,0 +1,894 @@ +#include "item_location.hpp" +#include "item_pool.hpp" +#include "shops.hpp" +#include "random.hpp" +#include "location_access.hpp" +#include "item.hpp" +#include "debug.hpp" + +#include +#include +#include +#include + +using namespace Settings; + +std::vector NonShopItems = {}; + +static std::array, 0xD5> trickNameTable; //Table of trick ice trap names +bool initTrickNames = false; //indicates if trick ice trap names have been initialized yet + +//Set vanilla shop item locations before potential randomization +void PlaceVanillaShopItems() { + // Loop to place vanilla items in each location + for (size_t i = 0; i < ShopLocationLists.size(); i++) { + for (size_t j = 0; j < ShopLocationLists[i].size(); j++) { + Location(ShopLocationLists[i][j])->PlaceVanillaItem(); + } + } +} +// This table contains a cumulative probability for each possible shop price based on +// a beta distribution with alpha = 1.5, beta = 2, and the result of the distribution, a float in [0.0, 1.0), +// being multiplied by 60, cast to an integer, then multiplied by 5 to give a value in range [0, 495] in increments +// of 5. Meaning the first value is the probability of 0, the next value is the probability of 0 plus the probability +// of 5, etc. +// Probabilities generated using a python script with 1 billion trials, so should hopefully be pretty good +// Average price ~126 +// ~38% chance of needing no wallet, ~45% chance of needing 1, ~17% chance of needing 2 +static constexpr std::array ShopPriceProbability = { + 0.005326994, 0.014908518, 0.027114719, 0.041315285, 0.057136304, 0.074325887, 0.092667151, 0.112002061, 0.132198214, + 0.153125390, 0.174696150, 0.196810540, 0.219388148, 0.242361379, 0.265657012, 0.289205134, 0.312970402, 0.336877590, + 0.360881110, 0.384932772, 0.408976198, 0.432982176, 0.456902494, 0.480686053, 0.504313389, 0.527746488, 0.550938554, + 0.573856910, 0.596465330, 0.618736235, 0.640646600, 0.662162782, 0.683240432, 0.703859801, 0.724001242, 0.743631336, + 0.762722631, 0.781259986, 0.799198449, 0.816521905, 0.833208595, 0.849243398, 0.864579161, 0.879211177, 0.893112051, + 0.906263928, 0.918639420, 0.930222611, 0.940985829, 0.950914731, 0.959992180, 0.968187000, 0.975495390, 0.981884488, + 0.987344345, 0.991851853, 0.995389113, 0.997937921, 0.999481947, 1.000000000, +}; + +size_t GetNumberOfBins(int maxPrice, int stepSize) { + if (maxPrice <= 0) { + return 1; + } + + double rawResult = floor((double)maxPrice / (double)stepSize) + 1.0; + return (size_t)rawResult; +} + +double GetFractionForOneBin(size_t numberOfBins) { + return 1.0 / (double)numberOfBins; +} + +double CalculateCumulativeDistributionFunction(double input) { + return 2.5 * (1 - 0.6 * input) * pow(input, 1.5); +} + +int GetShopPrice() { + const int stepSize = 5; + if (Settings::ShopsanityPrices.Value() == 1) /*Affordable*/ { + // Affordable option is like affordable scrubs. All items cost 10 rupees. + return 10; + } else if (Settings::ShopsanityPrices.Value() == 0) /*Random*/ { + // "Original" Shopsanity price behaviour. Using the precomputed probability values from the ShopPriceProbability + // array. + double random = RandomDouble(); // Randomly generated probability value + for (size_t i = 0; i < ShopPriceProbability.size(); i++) { + if (random < ShopPriceProbability[i]) { + // The randomly generated value has surpassed the total probability up to this point, so this is the + // generated price + return i * stepSize; // i in range [0, 59], output in range [0, 295] in increments of 5 + } + } + } + + // Shopsanity price behaviour with caps for each wallet size. /*TO-DO?*/ + int maxPrice = 495; + + // switch (Settings::ShopsanityPrices.Value()) { + // case SHOPSANITY_PRICE_CHILD: + // maxPrice = 99; + // break; + // case SHOPSANITY_PRICE_ADULT: + // maxPrice = 200; + // break; + // case SHOPSANITY_PRICE_GIANT: + // maxPrice = 500; + // break; + // case SHOPSANITY_PRICE_TYCOON: + // maxPrice = 999; + // break; + // } + + // Since there are a different amount of multiples of 5 rupees between the different settings we need to calculate + // the amount of "bins" aka how many options are available. + size_t numberOfBins = GetNumberOfBins(maxPrice, stepSize); + + // We then need to calculate how those bins relate to a fraction between 0.0 and 1.0 so we can use that to run + // the distribution calculation. + double fractionForOneBin = GetFractionForOneBin(numberOfBins); + + // The diceroll that gives us the randomness for choosing the price. + double random = RandomDouble(); + + // We loop through the amount of bins to look for the bin that the random double fits in with the Cumulative + // Distribution Function + for (size_t i = 0; i < numberOfBins; i++) { + if (random < CalculateCumulativeDistributionFunction(fractionForOneBin * (i + 1))) { + return i * stepSize; // We've found which bin it is in so we can multiply by stepSize so we then get the + // resulting price. + } + } + + return -1; // Shouldn't happen +} + +// Similar to above, beta distribution with alpha = 1, beta = 2, +// multiplied by 20 instead of 60 to give values in rage [0, 95] in increments of 5 +// Average price ~31 +static constexpr std::array ScrubPriceProbability = { + 0.097500187, 0.190002748, 0.277509301, 0.360018376, 0.437522571, 0.510021715, 0.577520272, + 0.640029304, 0.697527584, 0.750024535, 0.797518749, 0.840011707, 0.877508776, 0.910010904, + 0.937504342, 0.960004661, 0.977502132, 0.989998967, 0.997500116, 1.000000000, +}; +s16 GetRandomScrubPrice() { + double random = RandomDouble(); + for (size_t i = 0; i < ScrubPriceProbability.size(); i++) { + if (random < ScrubPriceProbability[i]) { + return i * 5; // i in range [0, 19], output in range [0, 95] in increments of 5 + } + } + return -1; +} + +// Initialize the trick names table with 3 potential options, Easy, Medium, and Hard in each language +void InitTrickNames() { + trickNameTable[(u32)GetItemID::GI_GREAT_FAIRY_SWORD] = { + Text{"Biggoron's Sword", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"Fairy Blade", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"Rainbow Sword", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_SHIELD_HERO] = { + Text{"Hylian Shield", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"Shield of the Hero", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"Legendary Shield", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_STICKS_1] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_TOWN_TITLE_DEED] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_SWAMP_TITLE_DEED] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MOUNTAIN_TITLE_DEED] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_OCEAN_TITLE_DEED] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_BOMBERS_NOTEBOOK] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_ROOM_KEY] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_LETTER_TO_KAFEI] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_PENDANT_OF_MEMORIES] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_LETTER_TO_MAMA] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MOONS_TEAR] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x2C] = { /*Spin Attack*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_LENS_OF_TRUTH] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_FIRE_ARROW] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_ICE_ARROW] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_LIGHT_ARROW] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_HOOKSHOT] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MAGIC_BEAN] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0xB2] = { /*Double Defense*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_OCARINA_OF_TIME] = { + Text{"Fairy Ocarina", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_PICTOGRAPH_BOX] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_POWDER_KEG] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_KEATON] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_BUNNY_HOOD] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_GORON] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_ZORA] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_DEKU] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_POSTMANS] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_ALL_NIGHT] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_BLAST] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_STONE] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_GREAT_FAIRYS] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_BREMEN] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_DON_GEROS] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_OF_SCENTS] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_ROMANIS] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_TROUPE_LEADERS] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_KAFEIS] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_COUPLES] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_KAMARAOS] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_GIBDO] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_GARO] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_CAPTAINS_HAT] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_GIANTS] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_FIERCE_DEITY] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MASK_OF_TRUTH] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0xBA] = { /*Fishing Pass*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x44] = { /*Swamp Skulltula Token*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x6D] = { /*Ocean Skulltula Token*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0xBB] = { /*Clock Town Stray Fairy*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0xBC] = { /*Woodfall Stray Fairy*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0xBD] = { /*Snowhead Stray Fairy*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0xBE] = { /*Great Bay Stray Fairy*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0xBF] = { /*Stone Tower Stray Fairy*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_BOTTLE_EMPTY] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_BOTTLE_MILK] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_BOTTLE_POTION_RED] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_BOTTLE_GOLD_DUST] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_BOTTLE_CHATEAU_ROMANI] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_BOTTLE_MYSTERY_MILK] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_DEKU_PRINCESS_FAIRY] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_POTION_GREEN] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_POTION_BLUE] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_FAIRY] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_BOTTLE_BUG] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_BOTTLE_FISH] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_BOTTLE_POE_TEXT] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_BOTTLE_BIG_POE] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_BOTTLE_SPRING_WATER] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_BOTTLE_HOT_SPRING_WATER] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_BOTTLE_ZORA_EGG] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_BOTTLE_MAGIC_MUSHROOM] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_BOTTLE_SEAHORSE] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x53] = { /*Song of Time*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x73] = { /*Song of Storms*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x4B] = { /*Sonata of Awakening*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x4E] = { /*New Wave Bossa Nova*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x4F] = { /*Elegy of Emptiness*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x51] = { /*Oath to Order*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x6C] = { /*Epona's Song*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0xC2] = { /*Inverted Song of Time*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0xC3] = { /*Song of Double Time*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x54] = { /*Song of Healing*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x72] = { /*Song of Soaring*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0xAE] = { /*Woodfall Temple Map*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0xAF] = { /*Snowhead Temple Map*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0xB0] = { /*Great Bay Temple Map*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0xB1] = { /*Stone Tower Temple Map*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MAP_OF_CLOCK_TOWN] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MAP_OF_WOODFALL] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MAP_OF_SNOWHEAD] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MAP_OF_GREAT_BAY] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MAP_OF_STONE_TOWER] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_MAP_OF_ROMANI_RANCH] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0xA7] = { /*Woodfall Temple Compass*/ + Text{"Forest Temple Compass", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0xA8] = { /*Snowhead Temple Compass*/ + Text{"Ice Cavern Compass", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0xAC] = { /*Great Bay Temple Compass*/ + Text{"Water Temple Compass", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0xAD] = { /*Stone Tower Temple Compass*/ + Text{"Spirit Temple Compass", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0xA3] = { /*Woodfall Temple Boss Key*/ + Text{"Forest Temple Boss Key", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0xA4] = { /*Snowhead Temple Boss Key*/ + Text{"Ice Cavern Boss Key", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0xA5] = { /*Great Bay Temple Boss Key*/ + Text{"Water Temple Boss Key", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0xA6] = { /*Stone Tower Temple Boss Key*/ + Text{"Spirit Temple Boss Key", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x76] = { /*Woodfall Temple Small Key*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x77] = { /*Snowhead Temple Small Key*/ + Text{"Ice Cavern Small Key", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x90] = { /*Great Bay Temple Small Key*/ + Text{"Water Temple Small Key", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0xA2] = { /*Stone Tower Temple Small Key*/ + Text{"Spirit Temple Small Key", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_ODOLWAS_REMAINS] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_GOHTS_REMAINS] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_GYORGS_REMAINS] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_TWINMOLDS_REMAINS] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_RECOVERY_HEART_SINGLE] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_RUPEE_GREEN] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_RUPEE_BLUE] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_RUPEE_RED] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_RUPEE_PURPLE] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_RUPEE_GOLD] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_RUPEE_SILVER] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_HEART_PIECE] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_HEART_CONTAINER] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x92] = { /*Milk*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_BOMBS_5] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_BOMBS_10] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_BOMBS_20] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_BOMBCHUS_5] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_BOMBCHUS_10] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_BOMBCHU_20] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x1E] = { /*Arrows (10)*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x1F] = { /*Arrows (30)*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x20] = { /*Arrows (40)*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x21] = { /*Arrows (50)*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_NUTS_5] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_NUTS_10] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_ARROWS_MEDIUM] = { /*Arrows (10) again?*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_ARROWS_LARGE] = { /*Arrows (30)*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[(u32)GetItemID::GI_FAIRY] = { + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x4A] = { /*Progressive Sword*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x46] = { /*Progressive Bomb Bag*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x47] = { /*Progressive Bow*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x48] = { /*Progressive Wallet*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x49] = { /*Progressive Magic*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; + trickNameTable[0x45] = { /*Progressive Lullaby*/ + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, + Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + }; +} + +// Generate a fake name for the ice trap based on the item it's displayed as +Text GetIceTrapName(u8 id) { + // If the trick names table has not been initialized, do so + if (!initTrickNames) { + InitTrickNames(); + initTrickNames = true; + } + // Randomly get the easy, medium, or hard name for the given item id + return RandomElement(trickNameTable[id]); +} + +// Get shop index based on a given location +static std::map ShopNameToNum = { { "Trading Post", 0 }, { "Bomb Shop", 1 }, + { "Swamp Potion Shop", 2 }, { "Goron Village Shop", 3 }, + { "Zora Hall Shop", 4 }, }; +int GetShopIndex(LocationKey loc) { + // Kind of hacky, but extract the shop and item position from the name + const std::string& name(Location(loc)->GetName()); + int split = name.find(" Item "); + std::string_view shop(name.c_str(), split); + int pos = std::stoi(name.substr(split + 6, 1)) - 1; + int shopnum = ShopNameToNum[shop]; + return shopnum * 8 + pos; +} + +// Without this transformed index, shop-related tables and arrays would need 64 entries- But only half of that is needed +// for shopsanity So we use this transformation to map only important indices to an array with 32 entries in the +// following manner: Shop index: 4 5 6 7 12 13 14 15 20 21 22 23... Transformed: 0 1 2 3 4 5 6 7 8 9 +// 10 11... So we first divide the shop index by 4, then by 2 which basically tells us the index of the shop it's in, +// then multiply by 4 since there are 4 items per shop +// And finally we use a modulo by 4 to get the index within the "shop" of 4 items, and add +int TransformShopIndex(int index) { + return 4 * ((index / 4) / 2) + index % 4; +} \ No newline at end of file From e4f862a0fe3c3d6aa051cc93ace978305303be1c Mon Sep 17 00:00:00 2001 From: pizza1398 <259104093+pizza1398@users.noreply.github.com> Date: Thu, 3 Sep 2026 21:49:39 +0200 Subject: [PATCH 11/63] English Trick Names --- source/shops.cpp | 861 +++++++++++++++++++++++------------------------ 1 file changed, 426 insertions(+), 435 deletions(-) diff --git a/source/shops.cpp b/source/shops.cpp index ca96620..f64657b 100644 --- a/source/shops.cpp +++ b/source/shops.cpp @@ -141,720 +141,711 @@ s16 GetRandomScrubPrice() { // Initialize the trick names table with 3 potential options, Easy, Medium, and Hard in each language void InitTrickNames() { - trickNameTable[(u32)GetItemID::GI_GREAT_FAIRY_SWORD] = { - Text{"Biggoron's Sword", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"Fairy Blade", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"Rainbow Sword", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + // NaEnglish NaFrench NaSpanish EuGerman EuEnglish EuFrench EuSpanish + trickNameTable[(u32)GetItemID::GI_GREAT_FAIRY_SWORD] = { + Text{"Biggoron's Sword", "", "", "", }, + Text{"Fairy Blade", "", "", "", }, + Text{"Rainbow Sword", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_SHIELD_HERO] = { - Text{"Hylian Shield", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"Shield of the Hero", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"Legendary Shield", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Hylian Shield", "", "", "", }, + Text{"Shield of the Hero", "", "", "", }, + Text{"Legendary Shield", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_STICKS_1] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Deku Branch", "", "", "", }, + Text{"Stick", "", "", "", }, + Text{"Deku's Stick", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_TOWN_TITLE_DEED] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Land Toilet Paper", "", "", "", }, + Text{"Land Title Deer", "", "", "", }, + Text{"Sand Title Deed", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_SWAMP_TITLE_DEED] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Swamp Toilet paper", "", "", "", }, + Text{"Swarm Title Deed", "", "", "", }, + Text{"Swap Title Deed", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_MOUNTAIN_TITLE_DEED] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Mountain Toilet Paper", "", "", "", }, + Text{"Mustard Title Deed", "", "", "", }, + Text{"Mountain Title Deep", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_OCEAN_TITLE_DEED] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Ocean Toilet Paper", "", "", "", }, + Text{"Urchin Title Deed", "", "", "", }, + Text{"Ocean Tile Deed", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_BOMBERS_NOTEBOOK] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Bombers Calendar", "", "", "", }, + Text{"Bomber Notes Book", "", "", "", }, + Text{"Boomer's Notebook", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_ROOM_KEY] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Knife Chamber Key", "", "", "", }, + Text{"Inn Key", "", "", "", }, + Text{"Root Key", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_LETTER_TO_KAFEI] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Anju's Response Letter", "", "", "", }, + Text{"Kafei's Letter", "", "", "", }, + Text{"Letter for Kafei", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_PENDANT_OF_MEMORIES] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Kafei's Pendant", "", "", "", }, + Text{"Pendant of Gregory", "", "", "", }, + Text{"Pendant of Memorable", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_LETTER_TO_MAMA] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Priority Mail", "", "", "", }, + Text{"Letter to Mommy", "", "", "", }, + Text{"Letter to Madame Aroma", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_MOONS_TEAR] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Moon's Sweat", "", "", "", }, + Text{"Moon's Tea", "", "", "", }, + Text{"Noon's Tear", "", "", "", }, }; trickNameTable[0x2C] = { /*Spin Attack*/ - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Spinning Slash", "", "", "", }, + Text{"Spit Attack", "", "", "", }, + Text{"Spin Attach", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_LENS_OF_TRUTH] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Good Glasses (Half)", "", "", "", }, + Text{"Lens of Dare", "", "", "", }, + Text{"Lens of True", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_FIRE_ARROW] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Flaming Arrow", "", "", "", }, + Text{"Fired Arrow", "", "", "", }, + Text{"Ire Arrow", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_ICE_ARROW] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Freezing Arrow", "", "", "", }, + Text{"Ice Trap Arrow", "", "", "", }, + Text{"Nice Arrow", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_LIGHT_ARROW] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Silver Arrow", "", "", "", }, + Text{"Lite Arrow", "", "", "", }, + Text{"Might Arrow", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_HOOKSHOT] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Grapling Hook", "", "", "", }, + Text{"Longshot", "", "", "", }, + Text{"Hookshort", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_MAGIC_BEAN] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Peapod", "", "", "", }, + Text{"Tasty Beans", "", "", "", }, + Text{"Magic Beam", "", "", "", }, }; trickNameTable[0xB2] = { /*Double Defense*/ - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Doubloon Defense", "", "", "", }, + Text{"Double the Fence", "", "", "", }, + Text{"Double Defenestrate", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_OCARINA_OF_TIME] = { - Text{"Fairy Ocarina", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Fairy Ocarina", "", "", "", }, + Text{"Flute", "", "", "", }, + Text{"Ocarina", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_PICTOGRAPH_BOX] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Camera", "", "", "", }, + Text{"Pictogaffe Box", "", "", "", }, + Text{"Picograph Box", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_POWDER_KEG] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Dangerous Barrel", "", "", "", }, + Text{"Powder Peg", "", "", "", }, + Text{"Power Keg", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_MASK_KEATON] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Fox Mask", "", "", "", }, + Text{"Kafei's Mask", "", "", "", }, + Text{"Kitsune Mask", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_MASK_BUNNY_HOOD] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Rabbit Ears", "", "", "", }, + Text{"Bunny Mask", "", "", "", }, + Text{"Funny Hood", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_MASK_GORON] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Darmani Mask", "", "", "", }, + Text{"Goron Soul", "", "", "", }, + Text{"Gordon Mask", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_MASK_ZORA] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Mikau Mask", "", "", "", }, + Text{"Zora Soul", "", "", "", }, + Text{"Zora Mark", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_MASK_DEKU] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Sad Tree Mask", "", "", "", }, + Text{"Deku Soul", "", "", "", }, + Text{"Deku Scrub Mask", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_MASK_POSTMANS] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Deliveryman's Uniform", "", "", "", }, + Text{"Postman's Hood", "", "", "", }, + Text{"Portman's Hat", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_MASK_ALL_NIGHT] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Sleepless Mask", "", "", "", }, + Text{"All Right Mask", "", "", "", }, + Text{"All Might Mask", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_MASK_BLAST] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Big Sneeze Mask", "", "", "", }, + Text{"Bat Mask", "", "", "", }, + Text{"Blast Mass", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_MASK_STONE] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Dampé Mask", "", "", "", }, + Text{"Stealth Mask", "", "", "", }, + Text{"Stoat Mask", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_MASK_GREAT_FAIRYS] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Big Lady Mask", "", "", "", }, + Text{"Great Ferry's Mask", "", "", "", }, + Text{"Great Fairly's Mask", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_MASK_BREMEN] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Flute Player's Mask", "", "", "", }, + Text{"Falco Mask", "", "", "", }, + Text{"Broman Mask", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_MASK_DON_GEROS] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Head Frog", "", "", "", }, + Text{"Don Ribbit's Mask", "", "", "", }, + Text{"Don Kero's Mask", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_MASK_OF_SCENTS] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Pigma Dengar Mask", "", "", "", }, + Text{"Mask of Cents", "", "", "", }, + Text{"Mask of Sense", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_MASK_ROMANIS] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Moo Moo Mask", "", "", "", }, + Text{"Cow Mask", "", "", "", }, + Text{"Romania Mask", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_MASK_TROUPE_LEADERS] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Crying Mario Mask", "", "", "", }, + Text{"Circus Troupe Mask", "", "", "", }, + Text{"Troop Leader's Mask", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_MASK_KAFEIS] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Shyguy Mask", "", "", "", }, + Text{"Café's Mask", "", "", "", }, + Text{"Kafai's Mask", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_MASK_COUPLES] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Face Shield", "", "", "", }, + Text{"Coupled Mask", "", "", "", }, + Text{"Coupler's Mask", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_MASK_KAMARAOS] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Symbiotic Dancer", "", "", "", }, + Text{"Kaepora's Mask", "", "", "", }, + Text{"Kamamo's mask", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_MASK_GIBDO] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Paper Mâché Mask", "", "", "", }, + Text{"Redead Mask", "", "", "", }, + Text{"Mummy's Mask", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_MASK_GARO] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Ninja Mask", "", "", "", }, + Text{"Garo Hood", "", "", "", }, + Text{"Gero's Mask", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_MASK_CAPTAINS_HAT] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Spooky Mask", "", "", "", }, + Text{"Keeta Mask", "", "", "", }, + Text{"Captain Mask", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_MASK_GIANTS] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Growing Boy's Mask", "", "", "", }, + Text{"Giant's Masked", "", "", "", }, + Text{"Giant Mask", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_MASK_FIERCE_DEITY] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Big Bad Deity Mask", "", "", "", }, + Text{"Fear's Deity Mask", "", "", "", }, + Text{"Fierce Ditty Mask", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_MASK_OF_TRUTH] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Sheikah Mask", "", "", "", }, + Text{"Mask of Troupe", "", "", "", }, + Text{"Mask of Tooth", "", "", "", }, }; trickNameTable[0xBA] = { /*Fishing Pass*/ - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Fishing Voucher", "", "", "", }, + Text{"Finishing Pass", "", "", "", }, + Text{"Fishing Bass", "", "", "", }, }; trickNameTable[0x44] = { /*Swamp Skulltula Token*/ - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Smelly Gold Skull", "", "", "", }, + Text{"Swamp Skullwalltula Token", "", "", "", }, + Text{"Swamp Skulltula Toucan", "", "", "", }, }; trickNameTable[0x6D] = { /*Ocean Skulltula Token*/ - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Musty Gold Skull", "", "", "", }, + Text{"Ocean Skullwalltula Token", "", "", "", }, + Text{"Ocean Skulltula Toucan", "", "", "", }, }; trickNameTable[0xBB] = { /*Clock Town Stray Fairy*/ - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Castle Town Stray Fairy", "", "", "", }, + Text{"Orange Stray Fairy", "", "", "", }, + Text{"Clock City Stray Fairy", "", "", "", }, }; trickNameTable[0xBC] = { /*Woodfall Stray Fairy*/ - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Forest Temple Stray Fairy", "", "", "", }, + Text{"Pink Stray Fairy", "", "", "", }, + Text{"Woodfall Lost Fairy", "", "", "", }, }; trickNameTable[0xBD] = { /*Snowhead Stray Fairy*/ - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Ice Cavern Stray Fairy", "", "", "", }, + Text{"Green Stray Fairy", "", "", "", }, + Text{"Snowhead Lost fairy", "", "", "", }, }; trickNameTable[0xBE] = { /*Great Bay Stray Fairy*/ - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Water Temple Stray Fairy", "", "", "", }, + Text{"Violet Stray Fairy", "", "", "", }, + Text{"Great Bay Lost Fairy", "", "", "", }, }; trickNameTable[0xBF] = { /*Stone Tower Stray Fairy*/ - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Spirit Temple Stray Fairy", "", "", "", }, + Text{"Yellow Stray Fairy", "", "", "", }, + Text{"Stone Tower Lost Fairy", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_BOTTLE_EMPTY] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Empty Jar", "", "", "", }, + Text{"Bottle", "", "", "", }, + Text{"Emptied Bottle", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_BOTTLE_MILK] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Lon Lon Milk", "", "", "", }, + Text{"Bottle with Mirth", "", "", "", }, + Text{"Milky Bottle", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_BOTTLE_POTION_RED] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Ketchup Bottle", "", "", "", }, + Text{"Health Potion", "", "", "", }, + Text{"Red Syrup", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_BOTTLE_GOLD_DUST] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Flower Pollen", "", "", "", }, + Text{"Good Dust", "", "", "", }, + Text{"Golden Dust", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_BOTTLE_CHATEAU_ROMANI] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Chartreuse Romani", "", "", "", }, + Text{"Chaton Romani", "", "", "", }, + Text{"Chàteau Romani", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_BOTTLE_MYSTERY_MILK] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Gorman Track Milk", "", "", "", }, + Text{"Moldy Milk", "", "", "", }, + Text{"Mysterious Milk", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_DEKU_PRINCESS_FAIRY] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Bottled Deku Figurine", "", "", "", }, + Text{"Flower Princess", "", "", "", }, + Text{"Deku Princes", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_POTION_GREEN] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Spinach Soup", "", "", "", }, + Text{"Magic Potion", "", "", "", }, + Text{"Green Potent", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_POTION_BLUE] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Magic Mushroom Juice", "", "", "", }, + Text{"Blue Drink", "", "", "", }, + Text{"Indigo Potion", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_FAIRY] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Extra Life", "", "", "", }, + Text{"Trapped Fairy", "", "", "", }, + Text{"Bottle with Ferry", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_BOTTLE_BUG] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Creepy Crawlies", "", "", "", }, + Text{"Bottle with Insects", "", "", "", }, + Text{"Bottle with Bug", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_BOTTLE_FISH] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Termina Loach", "", "", "", }, + Text{"Fishie", "", "", "", }, + Text{"Bottle with Fist", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_BOTTLE_POE_TEXT] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Small Ghost", "", "", "", }, + Text{"Bottle with Ghini", "", "", "", }, + Text{"Bottle with Foe", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_BOTTLE_BIG_POE] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Big Ghost", "", "", "", }, + Text{"Bottle with Composer Brother", "", "", "", }, + Text{"Bottle with Big Foe", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_BOTTLE_SPRING_WATER] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Potable Water", "", "", "", }, + Text{"Bottle of Fresh Water", "", "", "", }, + Text{"Bottle with Sprig Water", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_BOTTLE_HOT_SPRING_WATER] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Warm Spring Water", "", "", "", }, + Text{"Hot Sprint Water", "", "", "", }, + Text{"Hot Spring Walter", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_BOTTLE_ZORA_EGG] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Bottle with Eel's Egg", "", "", "", }, + Text{"Bottle with Lulu's Egg", "", "", "", }, + Text{"Bottle with Zoran Egg", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_BOTTLE_MAGIC_MUSHROOM] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Pungent Mushroom", "", "", "", }, + Text{"Bottle with Much Room", "", "", "", }, + Text{"Bottle without Mushroom", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_BOTTLE_SEAHORSE] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Sea Epona", "", "", "", }, + Text{"Seas Horse", "", "", "", }, + Text{"Seehorse", "", "", "", }, }; trickNameTable[0x53] = { /*Song of Time*/ - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Zelda's Memory Song", "", "", "", }, + Text{"Sun's Song", "", "", "", }, + Text{"Song of Tim", "", "", "", }, }; trickNameTable[0x73] = { /*Song of Storms*/ - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Song of Bad Weather", "", "", "", }, + Text{"Song of Thunder", "", "", "", }, + Text{"Song of Storks", "", "", "", }, }; trickNameTable[0x4B] = { /*Sonata of Awakening*/ - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Morning Alarm Song", "", "", "", }, + Text{"Song of Awakening", "", "", "", }, + Text{"Sonata of Wakening", "", "", "", }, }; trickNameTable[0x4E] = { /*New Wave Bossa Nova*/ - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Ballad of the Wind Fish", "", "", "", }, + Text{"Newave Bossanova", "", "", "", }, + Text{"New Wavy Bossa Nova", "", "", "", }, }; trickNameTable[0x4F] = { /*Elegy of Emptiness*/ - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Elegy of Ben", "", "", "", }, + Text{"Melody of Emptiness", "", "", "", }, + Text{"Elegy of Emptyness", "", "", "", }, }; trickNameTable[0x51] = { /*Oath to Order*/ - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Giant's Song", "", "", "", }, + Text{"Oar to Order", "", "", "", }, + Text{"Oath to Odour", "", "", "", }, }; trickNameTable[0x6C] = { /*Epona's Song*/ - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} - }; - trickNameTable[0xC2] = { /*Inverted Song of Time*/ - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} - }; - trickNameTable[0xC3] = { /*Song of Double Time*/ - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Song of the Field", "", "", "", }, + Text{"Epony's Song", "", "", "", }, + Text{"Epona Song", "", "", "", }, }; trickNameTable[0x54] = { /*Song of Healing*/ - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Saria's Song", "", "", "", }, + Text{"Healing Lullaby", "", "", "", }, + Text{"Song of Hearing", "", "", "", }, }; trickNameTable[0x72] = { /*Song of Soaring*/ - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Song of Fast travel", "", "", "", }, + Text{"Prelude of Light", "", "", "", }, + Text{"Song of Sorry", "", "", "", }, }; trickNameTable[0xAE] = { /*Woodfall Temple Map*/ - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Forest Temple Map", "", "", "", }, + Text{"Deku Temple Map", "", "", "", }, + Text{"Goodfall Temple Map", "", "", "", }, }; trickNameTable[0xAF] = { /*Snowhead Temple Map*/ - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Ice Cavern Map", "", "", "", }, + Text{"Snorehead Temple Map", "", "", "", }, + Text{"Snowheap Temple Map", "", "", "", }, }; trickNameTable[0xB0] = { /*Great Bay Temple Map*/ - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Water Temple Map", "", "", "", }, + Text{"Great Fish Temple Map", "", "", "", }, + Text{"Great Ray Temple Map", "", "", "", }, }; trickNameTable[0xB1] = { /*Stone Tower Temple Map*/ - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Spirit Temple Map", "", "", "", }, + Text{"Storm Shower Temple Map", "", "", "", }, + Text{"Stoned Tower Temple Map", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_MAP_OF_CLOCK_TOWN] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Castle Town Map", "", "", "", }, + Text{"Block Town Map", "", "", "", }, + Text{"Clock Town Nap", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_MAP_OF_WOODFALL] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Faron Woods Map", "", "", "", }, + Text{"WoodFool Map", "", "", "", }, + Text{"Woodfail Map", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_MAP_OF_SNOWHEAD] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Hebra Mountain Map", "", "", "", }, + Text{"Snowpeak Map", "", "", "", }, + Text{"Showhead Map", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_MAP_OF_GREAT_BAY] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Great Sea Map", "", "", "", }, + Text{"Zora Bay Map", "", "", "", }, + Text{"Great Buy Map", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_MAP_OF_STONE_TOWER] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Clock Tower Map", "", "", "", }, + Text{"Ikana Valley Map", "", "", "", }, + Text{"Stone Power Map", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_MAP_OF_ROMANI_RANCH] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Lon Lon Ranch Map", "", "", "", }, + Text{"Romani Ranch Radar", "", "", "", }, + Text{"Romami Ranch Map", "", "", "", }, }; trickNameTable[0xA7] = { /*Woodfall Temple Compass*/ - Text{"Forest Temple Compass", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Forest Temple Compass", "", "", "", }, + Text{"Waterfall Temple Compass", "", "", "", }, + Text{"Woodfall Temple Compare", "", "", "", }, }; trickNameTable[0xA8] = { /*Snowhead Temple Compass*/ - Text{"Ice Cavern Compass", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Ice Cavern Compass", "", "", "", }, + Text{"Goron Temple Compass", "", "", "", }, + Text{"Snomhead Temple Compass", "", "", "", }, }; trickNameTable[0xAC] = { /*Great Bay Temple Compass*/ - Text{"Water Temple Compass", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Water Temple Compass", "", "", "", }, + Text{"Pirate Temple Compass", "", "", "", }, + Text{"Great Pay Temple Compass", "", "", "", }, }; trickNameTable[0xAD] = { /*Stone Tower Temple Compass*/ - Text{"Spirit Temple Compass", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Spirit Temple Compass", "", "", "", }, + Text{"Stone Tower Pimple Compass", "", "", "", }, + Text{"Stone Towee Temple Compass", "", "", "", }, }; trickNameTable[0xA3] = { /*Woodfall Temple Boss Key*/ - Text{"Forest Temple Boss Key", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Forest Temple Boss Key", "", "", "", }, + Text{"Swamp Temple Boss Key", "", "", "", }, + Text{"Snowhead Temple Boss Keese", "", "", "", }, }; trickNameTable[0xA4] = { /*Snowhead Temple Boss Key*/ - Text{"Ice Cavern Boss Key", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Ice Cavern Boss Key", "", "", "", }, + Text{"Mountain Temple Boss Key", "", "", "", }, + Text{"Snowhead Temple Toss Key", "", "", "", }, }; trickNameTable[0xA5] = { /*Great Bay Temple Boss Key*/ - Text{"Water Temple Boss Key", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Water Temple Boss Key", "", "", "", }, + Text{"Ocean Temple Boss Key", "", "", "", }, + Text{"Grand Bay Temple Boss Key", "", "", "", }, }; trickNameTable[0xA6] = { /*Stone Tower Temple Boss Key*/ - Text{"Spirit Temple Boss Key", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Spirit Temple Boss Key", "", "", "", }, + Text{"Ikana Temple Boss Key", "", "", "", }, + Text{"Stone Tower Temple Bass Key", "", "", "", }, }; trickNameTable[0x76] = { /*Woodfall Temple Small Key*/ - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Forest Temple Small Key", "", "", "", }, + Text{"Woodfall Dungeon Small Key", "", "", "", }, + Text{"Woodfell Temple Small Key", "", "", "", }, }; trickNameTable[0x77] = { /*Snowhead Temple Small Key*/ - Text{"Ice Cavern Small Key", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Ice Cavern Small Key", "", "", "", }, + Text{"Snowhead Dungeon Small Key", "", "", "", }, + Text{"Snowhead Temple Smell Key", "", "", "", }, }; trickNameTable[0x90] = { /*Great Bay Temple Small Key*/ - Text{"Water Temple Small Key", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Water Temple Small Key", "", "", "", }, + Text{"Great Bay Dungeon Small Key", "", "", "", }, + Text{"Grate Bay Temple Small Key", "", "", "", }, }; trickNameTable[0xA2] = { /*Stone Tower Temple Small Key*/ - Text{"Spirit Temple Small Key", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Spirit Temple Small Key", "", "", "", }, + Text{"Stone Tower Dungeon Small Key", "", "", "", }, + Text{"Stone Tower Temper Small Key", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_ODOLWAS_REMAINS] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Odolwa Mask", "", "", "", }, + Text{"Odolwa Remainings", "", "", "", }, + Text{"Owalda's Remains", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_GOHTS_REMAINS] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Goht Mask", "", "", "", }, + Text{"Goat Remains", "", "", "", }, + Text{"Goth's Remains", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_GYORGS_REMAINS] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Gyorg Mask", "", "", "", }, + Text{"George's Remains", "", "", "", }, + Text{"Grog's Remains", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_TWINMOLDS_REMAINS] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Twinmold Mask", "", "", "", }, + Text{"Twinbug's Remains", "", "", "", }, + Text{"Twinmoid's Remains", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_RECOVERY_HEART_SINGLE] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Healing Heart", "", "", "", }, + Text{"Small Heart", "", "", "", }, + Text{"Heart", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_RUPEE_GREEN] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Green Rupoor", "", "", "", }, + Text{"Rupee", "", "", "", }, + Text{"Greg Rupee", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_RUPEE_BLUE] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Blue Rupoor", "", "", "", }, + Text{"Blur Rupee", "", "", "", }, + Text{"Blue Rupy", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_RUPEE_RED] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Red Rupoor", "", "", "", }, + Text{"Read Rupee", "", "", "", }, + Text{"Rupee (20)", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_RUPEE_PURPLE] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Purple Rupoor", "", "", "", }, + Text{"Pink Rupee", "", "", "", }, + Text{"Purple Ruby", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_RUPEE_GOLD] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Huge Rupoor", "", "", "", }, + Text{"Gold Rupee", "", "", "", }, + Text{"Hugh Rupee", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_RUPEE_SILVER] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Silver Rupoor", "", "", "", }, + Text{"Shiny Rupee", "", "", "", }, + Text{"Sliver Rupee", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_HEART_PIECE] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Incomplete Health Upgrade", "", "", "", }, + Text{"Hurt Piece", "", "", "", }, + Text{"Heart Peace", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_HEART_CONTAINER] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Extra Heart", "", "", "", }, + Text{"Hurt Container", "", "", "", }, + Text{"Heart Contained", "", "", "", }, }; trickNameTable[0x92] = { /*Milk*/ - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Lactose Liquid", "", "", "", }, + Text{"Mink", "", "", "", }, + Text{"Miik", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_BOMBS_5] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Cannonballs (5)", "", "", "", }, + Text{"Orbs (5)", "", "", "", }, + Text{"Boom (5)", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_BOMBS_10] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Cannonballs (10)", "", "", "", }, + Text{"Orbs (10)", "", "", "", }, + Text{"Boom (10)", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_BOMBS_20] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Cannonballs (20)", "", "", "", }, + Text{"Orbs (20)", "", "", "", }, + Text{"Boom (20)", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_BOMBCHUS_5] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Fake Bombchu (5)", "", "", "", }, + Text{"Bombtschüss (5)", "", "", "", }, + Text{"Bombshoes (5)", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_BOMBCHUS_10] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Fake Bombchu (10)", "", "", "", }, + Text{"Bombtschüss (10)", "", "", "", }, + Text{"Bombshoes (10)", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_BOMBCHU_20] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Fake Bombchu (20)", "", "", "", }, + Text{"Bombtschüss (20)", "", "", "", }, + Text{"Bombshoes (20)", "", "", "", }, }; trickNameTable[0x1E] = { /*Arrows (10)*/ - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Bolts (10)", "", "", "", }, + Text{"Errors (10)", "", "", "", }, + Text{"Arrows (0)", "", "", "", }, }; trickNameTable[0x1F] = { /*Arrows (30)*/ - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Bolts (30)", "", "", "", }, + Text{"Errors (30)", "", "", "", }, + Text{"Arrows (Enough)", "", "", "", }, }; trickNameTable[0x20] = { /*Arrows (40)*/ - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Bolts (40)", "", "", "", }, + Text{"Errors (40)", "", "", "", }, + Text{"Arrows (Several)", "", "", "", }, }; trickNameTable[0x21] = { /*Arrows (50)*/ - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Bolts (50)", "", "", "", }, + Text{"Errors (50)", "", "", "", }, + Text{"Arrows (Plenty)", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_NUTS_5] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Flashbangs (5)", "", "", "", }, + Text{"Deku Seeds (5)", "", "", "", }, + Text{"Deku Nest (5)", "", "", "", }, }; - trickNameTable[(u32)GetItemID::GI_NUTS_10] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + trickNameTable[(u32)GetItemID::GI_NUTS_10] = { + Text{"Flashbangs (10)", "", "", "", }, + Text{"Deku Seeds (10)", "", "", "", }, + Text{"Deku Nest (10)", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_ARROWS_MEDIUM] = { /*Arrows (10) again?*/ - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Bolts (10)", "", "", "", }, + Text{"Errors (10)", "", "", "", }, + Text{"Arrows (0)", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_ARROWS_LARGE] = { /*Arrows (30)*/ - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Bolts (30)", "", "", "", }, + Text{"Errors (30)", "", "", "", }, + Text{"Arrows (Enough)", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_FAIRY] = { - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Sprite", "", "", "", }, + Text{"Fairy Refill", "", "", "", }, + Text{"Fairie", "", "", "", }, }; trickNameTable[0x4A] = { /*Progressive Sword*/ - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Progressive Knife", "", "", "", }, + Text{"Progressive Blade", "", "", "", }, + Text{"Progressive's Word", "", "", "", }, }; trickNameTable[0x46] = { /*Progressive Bomb Bag*/ - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Progressive Powder Pouch", "", "", "", }, + Text{"Progressive Bombad", "", "", "", }, + Text{"Progressive Bag of Bombs", "", "", "", }, }; trickNameTable[0x47] = { /*Progressive Bow*/ - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Progressive Slingshot", "", "", "", }, + Text{"Progressive Crossbow", "", "", "", }, + Text{"Pogessive Bow", "", "", "", }, }; trickNameTable[0x48] = { /*Progressive Wallet*/ - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Progressive Piggybank", "", "", "", }, + Text{"Progressive Coin Purse", "", "", "", }, + Text{"Progressive Ballet", "", "", "", }, }; trickNameTable[0x49] = { /*Progressive Magic*/ - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Progressive Green Bar", "", "", "", }, + Text{"Progressive Stamina", "", "", "", }, + Text{"Progressive Maggie", "", "", "", }, }; trickNameTable[0x45] = { /*Progressive Lullaby*/ - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench", "NASpanish", "EUGerman", /*"Italian", "Japanese"*/ "EUEng", "EUFrench", "EUSpanish"}, - Text{"", "NAFrench","NASpanish","EUGerman", /*"Italian","Japanese",*/"EUEng","EUFrench","EUSpanish"} + Text{"Progressive Sleepy Song", "", "", "", }, + Text{"Progressive Lab Ally", "", "", "", }, + Text{"Progressive Lullabye", "", "", "", }, }; } From 6ab82e84ad283e467cccc11d2fe86389ae6227c6 Mon Sep 17 00:00:00 2001 From: Phlex <3514085+PhlexPlexico@users.noreply.github.com> Date: Sat, 5 Sep 2026 14:22:39 -0600 Subject: [PATCH 12/63] fix: Fix related crashes from Shopsanity implementation. --- source/settings.cpp | 3 +-- source/spoiler_log.cpp | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/source/settings.cpp b/source/settings.cpp index 76e6884..3a5b0d8 100644 --- a/source/settings.cpp +++ b/source/settings.cpp @@ -766,7 +766,7 @@ namespace Settings { ctx.shuffleSongs = ShuffleSongs.Value(); //ctx.shuffleSoaring = (ShuffleSoaring) ? 1 : 0; - ctx.shopsanity = Shopsanity.Value(); + // ctx.shopsanity = (Shopsanity); ctx.tokensanity = (Tokensanity) ? 1:0; //ctx.cowsanity = (ShuffleCows) ? 1 : 0; ctx.shuffleKokiriSword = (ShuffleKokiriSword) ? 1 : 0; @@ -774,7 +774,6 @@ namespace Settings { //ctx.shuffleTradeItems = (ShuffleTradeItems)?1:0; ctx.shuffleMerchants = (ShuffleMerchants) ? 1 : 0; //ctx.removeDoubleDefense = (RemoveDoubleDefense) ? 1 : 0; - ctx.mapsAndCompasses = MapsAndCompasses.Value(); ctx.keysanity = Keysanity.Value(); ctx.bossKeysanity = BossKeysanity.Value(); diff --git a/source/spoiler_log.cpp b/source/spoiler_log.cpp index 2bb9c34..e6baeb6 100644 --- a/source/spoiler_log.cpp +++ b/source/spoiler_log.cpp @@ -219,7 +219,7 @@ static void WriteIngameSpoilerLog() { continue; } // Shops - else if ((Settings::Shopsanity.Is(ShopsanitySetting::SHOPSANITY_OFF)) && loc->IsCategory(Category::cShop)){ + else if (!Settings::Shopsanity && loc->IsCategory(Category::cShop)){ continue; } // Stray Fairies From da92dd246f3c584fb9114a015aea1fad27130244 Mon Sep 17 00:00:00 2001 From: Phlex <3514085+PhlexPlexico@users.noreply.github.com> Date: Sat, 5 Sep 2026 14:26:16 -0600 Subject: [PATCH 13/63] nit: Update Z3DR --- Z3DR | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Z3DR b/Z3DR index 6c916cc..1c78aef 160000 --- a/Z3DR +++ b/Z3DR @@ -1 +1 @@ -Subproject commit 6c916cc5518cdefc0f560441004fee9742061009 +Subproject commit 1c78aef9d34c744ddcebce6a29c8375ef4e5fff5 From c092f3d9fdb6db8faa4c448ea1a07e1efe584ae0 Mon Sep 17 00:00:00 2001 From: Phlex <3514085+PhlexPlexico@users.noreply.github.com> Date: Sat, 5 Sep 2026 15:08:42 -0600 Subject: [PATCH 14/63] fix: Update module to use shopsanity branch. --- .gitmodules | 2 +- Z3DR | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitmodules b/.gitmodules index 12a5f3b..bbcd22e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "Z3DR"] path = Z3DR url = https://github.com/Z3DR/mm3dr.git - branch = dev + branch = shopsanity diff --git a/Z3DR b/Z3DR index 93b19dc..f49a39a 160000 --- a/Z3DR +++ b/Z3DR @@ -1 +1 @@ -Subproject commit 93b19dc131f17dbcf8407f0856f514638254bd40 +Subproject commit f49a39a0e81826287ce4f63a3c3223a0d1325315 From ac9c5ad480d58292314f82e2fe3c9df2d27a98f3 Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Sat, 5 Sep 2026 17:13:52 -0500 Subject: [PATCH 15/63] Shop Messages - Reworked CreateShopMessages and Created CreateShopMessage() function to handle creating the text itself - Adjust Vanilla item placement for Shops to not use the BUY items - update Z3DR --- Z3DR | 2 +- source/hints.cpp | 159 +++++++++++++++++++++++++++++++-------- source/item.cpp | 2 +- source/item_location.cpp | 20 ++--- source/settings.cpp | 2 +- 5 files changed, 141 insertions(+), 44 deletions(-) diff --git a/Z3DR b/Z3DR index 93b19dc..08c7ee7 160000 --- a/Z3DR +++ b/Z3DR @@ -1 +1 @@ -Subproject commit 93b19dc131f17dbcf8407f0856f514638254bd40 +Subproject commit 08c7ee74c7bdb4cf8c1cee675f238e6f7b15b09c diff --git a/source/hints.cpp b/source/hints.cpp index 3305fd7..5fd0039 100644 --- a/source/hints.cpp +++ b/source/hints.cpp @@ -12,6 +12,7 @@ #include "custom_messages.hpp" //#include "trial.hpp" //#include "entrance.hpp" +#include "shops.hpp" //using namespace CustomMessages; using namespace Logic; @@ -486,8 +487,8 @@ void CreateTingleHintText() { } } -void CreateShopMessage(u16 messageID, ItemKey shopItem, u16 buyingPrice, bool isRepeatable) { - Text itemName = ItemTable(shopItem).GetName(); +static Text CreateShopMessage(u16 messageID, const ItemKey itemKey, const u16 price) { + Text itemName = ItemTable(itemKey).GetName(); Text shopIntro = Text{"#"}+itemName+Text{ "&>>" // itemName.NAenglish.length() <= 30 ? ": " : "&>>", @@ -498,13 +499,33 @@ void CreateShopMessage(u16 messageID, ItemKey shopItem, u16 buyingPrice, bool is // itemName.EURenglish.length() <= 30 ? ": " : "&>>", // itemName.EURfrench.length() <= 30 ? " : " : "&>>", // itemName.EURspanish.length() <= 30 ? ": " : "&>>", - }+std::to_string(buyingPrice)+Text{ + }+std::to_string(price)+Text{ " Rupees#&", " rubis#&", " rupias#&", " Rubine#&",// " rupie#&" }; Text shopDescription = {"oops"}; - if ((messageID < 0x06C9) || (messageID > 0x06D8)) { + if ((messageID >= 0x06C9) && (messageID <= 0x06D8)) { + // Trading post part-timer + if (ItemTable(itemKey).IsReusable()) { + shopDescription = { + /*English*/"Pretty sure we've got a bunch.&Oh and it's, like, a special deal.", + /*French */"On doit en avoir un tas dans le stock.&Ah oui, et c'est une offre spéciale.", + /*Spanish?*/"¡Oferta especial!&¡Compra todo lo que quieras!", + /*German ?*/"Sonderangebot!&Kauft so viel ihr wollt!", + // /*Italian?*/"Offerta speciale!&Compratene a volontà!", + }; + } else { + shopDescription = { + /*English*/"This one's a special deal, and uh,&I think we only have the one...", + /*French */"C't'un genre d'offre spéciale, ouais.&Et j'crois qu'c'est tout ce qu'on a...", + /*Spanish?*/"¡Oferta especial! ¡SOLO QUEDA UNA UNIDAD!&¡Hazte con ella antes de que se agote!", + /*German ?*/"Sonderangebot! NUR EINS AUF LAGER!&Schlagt zu solange ihr noch könnt!", + // /*Italian?*/"Offerta speciale! ULTIMO PEZZO!&Affrettatevi ad aquistarlo!", + }; + } + } + else { // Regular shop - if (isRepeatable) { + if (ItemTable(itemKey).IsReusable()) { shopDescription = { /*NaEnglish*/"Special deal!&Buy as many as you want!", /*NaFrench */"Offre spéciale!&Achetez-en à volonté!", @@ -527,33 +548,11 @@ void CreateShopMessage(u16 messageID, ItemKey shopItem, u16 buyingPrice, bool is /*EuSpanish*/"", }; } - } else { - // Trading post part-timer - if (isRepeatable) { - shopDescription = { - /*English*/"Pretty sure we've got a bunch.&Oh and it's, like, a special deal.", - /*French */"On doit en avoir un tas dans le stock.&Ah oui, et c'est une offre spéciale.", - /*Spanish?*/"¡Oferta especial!&¡Compra todo lo que quieras!", - /*German ?*/"Sonderangebot!&Kauft so viel ihr wollt!", - // /*Italian?*/"Offerta speciale!&Compratene a volontà!", - }; - } else { - shopDescription = { - /*English*/"This one's a special deal, and uh,&I think we only have the one...", - /*French */"C't'un genre d'offre spéciale, ouais.&Et j'crois qu'c'est tout ce qu'on a...", - /*Spanish?*/"¡Oferta especial! ¡SOLO QUEDA UNA UNIDAD!&¡Hazte con ella antes de que se agote!", - /*German ?*/"Sonderangebot! NUR EINS AUF LAGER!&Schlagt zu solange ihr noch könnt!", - // /*Italian?*/"Offerta speciale! ULTIMO PEZZO!&Affrettatevi ad aquistarlo!", - }; - } } - - CustomMessages::CreateMessageFromTextObject(messageID, 0xFFFF, (0x3FFFFC00 | buyingPrice), 0xFF0301, - shopIntro+shopDescription, {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); - // Handle blue potion variant for mushroomless hag + //Special message for the potion shop witch if you haven't given her a mushroom yet // WILL OVERFLOW IN MOST LANGUAGES WHEN ITEM NAME TRIGGERS LINE BREAK if (messageID == 0x0843) { - CustomMessages::CreateMessageFromTextObject(0x0880, 0xFFFF, (0x3FFFFC00 | buyingPrice), 0xFF0301, + CustomMessages::CreateMessageFromTextObject(0x0880, 0xFFFF, (0x3FFFFC00 | price), 0xFF0301, shopIntro+Text{ /*NaEnglish*/"Actually, I can't get the ingredients&for this, so I'm sold out. Sorry.", /*NaFrench */"En fait, je n'arrive pas à trouver&les ingrédients pour ça, alors je&n'en ai plus. Désolée.", @@ -565,8 +564,8 @@ void CreateShopMessage(u16 messageID, ItemKey shopItem, u16 buyingPrice, bool is /*EuSpanish*/"En realidad, no puedo conseguir&los ingredientes para esto, así que&no me queda más. Lo siento.", }, {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); } - - CustomMessages::CreateMessageFromTextObject(messageID + 1, 0xFFFF, (0x3FFFFC00 | buyingPrice), 0xFF1301, + //Create the message for the shopkeeper asking if you want to buy the item or not (MessageID + 1) + CustomMessages::CreateMessageFromTextObject(messageID + 1, 0xFFFF, (0x3FFFFC00 | price), 0xFF1301, shopIntro+">2"+Text{ /*English*/"#Buy&Don't Buy#", /*French */"#J'achète&J'achète pas#", @@ -574,8 +573,106 @@ void CreateShopMessage(u16 messageID, ItemKey shopItem, u16 buyingPrice, bool is /*German */"#Kaufen!&Nicht kaufen!#", // /*Italian*/"#Compra&Non comprare#", }, {QM_WHITE, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); + Text ShopMessage = shopIntro + shopDescription; + return ShopMessage; } +void CreateShopMessages() { + //Get the Items that are in the slots (for use if item is an ice trap) + ItemKey TPItem1 = Location(TRADING_POST_ITEM_1)->GetPlacedItemKey(); + ItemKey TPItem2 = Location(TRADING_POST_ITEM_2)->GetPlacedItemKey(); + ItemKey TPItem3 = Location(TRADING_POST_ITEM_3)->GetPlacedItemKey(); + ItemKey TPItem4 = Location(TRADING_POST_ITEM_4)->GetPlacedItemKey(); + ItemKey TPItem5 = Location(TRADING_POST_ITEM_5)->GetPlacedItemKey(); + ItemKey TPItem6 = Location(TRADING_POST_ITEM_6)->GetPlacedItemKey(); + ItemKey TPItem7 = Location(TRADING_POST_ITEM_7)->GetPlacedItemKey(); + ItemKey TPItem8 = Location(TRADING_POST_ITEM_8)->GetPlacedItemKey(); + ItemKey BSItem1 = Location(BOMB_SHOP_ITEM_1)->GetPlacedItemKey(); + ItemKey BSItem2 = Location(BOMB_SHOP_ITEM_2)->GetPlacedItemKey(); + ItemKey BSItem3 = Location(W_CLOCK_TOWN_BOMB_BAG_BUY)->GetPlacedItemKey(); + ItemKey BSItem4 = Location(W_CLOCK_TOWN_BIG_BOMB_BAG_BUY)->GetPlacedItemKey(); + ItemKey PSItem1 = Location(POTION_SHOP_ITEM_1)->GetPlacedItemKey(); + ItemKey PSItem2 = Location(POTION_SHOP_ITEM_2)->GetPlacedItemKey(); + ItemKey PSItem3 = Location(POTION_SHOP_ITEM_3)->GetPlacedItemKey(); + ItemKey GSItem1 = Location(GORON_SHOP_ITEM_1)->GetPlacedItemKey(); + ItemKey GSItem2 = Location(GORON_SHOP_ITEM_2)->GetPlacedItemKey(); + ItemKey GSItem3 = Location(GORON_SHOP_ITEM_3)->GetPlacedItemKey(); + ItemKey ZSItem1 = Location(ZORA_SHOP_ITEM_1)->GetPlacedItemKey(); + ItemKey ZSItem2 = Location(ZORA_SHOP_ITEM_2)->GetPlacedItemKey(); + ItemKey ZSItem3 = Location(ZORA_SHOP_ITEM_3)->GetPlacedItemKey(); + + //Get the prices of the items in the slots + u16 TPPrice1 = Location(TRADING_POST_ITEM_1)->GetPrice(); + u16 TPPrice2 = Location(TRADING_POST_ITEM_2)->GetPrice(); + u16 TPPrice3 = Location(TRADING_POST_ITEM_3)->GetPrice(); + u16 TPPrice4 = Location(TRADING_POST_ITEM_4)->GetPrice(); + u16 TPPrice5 = Location(TRADING_POST_ITEM_5)->GetPrice(); + u16 TPPrice6 = Location(TRADING_POST_ITEM_6)->GetPrice(); + u16 TPPrice7 = Location(TRADING_POST_ITEM_7)->GetPrice(); + u16 TPPrice8 = Location(TRADING_POST_ITEM_8)->GetPrice(); + u16 BSPrice1 = Location(BOMB_SHOP_ITEM_1)->GetPrice(); + u16 BSPrice2 = Location(BOMB_SHOP_ITEM_2)->GetPrice(); + u16 BSPrice3 = Location(W_CLOCK_TOWN_BOMB_BAG_BUY)->GetPrice(); + u16 BSPrice4 = Location(W_CLOCK_TOWN_BIG_BOMB_BAG_BUY)->GetPrice(); + u16 PSPrice1 = Location(POTION_SHOP_ITEM_1)->GetPrice(); + u16 PSPrice2 = Location(POTION_SHOP_ITEM_2)->GetPrice(); + u16 PSPrice3 = Location(POTION_SHOP_ITEM_3)->GetPrice(); + u16 GSPrice1 = Location(GORON_SHOP_ITEM_1)->GetPrice(); + u16 GSPrice2 = Location(GORON_SHOP_ITEM_2)->GetPrice(); + u16 GSPrice3 = Location(GORON_SHOP_ITEM_3)->GetPrice(); + u16 ZSPrice1 = Location(ZORA_SHOP_ITEM_1)->GetPrice(); + u16 ZSPrice2 = Location(ZORA_SHOP_ITEM_2)->GetPrice(); + u16 ZSPrice3 = Location(ZORA_SHOP_ITEM_3)->GetPrice(); + + //Create Messages for Shops + //Trading Post + CustomMessages::CreateMessageFromTextObject(0x06AC, 0xFFFF, (0x3FFFFC00 | TPPrice1), 0xFF1301, CreateShopMessage(0x06AC, TPItem1, TPPrice1), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + CustomMessages::CreateMessageFromTextObject(0x06AE, 0xFFFF, (0x3FFFFC00 | TPPrice2), 0xFF1301, CreateShopMessage(0x06AE, TPItem2, TPPrice2), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + CustomMessages::CreateMessageFromTextObject(0x06B0, 0xFFFF, (0x3FFFFC00 | TPPrice3), 0xFF1301, CreateShopMessage(0x06B0, TPItem3, TPPrice3), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + CustomMessages::CreateMessageFromTextObject(0x06B2, 0xFFFF, (0x3FFFFC00 | TPPrice4), 0xFF1301, CreateShopMessage(0x06B2, TPItem4, TPPrice4), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + CustomMessages::CreateMessageFromTextObject(0x06B4, 0xFFFF, (0x3FFFFC00 | TPPrice5), 0xFF1301, CreateShopMessage(0x06B4, TPItem5, TPPrice5), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + CustomMessages::CreateMessageFromTextObject(0x06B6, 0xFFFF, (0x3FFFFC00 | TPPrice6), 0xFF1301, CreateShopMessage(0x06B6, TPItem6, TPPrice6), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + CustomMessages::CreateMessageFromTextObject(0x06B8, 0xFFFF, (0x3FFFFC00 | TPPrice7), 0xFF1301, CreateShopMessage(0x06B8, TPItem7, TPPrice7), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + CustomMessages::CreateMessageFromTextObject(0x06BA, 0xFFFF, (0x3FFFFC00 | TPPrice8), 0xFF1301, CreateShopMessage(0x06BA, TPItem8, TPPrice8), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + //Trading Post (Part-timer) + CustomMessages::CreateMessageFromTextObject(0x06C9, 0xFFFF, (0x3FFFFC00 | TPPrice1), 0xFF1301, CreateShopMessage(0x06C9, TPItem1, TPPrice1), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + CustomMessages::CreateMessageFromTextObject(0x06CB, 0xFFFF, (0x3FFFFC00 | TPPrice2), 0xFF1301, CreateShopMessage(0x06CB, TPItem2, TPPrice2), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + CustomMessages::CreateMessageFromTextObject(0x06CD, 0xFFFF, (0x3FFFFC00 | TPPrice3), 0xFF1301, CreateShopMessage(0x06CD, TPItem3, TPPrice3), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + CustomMessages::CreateMessageFromTextObject(0x06CF, 0xFFFF, (0x3FFFFC00 | TPPrice4), 0xFF1301, CreateShopMessage(0x06CF, TPItem4, TPPrice4), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + CustomMessages::CreateMessageFromTextObject(0x06D1, 0xFFFF, (0x3FFFFC00 | TPPrice5), 0xFF1301, CreateShopMessage(0x06D1, TPItem5, TPPrice5), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + CustomMessages::CreateMessageFromTextObject(0x06D3, 0xFFFF, (0x3FFFFC00 | TPPrice6), 0xFF1301, CreateShopMessage(0x06D3, TPItem6, TPPrice6), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + CustomMessages::CreateMessageFromTextObject(0x06D5, 0xFFFF, (0x3FFFFC00 | TPPrice7), 0xFF1301, CreateShopMessage(0x06D5, TPItem7, TPPrice7), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + CustomMessages::CreateMessageFromTextObject(0x06D7, 0xFFFF, (0x3FFFFC00 | TPPrice8), 0xFF1301, CreateShopMessage(0x06D7, TPItem8, TPPrice8), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + //Bomb Shop + CustomMessages::CreateMessageFromTextObject(0x0650, 0xFFFF, (0x3FFFFC00 | BSPrice1), 0xFF1301, CreateShopMessage(0x0650, BSItem1, BSPrice1), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + CustomMessages::CreateMessageFromTextObject(0x0652, 0xFFFF, (0x3FFFFC00 | BSPrice2), 0xFF1301, CreateShopMessage(0x0652, BSItem2, BSPrice2), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + CustomMessages::CreateMessageFromTextObject(0x0654, 0xFFFF, (0x3FFFFC00 | BSPrice3), 0xFF1301, CreateShopMessage(0x0654, BSItem3, BSPrice3), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + CustomMessages::CreateMessageFromTextObject(0x0656, 0xFFFF, (0x3FFFFC00 | BSPrice4), 0xFF1301, CreateShopMessage(0x0656, BSItem4, BSPrice4), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + //Potion Shop + CustomMessages::CreateMessageFromTextObject(0x083F, 0xFFFF, (0x3FFFFC00 | PSPrice1), 0xFF1301, CreateShopMessage(0x083F, PSItem1, PSPrice1), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + CustomMessages::CreateMessageFromTextObject(0x0841, 0xFFFF, (0x3FFFFC00 | PSPrice2), 0xFF1301, CreateShopMessage(0x0841, PSItem2, PSPrice2), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + CustomMessages::CreateMessageFromTextObject(0x0843, 0xFFFF, (0x3FFFFC00 | PSPrice3), 0xFF1301, CreateShopMessage(0x0843, PSItem3, PSPrice3), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + //Goron Shop + CustomMessages::CreateMessageFromTextObject(0x0BC5, 0xFFFF, (0x3FFFFC00 | GSPrice1), 0xFF1301, CreateShopMessage(0x0BC5, GSItem1, GSPrice1), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + CustomMessages::CreateMessageFromTextObject(0x0BC7, 0xFFFF, (0x3FFFFC00 | GSPrice2), 0xFF1301, CreateShopMessage(0x0BC7, GSItem2, GSPrice2), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + CustomMessages::CreateMessageFromTextObject(0x0BC9, 0xFFFF, (0x3FFFFC00 | GSPrice3), 0xFF1301, CreateShopMessage(0x0BC9, GSItem3, GSPrice3), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + //Goron Shop (Spring Prices) + CustomMessages::CreateMessageFromTextObject(0x0BCB, 0xFFFF, (0x3FFFFC00 | GSPrice1), 0xFF1301, CreateShopMessage(0x0BCB, GSItem1, GSPrice1), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + CustomMessages::CreateMessageFromTextObject(0x0BCD, 0xFFFF, (0x3FFFFC00 | GSPrice2), 0xFF1301, CreateShopMessage(0x0BCD, GSItem2, GSPrice2), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + CustomMessages::CreateMessageFromTextObject(0x0BCF, 0xFFFF, (0x3FFFFC00 | GSPrice3), 0xFF1301, CreateShopMessage(0x0BCF, GSItem3, GSPrice3), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + //Zora Shop + CustomMessages::CreateMessageFromTextObject(0x12DB, 0xFFFF, (0x3FFFFC00 | ZSPrice1), 0xFF1301, CreateShopMessage(0x12DB, ZSItem1, ZSPrice1), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + CustomMessages::CreateMessageFromTextObject(0x12DD, 0xFFFF, (0x3FFFFC00 | ZSPrice2), 0xFF1301, CreateShopMessage(0x12DD, ZSItem2, ZSPrice2), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + CustomMessages::CreateMessageFromTextObject(0x12DF, 0xFFFF, (0x3FFFFC00 | ZSPrice3), 0xFF1301, CreateShopMessage(0x12DF, ZSItem3, ZSPrice3), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + // Curiosity Shop + // 0x29D9, 0x29DB, + // Curiosity Shop (Takkuri) + // 0x29F2, 0x29F4, 0x29F6, 0x29F8, +}; + + // CustomMessages::CreateMessageFromTextObject(messageID, 0xFFFF, (0x3FFFFC00 | buyingPrice), 0xFF0301, + // shopIntro+shopDescription, {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + void CreateOtherHints() { // Create other hints for various texts diff --git a/source/item.cpp b/source/item.cpp index 4218504..40882fe 100644 --- a/source/item.cpp +++ b/source/item.cpp @@ -67,7 +67,7 @@ ItemOverride_Value Item::Value() const { //if (!Settings::ColoredBossKeys && (getItemId >= 0x95 && getItemId <= 0x9A)) { //Boss keys // val.looksLikeItemId = (u32)GetItemID::GI_KEY_BOSS; //} - //if (!Settings::ColoredKeys && (getItemId >= 0xAF && getItemId <= 0xB7)) { //Small keys + //if (!Settings::ColoredKeys && (getItemId == 0x76 || getItemId == 0x77 || getItemId == 0x90 || getItemId == 0xA2)) { //Small keys // val.looksLikeItemId = (u32)GetItemID::GI_KEY_SMALL; //} if (type == ITEMTYPE_SHOP) { diff --git a/source/item_location.cpp b/source/item_location.cpp index cc78903..2ba900c 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -555,19 +555,19 @@ void LocationTable_Init() { 3 4 7 8 1 2 3 ------------------------------- -----------------------*/ - locationTable[TRADING_POST_ITEM_1] = ItemLocation::Base (0x34,0x01, true, "Trading Post Item 1", TRADING_POST_ITEM_1, BUY_RED_POTION, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_2] = ItemLocation::Base (0x34,0x02, true, "Trading Post Item 2", TRADING_POST_ITEM_2, BUY_GREEN_POTION, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 1), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_3] = ItemLocation::Base (0x34,0x03, true, "Trading Post Item 3", TRADING_POST_ITEM_3, BUY_HEROS_SHIELD, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 2), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_4] = ItemLocation::Base (0x34,0x04, true, "Trading Post Item 4", TRADING_POST_ITEM_4, BUY_FAIRYS_SPIRIT, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 3), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_5] = ItemLocation::Base (0x34,0x05, true, "Trading Post Item 5", TRADING_POST_ITEM_5, BUY_DEKU_STICK_1, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 4), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_6] = ItemLocation::Base (0x34,0x06, true, "Trading Post Item 6", TRADING_POST_ITEM_6, BUY_ARROWS_30, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 5), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_7] = ItemLocation::Base (0x34,0x07, true, "Trading Post Item 7", TRADING_POST_ITEM_7, BUY_DEKU_NUT_10, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 6), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_8] = ItemLocation::Base (0x34,0x08, true, "Trading Post Item 8", TRADING_POST_ITEM_8, BUY_MAGIC_BEAN, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 7), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_1] = ItemLocation::Base (0x34,0x01, true, "Trading Post Item 1", TRADING_POST_ITEM_1, RED_POTION_REFILL, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_2] = ItemLocation::Base (0x34,0x02, true, "Trading Post Item 2", TRADING_POST_ITEM_2, GREEN_POTION_REFILL, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 1), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_3] = ItemLocation::Base (0x34,0x03, true, "Trading Post Item 3", TRADING_POST_ITEM_3, HEROS_SHIELD, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 2), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_4] = ItemLocation::Base (0x34,0x04, true, "Trading Post Item 4", TRADING_POST_ITEM_4, BOTTLE_WITH_FAIRY, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 3), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_5] = ItemLocation::Base (0x34,0x05, true, "Trading Post Item 5", TRADING_POST_ITEM_5, DEKU_STICK, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 4), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_6] = ItemLocation::Base (0x34,0x06, true, "Trading Post Item 6", TRADING_POST_ITEM_6, ARROWS_30, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 5), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_7] = ItemLocation::Base (0x34,0x07, true, "Trading Post Item 7", TRADING_POST_ITEM_7, DEKU_NUTS_10, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 6), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_8] = ItemLocation::Base (0x34,0x08, true, "Trading Post Item 8", TRADING_POST_ITEM_8, MAGIC_BEAN, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 7), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); locationTable[BOMB_SHOP_ITEM_1] = ItemLocation::Base (0x68,0x01, true, "Bomb Shop Item 1", BOMB_SHOP_ITEM_1, BOMBS_10, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x68, 0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); locationTable[BOMB_SHOP_ITEM_2] = ItemLocation::Base (0x68,0x02, true, "Bomb Shop Item 2", BOMB_SHOP_ITEM_2, BOMBCHU_10, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x68, 1), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[W_CLOCK_TOWN_BOMB_BAG_BUY] = ItemLocation::Base (0x68,0x03, false, "WCT Bomb Bag Purchase", W_CLOCK_TOWN_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG, {Category::cWestClockTown,Category::cDayOne, Category::cShop, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); - locationTable[W_CLOCK_TOWN_BIG_BOMB_BAG_BUY] = ItemLocation::Base (0x68,0x04, false, "WCT Big Bomb Bag Purchase", W_CLOCK_TOWN_BIG_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG, {Category::cWestClockTown,Category::cDayTwo, Category::cShop, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); + locationTable[W_CLOCK_TOWN_BOMB_BAG_BUY] = ItemLocation::Base (0x68,0x03, false, "WCT Bomb Bag Purchase", W_CLOCK_TOWN_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG, {Category::cWestClockTown,Category::cDayOne, Category::cShop, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x68, 2), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); + locationTable[W_CLOCK_TOWN_BIG_BOMB_BAG_BUY] = ItemLocation::Base (0x68,0x04, false, "WCT Big Bomb Bag Purchase", W_CLOCK_TOWN_BIG_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG, {Category::cWestClockTown,Category::cDayTwo, Category::cShop, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x68, 3), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); locationTable[POTION_SHOP_ITEM_1] = ItemLocation::Base (0x0A,0x01, true, "Potion Shop Item 1", POTION_SHOP_ITEM_1, BLUE_POTION_REFILL, {Category::cSouthernSwamp,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x0A, 0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP); locationTable[POTION_SHOP_ITEM_2] = ItemLocation::Base (0x0A,0x02, true, "Potion Shop Item 2", POTION_SHOP_ITEM_2, GREEN_POTION_REFILL, {Category::cSouthernSwamp,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x0A, 1), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP); diff --git a/source/settings.cpp b/source/settings.cpp index 3a5b0d8..e55e283 100644 --- a/source/settings.cpp +++ b/source/settings.cpp @@ -376,7 +376,7 @@ namespace Settings { Option ShuffleSoaring = Option::Bool("Shuffle Song of Soaring",{"Off", "On"}, {shuffleSoaringVanilla, shuffleSoaringRandom}, OptionCategory::Setting, 0); Option ShuffleSongOfTime = Option::Bool("Shuffle Song of Time", {"Off", "On"}, {songTimeVanilla, songTimeRandom}, OptionCategory::Setting, 0); Option Shopsanity = Option::Bool("Shopsanity", {"Off", "On"}, {shopsOff, shopsOn}, OptionCategory::Setting, 0); - Option ShopsanityPrices = Option::U8 ("Shopsanity Prices", {"Random", "Affordable"}, {shopPricesRandom, shopPricesAffordable}, OptionCategory::Setting, 0); + Option ShopsanityPrices = Option::Bool("Shopsanity Prices", {"Random", "Affordable"}, {shopPricesRandom, shopPricesAffordable}, OptionCategory::Setting, 0); Option Tokensanity = Option::Bool("Tokensanity", {"Off", "On"}, {tokensOff, tokensAllTokens}, OptionCategory::Setting, 0); Option Scrubsanity = Option::Bool("Shuffle Scrub Purchases",{"Off", "On"}, {scrubsOff, scrubsOn}, OptionCategory::Toggle, 0); Option ShuffleMerchants = Option::Bool("Shuffle Scrub Trades", {"Off", "On"}, {shuffleMerchantsDesc}); From 02d8042abecc98a8fa6aada7d4a857289666c6a2 Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Sat, 5 Sep 2026 17:39:21 -0500 Subject: [PATCH 16/63] Implement Shop Messages - Actually call the Shop Messages function so they're created --- source/include/hints.hpp | 3 ++- source/playthrough.cpp | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/source/include/hints.hpp b/source/include/hints.hpp index 193989b..fdda974 100644 --- a/source/include/hints.hpp +++ b/source/include/hints.hpp @@ -168,4 +168,5 @@ extern void CreateAllHints(); extern void CreateTingleHintText(); extern void CreateClockTowerDoorHints(); extern void CreateMoonChildHint(); -extern void CreateOtherHints(); \ No newline at end of file +extern void CreateOtherHints(); +extern void CreateShopMessages(); \ No newline at end of file diff --git a/source/playthrough.cpp b/source/playthrough.cpp index 0d20675..75fd2af 100644 --- a/source/playthrough.cpp +++ b/source/playthrough.cpp @@ -81,6 +81,9 @@ namespace Playthrough { CreateClockTowerDoorHints(); CreateMoonChildHint(); CreateOtherHints(); + if (Settings::Shopsanity.Value()) { + CreateShopMessages(); + } playthroughLocations.clear(); wothLocations.clear(); From b94f3f2199430027ae0f83c8e36fbcb49ef9fda0 Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Sat, 5 Sep 2026 17:58:36 -0500 Subject: [PATCH 17/63] Item Type Changes item location type for shop items to Shop and creates the appropriate type definitions --- source/include/item_location.hpp | 12 ++++++--- source/item_location.cpp | 42 ++++++++++++++++---------------- 2 files changed, 30 insertions(+), 24 deletions(-) diff --git a/source/include/item_location.hpp b/source/include/item_location.hpp index e8bae3b..b5ed9f8 100644 --- a/source/include/item_location.hpp +++ b/source/include/item_location.hpp @@ -37,7 +37,8 @@ enum class ItemLocationType { HintStone, OtherHint, Misc, - Cow + Cow, + Shop }; class SpoilerCollectionCheck { @@ -91,8 +92,8 @@ class SpoilerCollectionCheck { return SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_SCRUB, scene, bit); } - static auto ShopItem(u8 scene, u8 itemSlot) { - return SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_SHOP_ITEM, scene, itemSlot); + static auto Shop(u8 scene, u8 itemSlot) { + return SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_SHOP, scene, itemSlot); } static auto MagicBeans(u8 scene, u8 flag) { @@ -139,6 +140,7 @@ class ItemLocation { //TO-DO else if (type == ItemLocationType::StrayFairy) {key.type = ItemOverride_Type::OVR_STRAY_FAIRY;} else if (type == ItemLocationType::Cow) {key.type = ItemOverride_Type::OVR_COW;} + else if (type == ItemLocationType::Shop) {key.type = ItemOverride_Type::OVR_SHOP;} //else if (type == ItemLocationType::HintStone) {key.type = ItemOverride_Type::OVR_HINT;} //else if (type == ItemLocationType::OtherHint) {key.type = ItemOverride_Type::OVR_OTHER_HINT;} //key.type = type; //TODO make sure these match up @@ -406,6 +408,10 @@ class ItemLocation { return ItemLocation{ ItemLocationType::Cow, scene, flag, repeatable, std::move(name), hintKey, vanillaItem, std::move(categories), 0 , SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_COW,scene, flag), collectionCheckGroup}; } + static auto Shop(u8 scene, u8 flag, bool repeatable, std::string&& name, const HintKey hintKey, const ItemKey vanillaItem, std::vector&& categories, SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) { + return ItemLocation{ ItemLocationType::Shop, scene, flag, repeatable, std::move(name), hintKey, vanillaItem, std::move(categories), 0 , SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_SHOP,scene, flag), collectionCheckGroup}; + } + void ResetVariables() { checked = false; addedToPool = false; diff --git a/source/item_location.cpp b/source/item_location.cpp index 2ba900c..adfd32c 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -555,31 +555,31 @@ void LocationTable_Init() { 3 4 7 8 1 2 3 ------------------------------- -----------------------*/ - locationTable[TRADING_POST_ITEM_1] = ItemLocation::Base (0x34,0x01, true, "Trading Post Item 1", TRADING_POST_ITEM_1, RED_POTION_REFILL, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_2] = ItemLocation::Base (0x34,0x02, true, "Trading Post Item 2", TRADING_POST_ITEM_2, GREEN_POTION_REFILL, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 1), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_3] = ItemLocation::Base (0x34,0x03, true, "Trading Post Item 3", TRADING_POST_ITEM_3, HEROS_SHIELD, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 2), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_4] = ItemLocation::Base (0x34,0x04, true, "Trading Post Item 4", TRADING_POST_ITEM_4, BOTTLE_WITH_FAIRY, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 3), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_5] = ItemLocation::Base (0x34,0x05, true, "Trading Post Item 5", TRADING_POST_ITEM_5, DEKU_STICK, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 4), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_6] = ItemLocation::Base (0x34,0x06, true, "Trading Post Item 6", TRADING_POST_ITEM_6, ARROWS_30, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 5), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_7] = ItemLocation::Base (0x34,0x07, true, "Trading Post Item 7", TRADING_POST_ITEM_7, DEKU_NUTS_10, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 6), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_8] = ItemLocation::Base (0x34,0x08, true, "Trading Post Item 8", TRADING_POST_ITEM_8, MAGIC_BEAN, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x34, 7), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_1] = ItemLocation::Shop (0x34,0x01, true, "Trading Post Item 1", TRADING_POST_ITEM_1, RED_POTION_REFILL, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_2] = ItemLocation::Shop (0x34,0x02, true, "Trading Post Item 2", TRADING_POST_ITEM_2, GREEN_POTION_REFILL, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_3] = ItemLocation::Shop (0x34,0x03, true, "Trading Post Item 3", TRADING_POST_ITEM_3, HEROS_SHIELD, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_4] = ItemLocation::Shop (0x34,0x04, true, "Trading Post Item 4", TRADING_POST_ITEM_4, BOTTLE_WITH_FAIRY, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_5] = ItemLocation::Shop (0x34,0x05, true, "Trading Post Item 5", TRADING_POST_ITEM_5, DEKU_STICK, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_6] = ItemLocation::Shop (0x34,0x06, true, "Trading Post Item 6", TRADING_POST_ITEM_6, ARROWS_30, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_7] = ItemLocation::Shop (0x34,0x07, true, "Trading Post Item 7", TRADING_POST_ITEM_7, DEKU_NUTS_10, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_8] = ItemLocation::Shop (0x34,0x08, true, "Trading Post Item 8", TRADING_POST_ITEM_8, MAGIC_BEAN, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[BOMB_SHOP_ITEM_1] = ItemLocation::Base (0x68,0x01, true, "Bomb Shop Item 1", BOMB_SHOP_ITEM_1, BOMBS_10, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x68, 0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[BOMB_SHOP_ITEM_2] = ItemLocation::Base (0x68,0x02, true, "Bomb Shop Item 2", BOMB_SHOP_ITEM_2, BOMBCHU_10, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x68, 1), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[W_CLOCK_TOWN_BOMB_BAG_BUY] = ItemLocation::Base (0x68,0x03, false, "WCT Bomb Bag Purchase", W_CLOCK_TOWN_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG, {Category::cWestClockTown,Category::cDayOne, Category::cShop, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x68, 2), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); - locationTable[W_CLOCK_TOWN_BIG_BOMB_BAG_BUY] = ItemLocation::Base (0x68,0x04, false, "WCT Big Bomb Bag Purchase", W_CLOCK_TOWN_BIG_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG, {Category::cWestClockTown,Category::cDayTwo, Category::cShop, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x68, 3), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); + locationTable[BOMB_SHOP_ITEM_1] = ItemLocation::Shop (0x68,0x01, true, "Bomb Shop Item 1", BOMB_SHOP_ITEM_1, BOMBS_10, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[BOMB_SHOP_ITEM_2] = ItemLocation::Shop (0x68,0x02, true, "Bomb Shop Item 2", BOMB_SHOP_ITEM_2, BOMBCHU_10, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[W_CLOCK_TOWN_BOMB_BAG_BUY] = ItemLocation::Shop (0x68,0x03, false, "WCT Bomb Bag Purchase", W_CLOCK_TOWN_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG, {Category::cWestClockTown,Category::cDayOne, Category::cShop, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); + locationTable[W_CLOCK_TOWN_BIG_BOMB_BAG_BUY] = ItemLocation::Shop (0x68,0x04, false, "WCT Big Bomb Bag Purchase", W_CLOCK_TOWN_BIG_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG, {Category::cWestClockTown,Category::cDayTwo, Category::cShop, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); - locationTable[POTION_SHOP_ITEM_1] = ItemLocation::Base (0x0A,0x01, true, "Potion Shop Item 1", POTION_SHOP_ITEM_1, BLUE_POTION_REFILL, {Category::cSouthernSwamp,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x0A, 0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP); - locationTable[POTION_SHOP_ITEM_2] = ItemLocation::Base (0x0A,0x02, true, "Potion Shop Item 2", POTION_SHOP_ITEM_2, GREEN_POTION_REFILL, {Category::cSouthernSwamp,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x0A, 1), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP); - locationTable[POTION_SHOP_ITEM_3] = ItemLocation::Base (0x0A,0x03, true, "Potion Shop Item 3", POTION_SHOP_ITEM_3, RED_POTION_REFILL, {Category::cSouthernSwamp,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x0A, 2), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP); + locationTable[POTION_SHOP_ITEM_1] = ItemLocation::Shop (0x0A,0x01, true, "Potion Shop Item 1", POTION_SHOP_ITEM_1, BLUE_POTION_REFILL, {Category::cSouthernSwamp,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP); + locationTable[POTION_SHOP_ITEM_2] = ItemLocation::Shop (0x0A,0x02, true, "Potion Shop Item 2", POTION_SHOP_ITEM_2, GREEN_POTION_REFILL, {Category::cSouthernSwamp,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP); + locationTable[POTION_SHOP_ITEM_3] = ItemLocation::Shop (0x0A,0x03, true, "Potion Shop Item 3", POTION_SHOP_ITEM_3, RED_POTION_REFILL, {Category::cSouthernSwamp,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP); - locationTable[GORON_SHOP_ITEM_1] = ItemLocation::Base (0x3D,0x01, true, "Goron Shop Item 1", GORON_SHOP_ITEM_1, BOMBS_10, {Category::cGoronVillage,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x3D, 0), SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE); - locationTable[GORON_SHOP_ITEM_2] = ItemLocation::Base (0x3D,0x02, true, "Goron Shop Item 2", GORON_SHOP_ITEM_2, ARROWS_10, {Category::cGoronVillage,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x3D, 1), SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE); - locationTable[GORON_SHOP_ITEM_3] = ItemLocation::Base (0x3D,0x03, true, "Goron Shop Item 3", GORON_SHOP_ITEM_3, RED_POTION_REFILL, {Category::cGoronVillage,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ShopItem(0x3D, 2), SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE); + locationTable[GORON_SHOP_ITEM_1] = ItemLocation::Shop (0x3D,0x01, true, "Goron Shop Item 1", GORON_SHOP_ITEM_1, BOMBS_10, {Category::cGoronVillage,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE); + locationTable[GORON_SHOP_ITEM_2] = ItemLocation::Shop (0x3D,0x02, true, "Goron Shop Item 2", GORON_SHOP_ITEM_2, ARROWS_10, {Category::cGoronVillage,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE); + locationTable[GORON_SHOP_ITEM_3] = ItemLocation::Shop (0x3D,0x03, true, "Goron Shop Item 3", GORON_SHOP_ITEM_3, RED_POTION_REFILL, {Category::cGoronVillage,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE); - locationTable[ZORA_SHOP_ITEM_1] = ItemLocation::Base (0x4C,0x01, true, "Zora Shop Item 1", ZORA_SHOP_ITEM_1, HEROS_SHIELD, {Category::cZoraHall,Category::cShop,Category::cDayOne}, SpoilerCollectionCheck::ShopItem(0x4C, 0), SpoilerCollectionCheckGroup::GROUP_ZORA_HALL); - locationTable[ZORA_SHOP_ITEM_2] = ItemLocation::Base (0x4C,0x02, true, "Zora Shop Item 2", ZORA_SHOP_ITEM_2, ARROWS_10, {Category::cZoraHall,Category::cShop,Category::cDayOne}, SpoilerCollectionCheck::ShopItem(0x4C, 1), SpoilerCollectionCheckGroup::GROUP_ZORA_HALL); - locationTable[ZORA_SHOP_ITEM_3] = ItemLocation::Base (0x4C,0x03, true, "Zora Shop Item 3", ZORA_SHOP_ITEM_3, RED_POTION_REFILL, {Category::cZoraHall,Category::cShop,Category::cDayOne}, SpoilerCollectionCheck::ShopItem(0x4C, 2), SpoilerCollectionCheckGroup::GROUP_ZORA_HALL); + locationTable[ZORA_SHOP_ITEM_1] = ItemLocation::Shop (0x4C,0x01, true, "Zora Shop Item 1", ZORA_SHOP_ITEM_1, HEROS_SHIELD, {Category::cZoraHall,Category::cShop,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_ZORA_HALL); + locationTable[ZORA_SHOP_ITEM_2] = ItemLocation::Shop (0x4C,0x02, true, "Zora Shop Item 2", ZORA_SHOP_ITEM_2, ARROWS_10, {Category::cZoraHall,Category::cShop,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_ZORA_HALL); + locationTable[ZORA_SHOP_ITEM_3] = ItemLocation::Shop (0x4C,0x03, true, "Zora Shop Item 3", ZORA_SHOP_ITEM_3, RED_POTION_REFILL, {Category::cZoraHall,Category::cShop,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_ZORA_HALL); From dec19b7d5a28f56dcd4d59577a433f139e815009 Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Sat, 5 Sep 2026 18:39:26 -0500 Subject: [PATCH 18/63] Location Flags - First attempt at ordering shop items correctly - Update Z3DR --- Z3DR | 2 +- source/item_location.cpp | 40 ++++++++++++++++++++-------------------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/Z3DR b/Z3DR index 08c7ee7..cdadf82 160000 --- a/Z3DR +++ b/Z3DR @@ -1 +1 @@ -Subproject commit 08c7ee74c7bdb4cf8c1cee675f238e6f7b15b09c +Subproject commit cdadf82a5672424ccd0f97bcbb3eb09a1a6943e3 diff --git a/source/item_location.cpp b/source/item_location.cpp index adfd32c..7b5921a 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -555,31 +555,31 @@ void LocationTable_Init() { 3 4 7 8 1 2 3 ------------------------------- -----------------------*/ - locationTable[TRADING_POST_ITEM_1] = ItemLocation::Shop (0x34,0x01, true, "Trading Post Item 1", TRADING_POST_ITEM_1, RED_POTION_REFILL, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_2] = ItemLocation::Shop (0x34,0x02, true, "Trading Post Item 2", TRADING_POST_ITEM_2, GREEN_POTION_REFILL, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_3] = ItemLocation::Shop (0x34,0x03, true, "Trading Post Item 3", TRADING_POST_ITEM_3, HEROS_SHIELD, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_4] = ItemLocation::Shop (0x34,0x04, true, "Trading Post Item 4", TRADING_POST_ITEM_4, BOTTLE_WITH_FAIRY, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_5] = ItemLocation::Shop (0x34,0x05, true, "Trading Post Item 5", TRADING_POST_ITEM_5, DEKU_STICK, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_6] = ItemLocation::Shop (0x34,0x06, true, "Trading Post Item 6", TRADING_POST_ITEM_6, ARROWS_30, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_7] = ItemLocation::Shop (0x34,0x07, true, "Trading Post Item 7", TRADING_POST_ITEM_7, DEKU_NUTS_10, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_8] = ItemLocation::Shop (0x34,0x08, true, "Trading Post Item 8", TRADING_POST_ITEM_8, MAGIC_BEAN, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_1] = ItemLocation::Shop (0x34,0x09, true, "Trading Post Item 1", TRADING_POST_ITEM_1, RED_POTION_REFILL, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_2] = ItemLocation::Shop (0x34,0x07, true, "Trading Post Item 2", TRADING_POST_ITEM_2, GREEN_POTION_REFILL, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_3] = ItemLocation::Shop (0x34,0x0A, true, "Trading Post Item 3", TRADING_POST_ITEM_3, HEROS_SHIELD, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_4] = ItemLocation::Shop (0x34,0x08, true, "Trading Post Item 4", TRADING_POST_ITEM_4, BOTTLE_WITH_FAIRY, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_5] = ItemLocation::Shop (0x34,0x06, true, "Trading Post Item 5", TRADING_POST_ITEM_5, DEKU_STICK, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_6] = ItemLocation::Shop (0x34,0x04, true, "Trading Post Item 6", TRADING_POST_ITEM_6, ARROWS_30, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_7] = ItemLocation::Shop (0x34,0x05, true, "Trading Post Item 7", TRADING_POST_ITEM_7, DEKU_NUTS_10, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_8] = ItemLocation::Shop (0x34,0x03, true, "Trading Post Item 8", TRADING_POST_ITEM_8, MAGIC_BEAN, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[BOMB_SHOP_ITEM_1] = ItemLocation::Shop (0x68,0x01, true, "Bomb Shop Item 1", BOMB_SHOP_ITEM_1, BOMBS_10, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[BOMB_SHOP_ITEM_2] = ItemLocation::Shop (0x68,0x02, true, "Bomb Shop Item 2", BOMB_SHOP_ITEM_2, BOMBCHU_10, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[W_CLOCK_TOWN_BOMB_BAG_BUY] = ItemLocation::Shop (0x68,0x03, false, "WCT Bomb Bag Purchase", W_CLOCK_TOWN_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG, {Category::cWestClockTown,Category::cDayOne, Category::cShop, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); + locationTable[BOMB_SHOP_ITEM_1] = ItemLocation::Shop (0x68,0x17, true, "Bomb Shop Item 1", BOMB_SHOP_ITEM_1, BOMBS_10, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[BOMB_SHOP_ITEM_2] = ItemLocation::Shop (0x68,0x19, true, "Bomb Shop Item 2", BOMB_SHOP_ITEM_2, BOMBCHU_10, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[W_CLOCK_TOWN_BOMB_BAG_BUY] = ItemLocation::Shop (0x68,0x1A, false, "WCT Bomb Bag Purchase", W_CLOCK_TOWN_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG, {Category::cWestClockTown,Category::cDayOne, Category::cShop, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); locationTable[W_CLOCK_TOWN_BIG_BOMB_BAG_BUY] = ItemLocation::Shop (0x68,0x04, false, "WCT Big Bomb Bag Purchase", W_CLOCK_TOWN_BIG_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG, {Category::cWestClockTown,Category::cDayTwo, Category::cShop, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); - locationTable[POTION_SHOP_ITEM_1] = ItemLocation::Shop (0x0A,0x01, true, "Potion Shop Item 1", POTION_SHOP_ITEM_1, BLUE_POTION_REFILL, {Category::cSouthernSwamp,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP); - locationTable[POTION_SHOP_ITEM_2] = ItemLocation::Shop (0x0A,0x02, true, "Potion Shop Item 2", POTION_SHOP_ITEM_2, GREEN_POTION_REFILL, {Category::cSouthernSwamp,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP); - locationTable[POTION_SHOP_ITEM_3] = ItemLocation::Shop (0x0A,0x03, true, "Potion Shop Item 3", POTION_SHOP_ITEM_3, RED_POTION_REFILL, {Category::cSouthernSwamp,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP); + locationTable[POTION_SHOP_ITEM_1] = ItemLocation::Shop (0x0A,0x00, true, "Potion Shop Item 1", POTION_SHOP_ITEM_1, BLUE_POTION_REFILL, {Category::cSouthernSwamp,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP); + locationTable[POTION_SHOP_ITEM_2] = ItemLocation::Shop (0x0A,0x01, true, "Potion Shop Item 2", POTION_SHOP_ITEM_2, GREEN_POTION_REFILL, {Category::cSouthernSwamp,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP); + locationTable[POTION_SHOP_ITEM_3] = ItemLocation::Shop (0x0A,0x02, true, "Potion Shop Item 3", POTION_SHOP_ITEM_3, RED_POTION_REFILL, {Category::cSouthernSwamp,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP); - locationTable[GORON_SHOP_ITEM_1] = ItemLocation::Shop (0x3D,0x01, true, "Goron Shop Item 1", GORON_SHOP_ITEM_1, BOMBS_10, {Category::cGoronVillage,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE); - locationTable[GORON_SHOP_ITEM_2] = ItemLocation::Shop (0x3D,0x02, true, "Goron Shop Item 2", GORON_SHOP_ITEM_2, ARROWS_10, {Category::cGoronVillage,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE); - locationTable[GORON_SHOP_ITEM_3] = ItemLocation::Shop (0x3D,0x03, true, "Goron Shop Item 3", GORON_SHOP_ITEM_3, RED_POTION_REFILL, {Category::cGoronVillage,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE); + locationTable[GORON_SHOP_ITEM_1] = ItemLocation::Shop (0x3D,0x1E, true, "Goron Shop Item 1", GORON_SHOP_ITEM_1, BOMBS_10, {Category::cGoronVillage,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE); + locationTable[GORON_SHOP_ITEM_2] = ItemLocation::Shop (0x3D,0x1F, true, "Goron Shop Item 2", GORON_SHOP_ITEM_2, ARROWS_10, {Category::cGoronVillage,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE); + locationTable[GORON_SHOP_ITEM_3] = ItemLocation::Shop (0x3D,0x20, true, "Goron Shop Item 3", GORON_SHOP_ITEM_3, RED_POTION_REFILL, {Category::cGoronVillage,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE); - locationTable[ZORA_SHOP_ITEM_1] = ItemLocation::Shop (0x4C,0x01, true, "Zora Shop Item 1", ZORA_SHOP_ITEM_1, HEROS_SHIELD, {Category::cZoraHall,Category::cShop,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_ZORA_HALL); - locationTable[ZORA_SHOP_ITEM_2] = ItemLocation::Shop (0x4C,0x02, true, "Zora Shop Item 2", ZORA_SHOP_ITEM_2, ARROWS_10, {Category::cZoraHall,Category::cShop,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_ZORA_HALL); - locationTable[ZORA_SHOP_ITEM_3] = ItemLocation::Shop (0x4C,0x03, true, "Zora Shop Item 3", ZORA_SHOP_ITEM_3, RED_POTION_REFILL, {Category::cZoraHall,Category::cShop,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_ZORA_HALL); + locationTable[ZORA_SHOP_ITEM_1] = ItemLocation::Shop (0x4C,0x1B, true, "Zora Shop Item 1", ZORA_SHOP_ITEM_1, HEROS_SHIELD, {Category::cZoraHall,Category::cShop,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_ZORA_HALL); + locationTable[ZORA_SHOP_ITEM_2] = ItemLocation::Shop (0x4C,0x1C, true, "Zora Shop Item 2", ZORA_SHOP_ITEM_2, ARROWS_10, {Category::cZoraHall,Category::cShop,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_ZORA_HALL); + locationTable[ZORA_SHOP_ITEM_3] = ItemLocation::Shop (0x4C,0x1D, true, "Zora Shop Item 3", ZORA_SHOP_ITEM_3, RED_POTION_REFILL, {Category::cZoraHall,Category::cShop,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_ZORA_HALL); From a2a1fbe5017d870dcf0e3fcbcc45704184c9ae42 Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Sat, 5 Sep 2026 18:42:34 -0500 Subject: [PATCH 19/63] Update Z3dr ya know --- Z3DR | 2 +- source/item_location.cpp | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Z3DR b/Z3DR index cdadf82..5d0c9bb 160000 --- a/Z3DR +++ b/Z3DR @@ -1 +1 @@ -Subproject commit cdadf82a5672424ccd0f97bcbb3eb09a1a6943e3 +Subproject commit 5d0c9bb770a7b4a4375e60efc67fcbb8600a664f diff --git a/source/item_location.cpp b/source/item_location.cpp index 7b5921a..45ad1aa 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -555,14 +555,14 @@ void LocationTable_Init() { 3 4 7 8 1 2 3 ------------------------------- -----------------------*/ - locationTable[TRADING_POST_ITEM_1] = ItemLocation::Shop (0x34,0x09, true, "Trading Post Item 1", TRADING_POST_ITEM_1, RED_POTION_REFILL, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_2] = ItemLocation::Shop (0x34,0x07, true, "Trading Post Item 2", TRADING_POST_ITEM_2, GREEN_POTION_REFILL, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_3] = ItemLocation::Shop (0x34,0x0A, true, "Trading Post Item 3", TRADING_POST_ITEM_3, HEROS_SHIELD, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_4] = ItemLocation::Shop (0x34,0x08, true, "Trading Post Item 4", TRADING_POST_ITEM_4, BOTTLE_WITH_FAIRY, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_5] = ItemLocation::Shop (0x34,0x06, true, "Trading Post Item 5", TRADING_POST_ITEM_5, DEKU_STICK, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_6] = ItemLocation::Shop (0x34,0x04, true, "Trading Post Item 6", TRADING_POST_ITEM_6, ARROWS_30, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_7] = ItemLocation::Shop (0x34,0x05, true, "Trading Post Item 7", TRADING_POST_ITEM_7, DEKU_NUTS_10, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_8] = ItemLocation::Shop (0x34,0x03, true, "Trading Post Item 8", TRADING_POST_ITEM_8, MAGIC_BEAN, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_1] = ItemLocation::Shop (0x34,0x0A, true, "Trading Post Item 1", TRADING_POST_ITEM_1, RED_POTION_REFILL, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_2] = ItemLocation::Shop (0x34,0x05, true, "Trading Post Item 2", TRADING_POST_ITEM_2, GREEN_POTION_REFILL, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_3] = ItemLocation::Shop (0x34,0x06, true, "Trading Post Item 3", TRADING_POST_ITEM_3, HEROS_SHIELD, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_4] = ItemLocation::Shop (0x34,0x03, true, "Trading Post Item 4", TRADING_POST_ITEM_4, BOTTLE_WITH_FAIRY, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_5] = ItemLocation::Shop (0x34,0x07, true, "Trading Post Item 5", TRADING_POST_ITEM_5, DEKU_STICK, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_6] = ItemLocation::Shop (0x34,0x08, true, "Trading Post Item 6", TRADING_POST_ITEM_6, ARROWS_30, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_7] = ItemLocation::Shop (0x34,0x09, true, "Trading Post Item 7", TRADING_POST_ITEM_7, DEKU_NUTS_10, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_8] = ItemLocation::Shop (0x34,0x2B, true, "Trading Post Item 8", TRADING_POST_ITEM_8, MAGIC_BEAN, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); locationTable[BOMB_SHOP_ITEM_1] = ItemLocation::Shop (0x68,0x17, true, "Bomb Shop Item 1", BOMB_SHOP_ITEM_1, BOMBS_10, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); locationTable[BOMB_SHOP_ITEM_2] = ItemLocation::Shop (0x68,0x19, true, "Bomb Shop Item 2", BOMB_SHOP_ITEM_2, BOMBCHU_10, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); From cffd1d62b1dd7e4b8915bdc8cba42296958b5107 Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Sat, 5 Sep 2026 20:05:35 -0500 Subject: [PATCH 20/63] Update item_location.cpp Adjust Trading Post location values so items appear in the shop as they show in the spoiler log --- source/item_location.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/source/item_location.cpp b/source/item_location.cpp index 45ad1aa..f056bd0 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -555,14 +555,14 @@ void LocationTable_Init() { 3 4 7 8 1 2 3 ------------------------------- -----------------------*/ - locationTable[TRADING_POST_ITEM_1] = ItemLocation::Shop (0x34,0x0A, true, "Trading Post Item 1", TRADING_POST_ITEM_1, RED_POTION_REFILL, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_2] = ItemLocation::Shop (0x34,0x05, true, "Trading Post Item 2", TRADING_POST_ITEM_2, GREEN_POTION_REFILL, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_3] = ItemLocation::Shop (0x34,0x06, true, "Trading Post Item 3", TRADING_POST_ITEM_3, HEROS_SHIELD, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_4] = ItemLocation::Shop (0x34,0x03, true, "Trading Post Item 4", TRADING_POST_ITEM_4, BOTTLE_WITH_FAIRY, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_1] = ItemLocation::Shop (0x34,0x03, true, "Trading Post Item 1", TRADING_POST_ITEM_1, RED_POTION_REFILL, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_2] = ItemLocation::Shop (0x34,0xBA, true, "Trading Post Item 2", TRADING_POST_ITEM_2, GREEN_POTION_REFILL, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_3] = ItemLocation::Shop (0x34,0x05, true, "Trading Post Item 3", TRADING_POST_ITEM_3, HEROS_SHIELD, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_4] = ItemLocation::Shop (0x34,0x06, true, "Trading Post Item 4", TRADING_POST_ITEM_4, BOTTLE_WITH_FAIRY, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); locationTable[TRADING_POST_ITEM_5] = ItemLocation::Shop (0x34,0x07, true, "Trading Post Item 5", TRADING_POST_ITEM_5, DEKU_STICK, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); locationTable[TRADING_POST_ITEM_6] = ItemLocation::Shop (0x34,0x08, true, "Trading Post Item 6", TRADING_POST_ITEM_6, ARROWS_30, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); locationTable[TRADING_POST_ITEM_7] = ItemLocation::Shop (0x34,0x09, true, "Trading Post Item 7", TRADING_POST_ITEM_7, DEKU_NUTS_10, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_8] = ItemLocation::Shop (0x34,0x2B, true, "Trading Post Item 8", TRADING_POST_ITEM_8, MAGIC_BEAN, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_8] = ItemLocation::Shop (0x34,0x0A, true, "Trading Post Item 8", TRADING_POST_ITEM_8, MAGIC_BEAN, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); locationTable[BOMB_SHOP_ITEM_1] = ItemLocation::Shop (0x68,0x17, true, "Bomb Shop Item 1", BOMB_SHOP_ITEM_1, BOMBS_10, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); locationTable[BOMB_SHOP_ITEM_2] = ItemLocation::Shop (0x68,0x19, true, "Bomb Shop Item 2", BOMB_SHOP_ITEM_2, BOMBCHU_10, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); From 7db453aad379a66c87a72f152d935ef8090cd7c8 Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Sat, 5 Sep 2026 20:11:18 -0500 Subject: [PATCH 21/63] Update hints.cpp Adjust Message values for Trading Post items to match what they actually are --- source/hints.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/source/hints.cpp b/source/hints.cpp index 5fd0039..c950a2c 100644 --- a/source/hints.cpp +++ b/source/hints.cpp @@ -627,12 +627,12 @@ void CreateShopMessages() { //Create Messages for Shops //Trading Post CustomMessages::CreateMessageFromTextObject(0x06AC, 0xFFFF, (0x3FFFFC00 | TPPrice1), 0xFF1301, CreateShopMessage(0x06AC, TPItem1, TPPrice1), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); - CustomMessages::CreateMessageFromTextObject(0x06AE, 0xFFFF, (0x3FFFFC00 | TPPrice2), 0xFF1301, CreateShopMessage(0x06AE, TPItem2, TPPrice2), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); - CustomMessages::CreateMessageFromTextObject(0x06B0, 0xFFFF, (0x3FFFFC00 | TPPrice3), 0xFF1301, CreateShopMessage(0x06B0, TPItem3, TPPrice3), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); - CustomMessages::CreateMessageFromTextObject(0x06B2, 0xFFFF, (0x3FFFFC00 | TPPrice4), 0xFF1301, CreateShopMessage(0x06B2, TPItem4, TPPrice4), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + CustomMessages::CreateMessageFromTextObject(0x06B2, 0xFFFF, (0x3FFFFC00 | TPPrice2), 0xFF1301, CreateShopMessage(0x06B2, TPItem2, TPPrice2), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + CustomMessages::CreateMessageFromTextObject(0x06AE, 0xFFFF, (0x3FFFFC00 | TPPrice3), 0xFF1301, CreateShopMessage(0x06AE, TPItem3, TPPrice3), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + CustomMessages::CreateMessageFromTextObject(0x06B6, 0xFFFF, (0x3FFFFC00 | TPPrice4), 0xFF1301, CreateShopMessage(0x06B6, TPItem4, TPPrice4), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); CustomMessages::CreateMessageFromTextObject(0x06B4, 0xFFFF, (0x3FFFFC00 | TPPrice5), 0xFF1301, CreateShopMessage(0x06B4, TPItem5, TPPrice5), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); - CustomMessages::CreateMessageFromTextObject(0x06B6, 0xFFFF, (0x3FFFFC00 | TPPrice6), 0xFF1301, CreateShopMessage(0x06B6, TPItem6, TPPrice6), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); - CustomMessages::CreateMessageFromTextObject(0x06B8, 0xFFFF, (0x3FFFFC00 | TPPrice7), 0xFF1301, CreateShopMessage(0x06B8, TPItem7, TPPrice7), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + CustomMessages::CreateMessageFromTextObject(0x06B8, 0xFFFF, (0x3FFFFC00 | TPPrice6), 0xFF1301, CreateShopMessage(0x06B8, TPItem6, TPPrice6), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + CustomMessages::CreateMessageFromTextObject(0x06B0, 0xFFFF, (0x3FFFFC00 | TPPrice7), 0xFF1301, CreateShopMessage(0x06B0, TPItem7, TPPrice7), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); CustomMessages::CreateMessageFromTextObject(0x06BA, 0xFFFF, (0x3FFFFC00 | TPPrice8), 0xFF1301, CreateShopMessage(0x06BA, TPItem8, TPPrice8), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); //Trading Post (Part-timer) CustomMessages::CreateMessageFromTextObject(0x06C9, 0xFFFF, (0x3FFFFC00 | TPPrice1), 0xFF1301, CreateShopMessage(0x06C9, TPItem1, TPPrice1), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); From 73d4a346d9dc181d51154ea0e80a80285065aa7a Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Sat, 5 Sep 2026 20:17:20 -0500 Subject: [PATCH 22/63] Update item_location.cpp fix TP Item Slot 2 --- source/item_location.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/item_location.cpp b/source/item_location.cpp index f056bd0..54c8500 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -556,7 +556,7 @@ void LocationTable_Init() { ------------------------------- -----------------------*/ locationTable[TRADING_POST_ITEM_1] = ItemLocation::Shop (0x34,0x03, true, "Trading Post Item 1", TRADING_POST_ITEM_1, RED_POTION_REFILL, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_2] = ItemLocation::Shop (0x34,0xBA, true, "Trading Post Item 2", TRADING_POST_ITEM_2, GREEN_POTION_REFILL, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_2] = ItemLocation::Shop (0x34,0x04, true, "Trading Post Item 2", TRADING_POST_ITEM_2, GREEN_POTION_REFILL, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); locationTable[TRADING_POST_ITEM_3] = ItemLocation::Shop (0x34,0x05, true, "Trading Post Item 3", TRADING_POST_ITEM_3, HEROS_SHIELD, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); locationTable[TRADING_POST_ITEM_4] = ItemLocation::Shop (0x34,0x06, true, "Trading Post Item 4", TRADING_POST_ITEM_4, BOTTLE_WITH_FAIRY, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); locationTable[TRADING_POST_ITEM_5] = ItemLocation::Shop (0x34,0x07, true, "Trading Post Item 5", TRADING_POST_ITEM_5, DEKU_STICK, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); From 61d2d8d60e6d7718e3da6aa84a81c8860a66d396 Mon Sep 17 00:00:00 2001 From: pizza1398 <259104093+pizza1398@users.noreply.github.com> Date: Sun, 6 Sep 2026 12:06:38 +0200 Subject: [PATCH 23/63] Refactor CreateShopMessage(s) Reduce redundancy --- source/hints.cpp | 238 +++++++++++++++++++++-------------------------- 1 file changed, 108 insertions(+), 130 deletions(-) diff --git a/source/hints.cpp b/source/hints.cpp index c950a2c..725cd52 100644 --- a/source/hints.cpp +++ b/source/hints.cpp @@ -487,24 +487,62 @@ void CreateTingleHintText() { } } -static Text CreateShopMessage(u16 messageID, const ItemKey itemKey, const u16 price) { +static void CreateShopMessage(u16 messageID, const LocationKey locationKey) { + const u16 price = Location(locationKey)->GetPrice(); + const u16 itemKey = Location(locationKey)->GetPlacedItemKey(); Text itemName = ItemTable(itemKey).GetName(); Text shopIntro = Text{"#"}+itemName+Text{ - "&>>" - // itemName.NAenglish.length() <= 30 ? ": " : "&>>", - // itemName.NAfrench.length() <= 30 ? " : " : "&>>", - // itemName.NAspanish.length() <= 30 ? ": " : "&>>", - // itemName.EURgerman.length() <= 30 ? ": " : "&>>", - // // itemName.EURitalian.length() <= 30 ? ": " : "&>>", - // itemName.EURenglish.length() <= 30 ? ": " : "&>>", - // itemName.EURfrench.length() <= 30 ? " : " : "&>>", - // itemName.EURspanish.length() <= 30 ? ": " : "&>>", - }+std::to_string(price)+Text{ - " Rupees#&", " rubis#&", " rupias#&", " Rubine#&",// " rupie#&" - }; + "&>>" + // itemName.NAenglish.length() <= 30 ? ": " : "&>>", + // itemName.NAfrench.length() <= 30 ? " : " : "&>>", + // itemName.NAspanish.length() <= 30 ? ": " : "&>>", + // itemName.EURgerman.length() <= 30 ? ": " : "&>>", + // // itemName.EURitalian.length() <= 30 ? ": " : "&>>", + // itemName.EURenglish.length() <= 30 ? ": " : "&>>", + // itemName.EURfrench.length() <= 30 ? " : " : "&>>", + // itemName.EURspanish.length() <= 30 ? ": " : "&>>", + }+std::to_string(price)+Text{ + " Rupees#&", " rubis#&", " rupias#&", " Rubine#&",// " rupie#&" + }; Text shopDescription = {"oops"}; - if ((messageID >= 0x06C9) && (messageID <= 0x06D8)) { - // Trading post part-timer + Text buyPrompt = Text{">2"}+Text{ + /*English*/"#Buy&Don't Buy#", + /*French */"#J'achète&J'achète pas#", + /*Spanish*/"#Comprar&No comprar#", + /*German */"#Kaufen!&Nicht kaufen!#", + // /*Italian*/"#Compra&Non comprare#", + }; + + // Regular shop message + if (ItemTable(itemKey).IsReusable()) { + shopDescription = { + /*NaEnglish*/"Special deal!&Buy as many as you want!", + /*NaFrench */"Offre spéciale!&Achetez-en à volonté!", + /*NaSpanish*/"¡Oferta especial!&¡Compra todo lo que quieras!", + /*EuGerman */"Sonderangebot!&Kauft so viel ihr wollt!", + // /*EuItalian*/"Offerta speciale!&Compratene a volontà!", + /*EuEnglish*/"", + /*EuFrench */"Offre spéciale !&Achetez-en à volonté !", + /*EuSpanish*/"", + }; + } else { + shopDescription = { + /*NaEnglish*/"Special deal! ONE LEFT!&Get it while it lasts!", + /*NaFrench */"Offre spéciale! DERNIER EN STOCK!&Maintenant ou jamais!", + /*NaSpanish*/"¡Oferta especial! ¡SOLO QUEDA UNA UNIDAD!&¡Hazte con ella antes de que se agote!", + /*EuGerman */"Sonderangebot! NUR EINS AUF LAGER!&Schlagt zu solange ihr noch könnt!", + // /*EuItalian*/"Offerta speciale! ULTIMO PEZZO!&Affrettatevi ad aquistarlo!", + /*EuEnglish*/"", + /*EuFrench */"Offre spéciale ! DERNIER EN STOCK !&Maintenant ou jamais !", + /*EuSpanish*/"", + }; + } + // Create display and purchase messages + CustomMessages::CreateMessageFromTextObject(messageID , 0xFFFF, (0x3FFFFC00 | price), 0xFF0301, shopIntro + shopDescription, {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + CustomMessages::CreateMessageFromTextObject(messageID + 1, 0xFFFF, (0x3FFFFC00 | price), 0xFF1301, shopIntro + buyPrompt, {QM_WHITE, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); + + // If Trading Post message, also generate part-timer version + if ((0x06AC <= messageID) && (messageID <= 0x06BA)) { if (ItemTable(itemKey).IsReusable()) { shopDescription = { /*English*/"Pretty sure we've got a bunch.&Oh and it's, like, a special deal.", @@ -522,33 +560,18 @@ static Text CreateShopMessage(u16 messageID, const ItemKey itemKey, const u16 pr // /*Italian?*/"Offerta speciale! ULTIMO PEZZO!&Affrettatevi ad aquistarlo!", }; } + CustomMessages::CreateMessageFromTextObject(messageID + 0x1D, 0xFFFF, (0x3FFFFC00 | price), 0xFF0301, shopIntro + shopDescription, {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + CustomMessages::CreateMessageFromTextObject(messageID + 0x1E, 0xFFFF, (0x3FFFFC00 | price), 0xFF1301, shopIntro + buyPrompt, {QM_WHITE, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); } - else { - // Regular shop - if (ItemTable(itemKey).IsReusable()) { - shopDescription = { - /*NaEnglish*/"Special deal!&Buy as many as you want!", - /*NaFrench */"Offre spéciale!&Achetez-en à volonté!", - /*NaSpanish*/"¡Oferta especial!&¡Compra todo lo que quieras!", - /*EuGerman */"Sonderangebot!&Kauft so viel ihr wollt!", - // /*EuItalian*/"Offerta speciale!&Compratene a volontà!", - /*EuEnglish*/"", - /*EuFrench */"Offre spéciale !&Achetez-en à volonté !", - /*EuSpanish*/"", - }; - } else { - shopDescription = { - /*NaEnglish*/"Special deal! ONE LEFT!&Get it while it lasts!", - /*NaFrench */"Offre spéciale! DERNIER EN STOCK!&Maintenant ou jamais!", - /*NaSpanish*/"¡Oferta especial! ¡SOLO QUEDA UNA UNIDAD!&¡Hazte con ella antes de que se agote!", - /*EuGerman */"Sonderangebot! NUR EINS AUF LAGER!&Schlagt zu solange ihr noch könnt!", - // /*EuItalian*/"Offerta speciale! ULTIMO PEZZO!&Affrettatevi ad aquistarlo!", - /*EuEnglish*/"", - /*EuFrench */"Offre spéciale ! DERNIER EN STOCK !&Maintenant ou jamais !", - /*EuSpanish*/"", - }; - } + + // Stolen Big Bomb Bag stuff goes here? + + // If Goron Shop message, also generate spring copy + if ((0x0BC5 <= messageID) && (messageID <= 0x0BC9)) { + CustomMessages::CreateMessageFromTextObject(messageID + 0x6, 0xFFFF, (0x3FFFFC00 | price), 0xFF0301, shopIntro + shopDescription, {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + CustomMessages::CreateMessageFromTextObject(messageID + 0x7, 0xFFFF, (0x3FFFFC00 | price), 0xFF1301, shopIntro + buyPrompt, {QM_WHITE, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); } + //Special message for the potion shop witch if you haven't given her a mushroom yet // WILL OVERFLOW IN MOST LANGUAGES WHEN ITEM NAME TRIGGERS LINE BREAK if (messageID == 0x0843) { @@ -564,115 +587,70 @@ static Text CreateShopMessage(u16 messageID, const ItemKey itemKey, const u16 pr /*EuSpanish*/"En realidad, no puedo conseguir&los ingredientes para esto, así que&no me queda más. Lo siento.", }, {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); } - //Create the message for the shopkeeper asking if you want to buy the item or not (MessageID + 1) - CustomMessages::CreateMessageFromTextObject(messageID + 1, 0xFFFF, (0x3FFFFC00 | price), 0xFF1301, - shopIntro+">2"+Text{ - /*English*/"#Buy&Don't Buy#", - /*French */"#J'achète&J'achète pas#", - /*Spanish*/"#Comprar&No comprar#", - /*German */"#Kaufen!&Nicht kaufen!#", - // /*Italian*/"#Compra&Non comprare#", - }, {QM_WHITE, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); - Text ShopMessage = shopIntro + shopDescription; - return ShopMessage; } void CreateShopMessages() { //Get the Items that are in the slots (for use if item is an ice trap) - ItemKey TPItem1 = Location(TRADING_POST_ITEM_1)->GetPlacedItemKey(); - ItemKey TPItem2 = Location(TRADING_POST_ITEM_2)->GetPlacedItemKey(); - ItemKey TPItem3 = Location(TRADING_POST_ITEM_3)->GetPlacedItemKey(); - ItemKey TPItem4 = Location(TRADING_POST_ITEM_4)->GetPlacedItemKey(); - ItemKey TPItem5 = Location(TRADING_POST_ITEM_5)->GetPlacedItemKey(); - ItemKey TPItem6 = Location(TRADING_POST_ITEM_6)->GetPlacedItemKey(); - ItemKey TPItem7 = Location(TRADING_POST_ITEM_7)->GetPlacedItemKey(); - ItemKey TPItem8 = Location(TRADING_POST_ITEM_8)->GetPlacedItemKey(); - ItemKey BSItem1 = Location(BOMB_SHOP_ITEM_1)->GetPlacedItemKey(); - ItemKey BSItem2 = Location(BOMB_SHOP_ITEM_2)->GetPlacedItemKey(); - ItemKey BSItem3 = Location(W_CLOCK_TOWN_BOMB_BAG_BUY)->GetPlacedItemKey(); - ItemKey BSItem4 = Location(W_CLOCK_TOWN_BIG_BOMB_BAG_BUY)->GetPlacedItemKey(); - ItemKey PSItem1 = Location(POTION_SHOP_ITEM_1)->GetPlacedItemKey(); - ItemKey PSItem2 = Location(POTION_SHOP_ITEM_2)->GetPlacedItemKey(); - ItemKey PSItem3 = Location(POTION_SHOP_ITEM_3)->GetPlacedItemKey(); - ItemKey GSItem1 = Location(GORON_SHOP_ITEM_1)->GetPlacedItemKey(); - ItemKey GSItem2 = Location(GORON_SHOP_ITEM_2)->GetPlacedItemKey(); - ItemKey GSItem3 = Location(GORON_SHOP_ITEM_3)->GetPlacedItemKey(); - ItemKey ZSItem1 = Location(ZORA_SHOP_ITEM_1)->GetPlacedItemKey(); - ItemKey ZSItem2 = Location(ZORA_SHOP_ITEM_2)->GetPlacedItemKey(); - ItemKey ZSItem3 = Location(ZORA_SHOP_ITEM_3)->GetPlacedItemKey(); - - //Get the prices of the items in the slots - u16 TPPrice1 = Location(TRADING_POST_ITEM_1)->GetPrice(); - u16 TPPrice2 = Location(TRADING_POST_ITEM_2)->GetPrice(); - u16 TPPrice3 = Location(TRADING_POST_ITEM_3)->GetPrice(); - u16 TPPrice4 = Location(TRADING_POST_ITEM_4)->GetPrice(); - u16 TPPrice5 = Location(TRADING_POST_ITEM_5)->GetPrice(); - u16 TPPrice6 = Location(TRADING_POST_ITEM_6)->GetPrice(); - u16 TPPrice7 = Location(TRADING_POST_ITEM_7)->GetPrice(); - u16 TPPrice8 = Location(TRADING_POST_ITEM_8)->GetPrice(); - u16 BSPrice1 = Location(BOMB_SHOP_ITEM_1)->GetPrice(); - u16 BSPrice2 = Location(BOMB_SHOP_ITEM_2)->GetPrice(); - u16 BSPrice3 = Location(W_CLOCK_TOWN_BOMB_BAG_BUY)->GetPrice(); - u16 BSPrice4 = Location(W_CLOCK_TOWN_BIG_BOMB_BAG_BUY)->GetPrice(); - u16 PSPrice1 = Location(POTION_SHOP_ITEM_1)->GetPrice(); - u16 PSPrice2 = Location(POTION_SHOP_ITEM_2)->GetPrice(); - u16 PSPrice3 = Location(POTION_SHOP_ITEM_3)->GetPrice(); - u16 GSPrice1 = Location(GORON_SHOP_ITEM_1)->GetPrice(); - u16 GSPrice2 = Location(GORON_SHOP_ITEM_2)->GetPrice(); - u16 GSPrice3 = Location(GORON_SHOP_ITEM_3)->GetPrice(); - u16 ZSPrice1 = Location(ZORA_SHOP_ITEM_1)->GetPrice(); - u16 ZSPrice2 = Location(ZORA_SHOP_ITEM_2)->GetPrice(); - u16 ZSPrice3 = Location(ZORA_SHOP_ITEM_3)->GetPrice(); + // ItemKey TPItem1 = Location(TRADING_POST_ITEM_1)->GetPlacedItemKey(); + // ItemKey TPItem2 = Location(TRADING_POST_ITEM_2)->GetPlacedItemKey(); + // ItemKey TPItem3 = Location(TRADING_POST_ITEM_3)->GetPlacedItemKey(); + // ItemKey TPItem4 = Location(TRADING_POST_ITEM_4)->GetPlacedItemKey(); + // ItemKey TPItem5 = Location(TRADING_POST_ITEM_5)->GetPlacedItemKey(); + // ItemKey TPItem6 = Location(TRADING_POST_ITEM_6)->GetPlacedItemKey(); + // ItemKey TPItem7 = Location(TRADING_POST_ITEM_7)->GetPlacedItemKey(); + // ItemKey TPItem8 = Location(TRADING_POST_ITEM_8)->GetPlacedItemKey(); + // ItemKey BSItem1 = Location(BOMB_SHOP_ITEM_1)->GetPlacedItemKey(); + // ItemKey BSItem2 = Location(BOMB_SHOP_ITEM_2)->GetPlacedItemKey(); + // ItemKey BSItem3 = Location(W_CLOCK_TOWN_BOMB_BAG_BUY)->GetPlacedItemKey(); + // ItemKey BSItem4 = Location(W_CLOCK_TOWN_BIG_BOMB_BAG_BUY)->GetPlacedItemKey(); + // ItemKey PSItem1 = Location(POTION_SHOP_ITEM_1)->GetPlacedItemKey(); + // ItemKey PSItem2 = Location(POTION_SHOP_ITEM_2)->GetPlacedItemKey(); + // ItemKey PSItem3 = Location(POTION_SHOP_ITEM_3)->GetPlacedItemKey(); + // ItemKey GSItem1 = Location(GORON_SHOP_ITEM_1)->GetPlacedItemKey(); + // ItemKey GSItem2 = Location(GORON_SHOP_ITEM_2)->GetPlacedItemKey(); + // ItemKey GSItem3 = Location(GORON_SHOP_ITEM_3)->GetPlacedItemKey(); + // ItemKey ZSItem1 = Location(ZORA_SHOP_ITEM_1)->GetPlacedItemKey(); + // ItemKey ZSItem2 = Location(ZORA_SHOP_ITEM_2)->GetPlacedItemKey(); + // ItemKey ZSItem3 = Location(ZORA_SHOP_ITEM_3)->GetPlacedItemKey(); //Create Messages for Shops //Trading Post - CustomMessages::CreateMessageFromTextObject(0x06AC, 0xFFFF, (0x3FFFFC00 | TPPrice1), 0xFF1301, CreateShopMessage(0x06AC, TPItem1, TPPrice1), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); - CustomMessages::CreateMessageFromTextObject(0x06B2, 0xFFFF, (0x3FFFFC00 | TPPrice2), 0xFF1301, CreateShopMessage(0x06B2, TPItem2, TPPrice2), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); - CustomMessages::CreateMessageFromTextObject(0x06AE, 0xFFFF, (0x3FFFFC00 | TPPrice3), 0xFF1301, CreateShopMessage(0x06AE, TPItem3, TPPrice3), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); - CustomMessages::CreateMessageFromTextObject(0x06B6, 0xFFFF, (0x3FFFFC00 | TPPrice4), 0xFF1301, CreateShopMessage(0x06B6, TPItem4, TPPrice4), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); - CustomMessages::CreateMessageFromTextObject(0x06B4, 0xFFFF, (0x3FFFFC00 | TPPrice5), 0xFF1301, CreateShopMessage(0x06B4, TPItem5, TPPrice5), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); - CustomMessages::CreateMessageFromTextObject(0x06B8, 0xFFFF, (0x3FFFFC00 | TPPrice6), 0xFF1301, CreateShopMessage(0x06B8, TPItem6, TPPrice6), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); - CustomMessages::CreateMessageFromTextObject(0x06B0, 0xFFFF, (0x3FFFFC00 | TPPrice7), 0xFF1301, CreateShopMessage(0x06B0, TPItem7, TPPrice7), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); - CustomMessages::CreateMessageFromTextObject(0x06BA, 0xFFFF, (0x3FFFFC00 | TPPrice8), 0xFF1301, CreateShopMessage(0x06BA, TPItem8, TPPrice8), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + CreateShopMessage(0x06AC, TRADING_POST_ITEM_1); + CreateShopMessage(0x06B2, TRADING_POST_ITEM_2); + CreateShopMessage(0x06AE, TRADING_POST_ITEM_3); + CreateShopMessage(0x06B6, TRADING_POST_ITEM_4); + CreateShopMessage(0x06B4, TRADING_POST_ITEM_5); + CreateShopMessage(0x06B8, TRADING_POST_ITEM_6); + CreateShopMessage(0x06B0, TRADING_POST_ITEM_7); + CreateShopMessage(0x06BA, TRADING_POST_ITEM_8); //Trading Post (Part-timer) - CustomMessages::CreateMessageFromTextObject(0x06C9, 0xFFFF, (0x3FFFFC00 | TPPrice1), 0xFF1301, CreateShopMessage(0x06C9, TPItem1, TPPrice1), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); - CustomMessages::CreateMessageFromTextObject(0x06CB, 0xFFFF, (0x3FFFFC00 | TPPrice2), 0xFF1301, CreateShopMessage(0x06CB, TPItem2, TPPrice2), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); - CustomMessages::CreateMessageFromTextObject(0x06CD, 0xFFFF, (0x3FFFFC00 | TPPrice3), 0xFF1301, CreateShopMessage(0x06CD, TPItem3, TPPrice3), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); - CustomMessages::CreateMessageFromTextObject(0x06CF, 0xFFFF, (0x3FFFFC00 | TPPrice4), 0xFF1301, CreateShopMessage(0x06CF, TPItem4, TPPrice4), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); - CustomMessages::CreateMessageFromTextObject(0x06D1, 0xFFFF, (0x3FFFFC00 | TPPrice5), 0xFF1301, CreateShopMessage(0x06D1, TPItem5, TPPrice5), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); - CustomMessages::CreateMessageFromTextObject(0x06D3, 0xFFFF, (0x3FFFFC00 | TPPrice6), 0xFF1301, CreateShopMessage(0x06D3, TPItem6, TPPrice6), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); - CustomMessages::CreateMessageFromTextObject(0x06D5, 0xFFFF, (0x3FFFFC00 | TPPrice7), 0xFF1301, CreateShopMessage(0x06D5, TPItem7, TPPrice7), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); - CustomMessages::CreateMessageFromTextObject(0x06D7, 0xFFFF, (0x3FFFFC00 | TPPrice8), 0xFF1301, CreateShopMessage(0x06D7, TPItem8, TPPrice8), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + // 0x06C9, 0x06CB, 0x06CD, 0x06CF, + // 0x06D1, 0x06D3, 0x06D5, 0x06D7, //Bomb Shop - CustomMessages::CreateMessageFromTextObject(0x0650, 0xFFFF, (0x3FFFFC00 | BSPrice1), 0xFF1301, CreateShopMessage(0x0650, BSItem1, BSPrice1), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); - CustomMessages::CreateMessageFromTextObject(0x0652, 0xFFFF, (0x3FFFFC00 | BSPrice2), 0xFF1301, CreateShopMessage(0x0652, BSItem2, BSPrice2), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); - CustomMessages::CreateMessageFromTextObject(0x0654, 0xFFFF, (0x3FFFFC00 | BSPrice3), 0xFF1301, CreateShopMessage(0x0654, BSItem3, BSPrice3), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); - CustomMessages::CreateMessageFromTextObject(0x0656, 0xFFFF, (0x3FFFFC00 | BSPrice4), 0xFF1301, CreateShopMessage(0x0656, BSItem4, BSPrice4), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + CreateShopMessage(0x0650, BOMB_SHOP_ITEM_1); + CreateShopMessage(0x0652, BOMB_SHOP_ITEM_2); + CreateShopMessage(0x0654, W_CLOCK_TOWN_BOMB_BAG_BUY); + CreateShopMessage(0x0656, W_CLOCK_TOWN_BIG_BOMB_BAG_BUY); //Potion Shop - CustomMessages::CreateMessageFromTextObject(0x083F, 0xFFFF, (0x3FFFFC00 | PSPrice1), 0xFF1301, CreateShopMessage(0x083F, PSItem1, PSPrice1), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); - CustomMessages::CreateMessageFromTextObject(0x0841, 0xFFFF, (0x3FFFFC00 | PSPrice2), 0xFF1301, CreateShopMessage(0x0841, PSItem2, PSPrice2), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); - CustomMessages::CreateMessageFromTextObject(0x0843, 0xFFFF, (0x3FFFFC00 | PSPrice3), 0xFF1301, CreateShopMessage(0x0843, PSItem3, PSPrice3), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + CreateShopMessage(0x083F, POTION_SHOP_ITEM_1); + CreateShopMessage(0x0841, POTION_SHOP_ITEM_2); + CreateShopMessage(0x0843, POTION_SHOP_ITEM_3); //Goron Shop - CustomMessages::CreateMessageFromTextObject(0x0BC5, 0xFFFF, (0x3FFFFC00 | GSPrice1), 0xFF1301, CreateShopMessage(0x0BC5, GSItem1, GSPrice1), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); - CustomMessages::CreateMessageFromTextObject(0x0BC7, 0xFFFF, (0x3FFFFC00 | GSPrice2), 0xFF1301, CreateShopMessage(0x0BC7, GSItem2, GSPrice2), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); - CustomMessages::CreateMessageFromTextObject(0x0BC9, 0xFFFF, (0x3FFFFC00 | GSPrice3), 0xFF1301, CreateShopMessage(0x0BC9, GSItem3, GSPrice3), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + CreateShopMessage(0x0BC5, GORON_SHOP_ITEM_1); + CreateShopMessage(0x0BC7, GORON_SHOP_ITEM_2); + CreateShopMessage(0x0BC9, GORON_SHOP_ITEM_3); //Goron Shop (Spring Prices) - CustomMessages::CreateMessageFromTextObject(0x0BCB, 0xFFFF, (0x3FFFFC00 | GSPrice1), 0xFF1301, CreateShopMessage(0x0BCB, GSItem1, GSPrice1), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); - CustomMessages::CreateMessageFromTextObject(0x0BCD, 0xFFFF, (0x3FFFFC00 | GSPrice2), 0xFF1301, CreateShopMessage(0x0BCD, GSItem2, GSPrice2), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); - CustomMessages::CreateMessageFromTextObject(0x0BCF, 0xFFFF, (0x3FFFFC00 | GSPrice3), 0xFF1301, CreateShopMessage(0x0BCF, GSItem3, GSPrice3), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + // 0x0BCB, 0x0BCD, 0x0BCF //Zora Shop - CustomMessages::CreateMessageFromTextObject(0x12DB, 0xFFFF, (0x3FFFFC00 | ZSPrice1), 0xFF1301, CreateShopMessage(0x12DB, ZSItem1, ZSPrice1), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); - CustomMessages::CreateMessageFromTextObject(0x12DD, 0xFFFF, (0x3FFFFC00 | ZSPrice2), 0xFF1301, CreateShopMessage(0x12DD, ZSItem2, ZSPrice2), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); - CustomMessages::CreateMessageFromTextObject(0x12DF, 0xFFFF, (0x3FFFFC00 | ZSPrice3), 0xFF1301, CreateShopMessage(0x12DF, ZSItem3, ZSPrice3), {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + CreateShopMessage(0x12DB, ZORA_SHOP_ITEM_1); + CreateShopMessage(0x12DD, ZORA_SHOP_ITEM_2); + CreateShopMessage(0x12DF, ZORA_SHOP_ITEM_3); // Curiosity Shop // 0x29D9, 0x29DB, // Curiosity Shop (Takkuri) // 0x29F2, 0x29F4, 0x29F6, 0x29F8, }; - // CustomMessages::CreateMessageFromTextObject(messageID, 0xFFFF, (0x3FFFFC00 | buyingPrice), 0xFF0301, - // shopIntro+shopDescription, {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); - void CreateOtherHints() { // Create other hints for various texts From 8b7c93ffa2f75243c9a2c55151531557a4ff9828 Mon Sep 17 00:00:00 2001 From: pizza1398 <259104093+pizza1398@users.noreply.github.com> Date: Sun, 6 Sep 2026 16:48:09 +0200 Subject: [PATCH 24/63] Refactor CreateShopMessages again - Move contents of CreateShopMessage to for loop - Try to simplify said loop a bit --- source/hints.cpp | 229 ++++++++++++++++++++--------------------------- 1 file changed, 96 insertions(+), 133 deletions(-) diff --git a/source/hints.cpp b/source/hints.cpp index 725cd52..99b462a 100644 --- a/source/hints.cpp +++ b/source/hints.cpp @@ -487,24 +487,33 @@ void CreateTingleHintText() { } } -static void CreateShopMessage(u16 messageID, const LocationKey locationKey) { - const u16 price = Location(locationKey)->GetPrice(); - const u16 itemKey = Location(locationKey)->GetPlacedItemKey(); - Text itemName = ItemTable(itemKey).GetName(); - Text shopIntro = Text{"#"}+itemName+Text{ - "&>>" - // itemName.NAenglish.length() <= 30 ? ": " : "&>>", - // itemName.NAfrench.length() <= 30 ? " : " : "&>>", - // itemName.NAspanish.length() <= 30 ? ": " : "&>>", - // itemName.EURgerman.length() <= 30 ? ": " : "&>>", - // // itemName.EURitalian.length() <= 30 ? ": " : "&>>", - // itemName.EURenglish.length() <= 30 ? ": " : "&>>", - // itemName.EURfrench.length() <= 30 ? " : " : "&>>", - // itemName.EURspanish.length() <= 30 ? ": " : "&>>", - }+std::to_string(price)+Text{ - " Rupees#&", " rubis#&", " rupias#&", " Rubine#&",// " rupie#&" +void CreateShopMessages() { + //Create list of messages to create and their corresponding location + std::pair shopEntries[21] = { + //Trading Post + {0x06AC, TRADING_POST_ITEM_1}, {0x06B2, TRADING_POST_ITEM_2}, {0x06AE, TRADING_POST_ITEM_3}, {0x06B6, TRADING_POST_ITEM_4}, + {0x06B4, TRADING_POST_ITEM_5}, {0x06B8, TRADING_POST_ITEM_6}, {0x06B0, TRADING_POST_ITEM_7}, {0x06BA, TRADING_POST_ITEM_8}, + //Trading Post (Part-timer) + // {0x06C9, TRADING_POST_ITEM_1}, {0x06CF, TRADING_POST_ITEM_2}, {0x06CB, TRADING_POST_ITEM_3}, {0x06D3, TRADING_POST_ITEM_4}, + // {0x06D1, TRADING_POST_ITEM_5}, {0x06D5, TRADING_POST_ITEM_6}, {0x06CD, TRADING_POST_ITEM_7}, {0x06D7, TRADING_POST_ITEM_8}, + //Bomb Shop + {0x0650, BOMB_SHOP_ITEM_1}, {0x0652, BOMB_SHOP_ITEM_2}, {0x0654, W_CLOCK_TOWN_BOMB_BAG_BUY}, {0x0656, W_CLOCK_TOWN_BIG_BOMB_BAG_BUY}, + //Potion Shop + {0x083F, POTION_SHOP_ITEM_1}, {0x0841, POTION_SHOP_ITEM_2}, {0x0843, POTION_SHOP_ITEM_3}, + //Goron Shop + {0x0BC5, GORON_SHOP_ITEM_1}, {0x0BC7, GORON_SHOP_ITEM_2}, {0x0BC9, GORON_SHOP_ITEM_3}, + //Goron Shop (Spring Prices) + // {0x0BCB, GORON_SHOP_ITEM_1}, {0x0BCD, GORON_SHOP_ITEM_2}, {0x0BCF, GORON_SHOP_ITEM_3}, + //Zora Shop + {0x12DB, ZORA_SHOP_ITEM_1}, {0x12DD, ZORA_SHOP_ITEM_2}, {0x12DF, ZORA_SHOP_ITEM_3}, + // Curiosity Shop + // {0x29D9, W_CLOCK_TOWN_ALL_NIGHT_MASK_BUY}, {0x29DB, W_CLOCK_TOWN_CURIOSITY_BOMB_BAG}, + // Curiosity Shop (Takkuri) + // {0x29F2}, {0x29F4}, {0x29F6}, {0x29F8}, }; - Text shopDescription = {"oops"}; + + Text shopDescription = {""}; + Text slopDescription = {""}; Text buyPrompt = Text{">2"}+Text{ /*English*/"#Buy&Don't Buy#", /*French */"#J'achète&J'achète pas#", @@ -513,38 +522,39 @@ static void CreateShopMessage(u16 messageID, const LocationKey locationKey) { // /*Italian*/"#Compra&Non comprare#", }; - // Regular shop message - if (ItemTable(itemKey).IsReusable()) { - shopDescription = { - /*NaEnglish*/"Special deal!&Buy as many as you want!", - /*NaFrench */"Offre spéciale!&Achetez-en à volonté!", - /*NaSpanish*/"¡Oferta especial!&¡Compra todo lo que quieras!", - /*EuGerman */"Sonderangebot!&Kauft so viel ihr wollt!", - // /*EuItalian*/"Offerta speciale!&Compratene a volontà!", - /*EuEnglish*/"", - /*EuFrench */"Offre spéciale !&Achetez-en à volonté !", - /*EuSpanish*/"", - }; - } else { - shopDescription = { - /*NaEnglish*/"Special deal! ONE LEFT!&Get it while it lasts!", - /*NaFrench */"Offre spéciale! DERNIER EN STOCK!&Maintenant ou jamais!", - /*NaSpanish*/"¡Oferta especial! ¡SOLO QUEDA UNA UNIDAD!&¡Hazte con ella antes de que se agote!", - /*EuGerman */"Sonderangebot! NUR EINS AUF LAGER!&Schlagt zu solange ihr noch könnt!", - // /*EuItalian*/"Offerta speciale! ULTIMO PEZZO!&Affrettatevi ad aquistarlo!", - /*EuEnglish*/"", - /*EuFrench */"Offre spéciale ! DERNIER EN STOCK !&Maintenant ou jamais !", - /*EuSpanish*/"", + //Generate Shop Message for every shopEntry + + for (u8 i = 0; i < 21; i++) { + u32 messageID = shopEntries[i].first; + u16 price = Location(shopEntries[i].second)->GetPrice(); + ItemKey itemKey = Location(shopEntries[i].second)->GetPlacedItemKey(); + Text itemName = ItemTable(itemKey).GetName(); + Text shopIntro = Text{"#"}+itemName+Text{ + "&>>" + // itemName.NAenglish.length() <= 30 ? ": " : "&>>", + // itemName.NAfrench.length() <= 30 ? " : " : "&>>", + // itemName.NAspanish.length() <= 30 ? ": " : "&>>", + // itemName.EURgerman.length() <= 30 ? ": " : "&>>", + // // itemName.EURitalian.length() <= 30 ? ": " : "&>>", + // itemName.EURenglish.length() <= 30 ? ": " : "&>>", + // itemName.EURfrench.length() <= 30 ? " : " : "&>>", + // itemName.EURspanish.length() <= 30 ? ": " : "&>>", + }+std::to_string(price)+Text{ + " Rupees#&", " rubis#&", " rupias#&", " Rubine#&",// " rupie#&" }; - } - // Create display and purchase messages - CustomMessages::CreateMessageFromTextObject(messageID , 0xFFFF, (0x3FFFFC00 | price), 0xFF0301, shopIntro + shopDescription, {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); - CustomMessages::CreateMessageFromTextObject(messageID + 1, 0xFFFF, (0x3FFFFC00 | price), 0xFF1301, shopIntro + buyPrompt, {QM_WHITE, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); - - // If Trading Post message, also generate part-timer version - if ((0x06AC <= messageID) && (messageID <= 0x06BA)) { + // Descriptions when hovering over the item if (ItemTable(itemKey).IsReusable()) { shopDescription = { + /*NaEnglish*/"Special deal!&Buy as many as you want!", + /*NaFrench */"Offre spéciale!&Achetez-en à volonté!", + /*NaSpanish*/"¡Oferta especial!&¡Compra todo lo que quieras!", + /*EuGerman */"Sonderangebot!&Kauft so viel ihr wollt!", + // /*EuItalian*/"Offerta speciale!&Compratene a volontà!", + /*EuEnglish*/"", + /*EuFrench */"Offre spéciale !&Achetez-en à volonté !", + /*EuSpanish*/"", + }; + slopDescription = { /*English*/"Pretty sure we've got a bunch.&Oh and it's, like, a special deal.", /*French */"On doit en avoir un tas dans le stock.&Ah oui, et c'est une offre spéciale.", /*Spanish?*/"¡Oferta especial!&¡Compra todo lo que quieras!", @@ -553,6 +563,16 @@ static void CreateShopMessage(u16 messageID, const LocationKey locationKey) { }; } else { shopDescription = { + /*NaEnglish*/"Special deal! ONE LEFT!&Get it while it lasts!", + /*NaFrench */"Offre spéciale! DERNIER EN STOCK!&Maintenant ou jamais!", + /*NaSpanish*/"¡Oferta especial! ¡SOLO QUEDA UNA UNIDAD!&¡Hazte con ella antes de que se agote!", + /*EuGerman */"Sonderangebot! NUR EINS AUF LAGER!&Schlagt zu solange ihr noch könnt!", + // /*EuItalian*/"Offerta speciale! ULTIMO PEZZO!&Affrettatevi ad aquistarlo!", + /*EuEnglish*/"", + /*EuFrench */"Offre spéciale ! DERNIER EN STOCK !&Maintenant ou jamais !", + /*EuSpanish*/"", + }; + slopDescription = { /*English*/"This one's a special deal, and uh,&I think we only have the one...", /*French */"C't'un genre d'offre spéciale, ouais.&Et j'crois qu'c'est tout ce qu'on a...", /*Spanish?*/"¡Oferta especial! ¡SOLO QUEDA UNA UNIDAD!&¡Hazte con ella antes de que se agote!", @@ -560,95 +580,38 @@ static void CreateShopMessage(u16 messageID, const LocationKey locationKey) { // /*Italian?*/"Offerta speciale! ULTIMO PEZZO!&Affrettatevi ad aquistarlo!", }; } - CustomMessages::CreateMessageFromTextObject(messageID + 0x1D, 0xFFFF, (0x3FFFFC00 | price), 0xFF0301, shopIntro + shopDescription, {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); - CustomMessages::CreateMessageFromTextObject(messageID + 0x1E, 0xFFFF, (0x3FFFFC00 | price), 0xFF1301, shopIntro + buyPrompt, {QM_WHITE, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); - } - // Stolen Big Bomb Bag stuff goes here? - - // If Goron Shop message, also generate spring copy - if ((0x0BC5 <= messageID) && (messageID <= 0x0BC9)) { - CustomMessages::CreateMessageFromTextObject(messageID + 0x6, 0xFFFF, (0x3FFFFC00 | price), 0xFF0301, shopIntro + shopDescription, {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); - CustomMessages::CreateMessageFromTextObject(messageID + 0x7, 0xFFFF, (0x3FFFFC00 | price), 0xFF1301, shopIntro + buyPrompt, {QM_WHITE, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); - } - - //Special message for the potion shop witch if you haven't given her a mushroom yet - // WILL OVERFLOW IN MOST LANGUAGES WHEN ITEM NAME TRIGGERS LINE BREAK - if (messageID == 0x0843) { - CustomMessages::CreateMessageFromTextObject(0x0880, 0xFFFF, (0x3FFFFC00 | price), 0xFF0301, - shopIntro+Text{ - /*NaEnglish*/"Actually, I can't get the ingredients&for this, so I'm sold out. Sorry.", - /*NaFrench */"En fait, je n'arrive pas à trouver&les ingrédients pour ça, alors je&n'en ai plus. Désolée.", - /*NaSpanish*/"No puedo conseguir los&ingredientes, así que está&agotada. Lo siento.", - /*EuGerman */"Leider habe ich nicht die passenden&Zutaten auf Lager, daher ist dieser&Artikel gerade nicht lieferbar.", - // /*EuItalian*/"In realtà, questa pozione è esaurita&e non ho gli ingredienti per&prepararne altra. Mi spiace.", - /*EuEnglish*/"", - /*EuFrench */"", - /*EuSpanish*/"En realidad, no puedo conseguir&los ingredientes para esto, así que&no me queda más. Lo siento.", - }, {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + // Create display and purchase messages + CustomMessages::CreateMessageFromTextObject(messageID , 0xFFFF, (0x3FFFFC00 | price), 0xFF0301, shopIntro + shopDescription, {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + CustomMessages::CreateMessageFromTextObject(messageID + 1, 0xFFFF, (0x3FFFFC00 | price), 0xFF1301, shopIntro + buyPrompt, {QM_WHITE, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); + // If Trading Post message, also generate part-timer version + if ((0x06AC <= messageID) && (messageID <= 0x06BA)) { + CustomMessages::CreateMessageFromTextObject(messageID + 0x1D, 0xFFFF, (0x3FFFFC00 | price), 0xFF0301, shopIntro + slopDescription, {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + CustomMessages::CreateMessageFromTextObject(messageID + 0x1E, 0xFFFF, (0x3FFFFC00 | price), 0xFF1301, shopIntro + buyPrompt, {QM_WHITE, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); + } + // If Goron Shop message, also generate spring copy + if ((0x0BC5 <= messageID) && (messageID <= 0x0BC9)) { + CustomMessages::CreateMessageFromTextObject(messageID + 0x6, 0xFFFF, (0x3FFFFC00 | price), 0xFF0301, shopIntro + shopDescription, {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + CustomMessages::CreateMessageFromTextObject(messageID + 0x7, 0xFFFF, (0x3FFFFC00 | price), 0xFF1301, shopIntro + buyPrompt, {QM_WHITE, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); + } + // Stolen Big Bomb Bag stuff goes here?? + + //Special message for the potion shop witch if you haven't given her a mushroom yet + // WILL OVERFLOW IN MOST LANGUAGES WHEN ITEM NAME TRIGGERS LINE BREAK + if (messageID == 0x0843) { + CustomMessages::CreateMessageFromTextObject(0x0880, 0xFFFF, (0x3FFFFC00 | price), 0xFF0301, + shopIntro+Text{ + /*NaEnglish*/"Actually, I can't get the ingredients&for this, so I'm sold out. Sorry.", + /*NaFrench */"En fait, je n'arrive pas à trouver&les ingrédients pour ça, alors je&n'en ai plus. Désolée.", + /*NaSpanish*/"No puedo conseguir los&ingredientes, así que está&agotada. Lo siento.", + /*EuGerman */"Leider habe ich nicht die passenden&Zutaten auf Lager, daher ist dieser&Artikel gerade nicht lieferbar.", + // /*EuItalian*/"In realtà, questa pozione è esaurita&e non ho gli ingredienti per&prepararne altra. Mi spiace.", + /*EuEnglish*/"", + /*EuFrench */"", + /*EuSpanish*/"En realidad, no puedo conseguir&los ingredientes para esto, así que&no me queda más. Lo siento.", + }, {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + } } -} - -void CreateShopMessages() { - //Get the Items that are in the slots (for use if item is an ice trap) - // ItemKey TPItem1 = Location(TRADING_POST_ITEM_1)->GetPlacedItemKey(); - // ItemKey TPItem2 = Location(TRADING_POST_ITEM_2)->GetPlacedItemKey(); - // ItemKey TPItem3 = Location(TRADING_POST_ITEM_3)->GetPlacedItemKey(); - // ItemKey TPItem4 = Location(TRADING_POST_ITEM_4)->GetPlacedItemKey(); - // ItemKey TPItem5 = Location(TRADING_POST_ITEM_5)->GetPlacedItemKey(); - // ItemKey TPItem6 = Location(TRADING_POST_ITEM_6)->GetPlacedItemKey(); - // ItemKey TPItem7 = Location(TRADING_POST_ITEM_7)->GetPlacedItemKey(); - // ItemKey TPItem8 = Location(TRADING_POST_ITEM_8)->GetPlacedItemKey(); - // ItemKey BSItem1 = Location(BOMB_SHOP_ITEM_1)->GetPlacedItemKey(); - // ItemKey BSItem2 = Location(BOMB_SHOP_ITEM_2)->GetPlacedItemKey(); - // ItemKey BSItem3 = Location(W_CLOCK_TOWN_BOMB_BAG_BUY)->GetPlacedItemKey(); - // ItemKey BSItem4 = Location(W_CLOCK_TOWN_BIG_BOMB_BAG_BUY)->GetPlacedItemKey(); - // ItemKey PSItem1 = Location(POTION_SHOP_ITEM_1)->GetPlacedItemKey(); - // ItemKey PSItem2 = Location(POTION_SHOP_ITEM_2)->GetPlacedItemKey(); - // ItemKey PSItem3 = Location(POTION_SHOP_ITEM_3)->GetPlacedItemKey(); - // ItemKey GSItem1 = Location(GORON_SHOP_ITEM_1)->GetPlacedItemKey(); - // ItemKey GSItem2 = Location(GORON_SHOP_ITEM_2)->GetPlacedItemKey(); - // ItemKey GSItem3 = Location(GORON_SHOP_ITEM_3)->GetPlacedItemKey(); - // ItemKey ZSItem1 = Location(ZORA_SHOP_ITEM_1)->GetPlacedItemKey(); - // ItemKey ZSItem2 = Location(ZORA_SHOP_ITEM_2)->GetPlacedItemKey(); - // ItemKey ZSItem3 = Location(ZORA_SHOP_ITEM_3)->GetPlacedItemKey(); - - //Create Messages for Shops - //Trading Post - CreateShopMessage(0x06AC, TRADING_POST_ITEM_1); - CreateShopMessage(0x06B2, TRADING_POST_ITEM_2); - CreateShopMessage(0x06AE, TRADING_POST_ITEM_3); - CreateShopMessage(0x06B6, TRADING_POST_ITEM_4); - CreateShopMessage(0x06B4, TRADING_POST_ITEM_5); - CreateShopMessage(0x06B8, TRADING_POST_ITEM_6); - CreateShopMessage(0x06B0, TRADING_POST_ITEM_7); - CreateShopMessage(0x06BA, TRADING_POST_ITEM_8); - //Trading Post (Part-timer) - // 0x06C9, 0x06CB, 0x06CD, 0x06CF, - // 0x06D1, 0x06D3, 0x06D5, 0x06D7, - //Bomb Shop - CreateShopMessage(0x0650, BOMB_SHOP_ITEM_1); - CreateShopMessage(0x0652, BOMB_SHOP_ITEM_2); - CreateShopMessage(0x0654, W_CLOCK_TOWN_BOMB_BAG_BUY); - CreateShopMessage(0x0656, W_CLOCK_TOWN_BIG_BOMB_BAG_BUY); - //Potion Shop - CreateShopMessage(0x083F, POTION_SHOP_ITEM_1); - CreateShopMessage(0x0841, POTION_SHOP_ITEM_2); - CreateShopMessage(0x0843, POTION_SHOP_ITEM_3); - //Goron Shop - CreateShopMessage(0x0BC5, GORON_SHOP_ITEM_1); - CreateShopMessage(0x0BC7, GORON_SHOP_ITEM_2); - CreateShopMessage(0x0BC9, GORON_SHOP_ITEM_3); - //Goron Shop (Spring Prices) - // 0x0BCB, 0x0BCD, 0x0BCF - //Zora Shop - CreateShopMessage(0x12DB, ZORA_SHOP_ITEM_1); - CreateShopMessage(0x12DD, ZORA_SHOP_ITEM_2); - CreateShopMessage(0x12DF, ZORA_SHOP_ITEM_3); - // Curiosity Shop - // 0x29D9, 0x29DB, - // Curiosity Shop (Takkuri) - // 0x29F2, 0x29F4, 0x29F6, 0x29F8, }; void CreateOtherHints() { From ea31d18a90314bc2159a55c429d413c1255c2cc5 Mon Sep 17 00:00:00 2001 From: pizza1398 <259104093+pizza1398@users.noreply.github.com> Date: Sun, 6 Sep 2026 16:58:40 +0200 Subject: [PATCH 25/63] Try to use GetIceTrapName --- source/hints.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/hints.cpp b/source/hints.cpp index 99b462a..64581be 100644 --- a/source/hints.cpp +++ b/source/hints.cpp @@ -529,6 +529,9 @@ void CreateShopMessages() { u16 price = Location(shopEntries[i].second)->GetPrice(); ItemKey itemKey = Location(shopEntries[i].second)->GetPlacedItemKey(); Text itemName = ItemTable(itemKey).GetName(); + if (itemKey == ICE_TRAP) { + itemName = GetIceTrapName(itemKey.Value().looksLikeItemId); + } Text shopIntro = Text{"#"}+itemName+Text{ "&>>" // itemName.NAenglish.length() <= 30 ? ": " : "&>>", From 23bf59807bfd39016a35e461d08560ce42867707 Mon Sep 17 00:00:00 2001 From: Phlex <3514085+PhlexPlexico@users.noreply.github.com> Date: Sun, 6 Sep 2026 11:21:59 -0600 Subject: [PATCH 26/63] nit: Update magic bean description. nit: Update Z3DR. --- Z3DR | 2 +- source/setting_descriptions.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Z3DR b/Z3DR index 5d0c9bb..9402ce4 160000 --- a/Z3DR +++ b/Z3DR @@ -1 +1 @@ -Subproject commit 5d0c9bb770a7b4a4375e60efc67fcbb8600a664f +Subproject commit 9402ce4093baf76562310347d3e595d5a04a8e9d diff --git a/source/setting_descriptions.cpp b/source/setting_descriptions.cpp index 70c615a..e9220c1 100644 --- a/source/setting_descriptions.cpp +++ b/source/setting_descriptions.cpp @@ -211,8 +211,8 @@ string_view shuffleRewardsAnywhere = "Boss Remains can appear anywhere.\n"; | SHUFFLE MAGIC BEANS | // ------------------------------*/ // string_view magicBeansDesc = "**OPTION CURRENTLY WIP**\n" // - "Enabling this adds a pack of 10 beans to the item\n" - "pool and changes the Magic Bean Salesman to sell a" + "Enabling this adds a pack of 20 beans to the item\n" + "pool and changes the Magic Bean Salesman to sell a\n" "random item at a price of 60 rupees."; // /*------------------------------ // | SHUFFLE KOKIRI SWORD | // From 69b8547673f6214851155473d0f3fa180a53d19e Mon Sep 17 00:00:00 2001 From: Phlex <3514085+PhlexPlexico@users.noreply.github.com> Date: Sun, 6 Sep 2026 11:25:07 -0600 Subject: [PATCH 27/63] fix: Update flags to use actual actor params. --- source/item_location.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/source/item_location.cpp b/source/item_location.cpp index 54c8500..e9612f8 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -555,23 +555,23 @@ void LocationTable_Init() { 3 4 7 8 1 2 3 ------------------------------- -----------------------*/ - locationTable[TRADING_POST_ITEM_1] = ItemLocation::Shop (0x34,0x03, true, "Trading Post Item 1", TRADING_POST_ITEM_1, RED_POTION_REFILL, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_2] = ItemLocation::Shop (0x34,0x04, true, "Trading Post Item 2", TRADING_POST_ITEM_2, GREEN_POTION_REFILL, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_3] = ItemLocation::Shop (0x34,0x05, true, "Trading Post Item 3", TRADING_POST_ITEM_3, HEROS_SHIELD, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_4] = ItemLocation::Shop (0x34,0x06, true, "Trading Post Item 4", TRADING_POST_ITEM_4, BOTTLE_WITH_FAIRY, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_1] = ItemLocation::Shop (0x34,0x0A, true, "Trading Post Item 1", TRADING_POST_ITEM_1, RED_POTION_REFILL, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_2] = ItemLocation::Shop (0x34,0x05, true, "Trading Post Item 2", TRADING_POST_ITEM_2, GREEN_POTION_REFILL, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_3] = ItemLocation::Shop (0x34,0x06, true, "Trading Post Item 3", TRADING_POST_ITEM_3, HEROS_SHIELD, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_4] = ItemLocation::Shop (0x34,0x03, true, "Trading Post Item 4", TRADING_POST_ITEM_4, BOTTLE_WITH_FAIRY, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); locationTable[TRADING_POST_ITEM_5] = ItemLocation::Shop (0x34,0x07, true, "Trading Post Item 5", TRADING_POST_ITEM_5, DEKU_STICK, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); locationTable[TRADING_POST_ITEM_6] = ItemLocation::Shop (0x34,0x08, true, "Trading Post Item 6", TRADING_POST_ITEM_6, ARROWS_30, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); locationTable[TRADING_POST_ITEM_7] = ItemLocation::Shop (0x34,0x09, true, "Trading Post Item 7", TRADING_POST_ITEM_7, DEKU_NUTS_10, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[TRADING_POST_ITEM_8] = ItemLocation::Shop (0x34,0x0A, true, "Trading Post Item 8", TRADING_POST_ITEM_8, MAGIC_BEAN, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[TRADING_POST_ITEM_8] = ItemLocation::Shop (0x34,0x2B, true, "Trading Post Item 8", TRADING_POST_ITEM_8, MAGIC_BEAN, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[BOMB_SHOP_ITEM_1] = ItemLocation::Shop (0x68,0x17, true, "Bomb Shop Item 1", BOMB_SHOP_ITEM_1, BOMBS_10, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); + locationTable[BOMB_SHOP_ITEM_1] = ItemLocation::Shop (0x68,0x1A, true, "Bomb Shop Item 1", BOMB_SHOP_ITEM_1, BOMBS_10, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); locationTable[BOMB_SHOP_ITEM_2] = ItemLocation::Shop (0x68,0x19, true, "Bomb Shop Item 2", BOMB_SHOP_ITEM_2, BOMBCHU_10, {Category::cEastClockTown,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN); - locationTable[W_CLOCK_TOWN_BOMB_BAG_BUY] = ItemLocation::Shop (0x68,0x1A, false, "WCT Bomb Bag Purchase", W_CLOCK_TOWN_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG, {Category::cWestClockTown,Category::cDayOne, Category::cShop, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); - locationTable[W_CLOCK_TOWN_BIG_BOMB_BAG_BUY] = ItemLocation::Shop (0x68,0x04, false, "WCT Big Bomb Bag Purchase", W_CLOCK_TOWN_BIG_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG, {Category::cWestClockTown,Category::cDayTwo, Category::cShop, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); + locationTable[W_CLOCK_TOWN_BOMB_BAG_BUY] = ItemLocation::Shop (0x68,0x17, false, "WCT Bomb Bag Purchase", W_CLOCK_TOWN_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG, {Category::cWestClockTown,Category::cDayOne, Category::cShop, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); + locationTable[W_CLOCK_TOWN_BIG_BOMB_BAG_BUY] = ItemLocation::Shop (0x68,0x18, false, "WCT Big Bomb Bag Purchase", W_CLOCK_TOWN_BIG_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG, {Category::cWestClockTown,Category::cDayTwo, Category::cShop, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); - locationTable[POTION_SHOP_ITEM_1] = ItemLocation::Shop (0x0A,0x00, true, "Potion Shop Item 1", POTION_SHOP_ITEM_1, BLUE_POTION_REFILL, {Category::cSouthernSwamp,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP); + locationTable[POTION_SHOP_ITEM_1] = ItemLocation::Shop (0x0A,0x02, true, "Potion Shop Item 1", POTION_SHOP_ITEM_1, BLUE_POTION_REFILL, {Category::cSouthernSwamp,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP); locationTable[POTION_SHOP_ITEM_2] = ItemLocation::Shop (0x0A,0x01, true, "Potion Shop Item 2", POTION_SHOP_ITEM_2, GREEN_POTION_REFILL, {Category::cSouthernSwamp,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP); - locationTable[POTION_SHOP_ITEM_3] = ItemLocation::Shop (0x0A,0x02, true, "Potion Shop Item 3", POTION_SHOP_ITEM_3, RED_POTION_REFILL, {Category::cSouthernSwamp,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP); + locationTable[POTION_SHOP_ITEM_3] = ItemLocation::Shop (0x0A,0x00, true, "Potion Shop Item 3", POTION_SHOP_ITEM_3, RED_POTION_REFILL, {Category::cSouthernSwamp,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP); locationTable[GORON_SHOP_ITEM_1] = ItemLocation::Shop (0x3D,0x1E, true, "Goron Shop Item 1", GORON_SHOP_ITEM_1, BOMBS_10, {Category::cGoronVillage,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE); locationTable[GORON_SHOP_ITEM_2] = ItemLocation::Shop (0x3D,0x1F, true, "Goron Shop Item 2", GORON_SHOP_ITEM_2, ARROWS_10, {Category::cGoronVillage,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE); From 18d00e52004721204b7feff5efe7ed4dac4a3090 Mon Sep 17 00:00:00 2001 From: Phlex <3514085+PhlexPlexico@users.noreply.github.com> Date: Mon, 7 Sep 2026 08:32:34 -0600 Subject: [PATCH 28/63] fix: Adjust hint message for ice traps. nit: Remove unused prices as they're set in message. nit: Fix potion shop ordering. --- source/hints.cpp | 2 +- source/item_location.cpp | 4 ++-- source/patch.cpp | 19 ------------------- 3 files changed, 3 insertions(+), 22 deletions(-) diff --git a/source/hints.cpp b/source/hints.cpp index 64581be..7100317 100644 --- a/source/hints.cpp +++ b/source/hints.cpp @@ -530,7 +530,7 @@ void CreateShopMessages() { ItemKey itemKey = Location(shopEntries[i].second)->GetPlacedItemKey(); Text itemName = ItemTable(itemKey).GetName(); if (itemKey == ICE_TRAP) { - itemName = GetIceTrapName(itemKey.Value().looksLikeItemId); + itemName = GetIceTrapName(ItemTable(itemKey).Value().looksLikeItemId); } Text shopIntro = Text{"#"}+itemName+Text{ "&>>" diff --git a/source/item_location.cpp b/source/item_location.cpp index e9612f8..5567285 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -569,9 +569,9 @@ void LocationTable_Init() { locationTable[W_CLOCK_TOWN_BOMB_BAG_BUY] = ItemLocation::Shop (0x68,0x17, false, "WCT Bomb Bag Purchase", W_CLOCK_TOWN_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG, {Category::cWestClockTown,Category::cDayOne, Category::cShop, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); locationTable[W_CLOCK_TOWN_BIG_BOMB_BAG_BUY] = ItemLocation::Shop (0x68,0x18, false, "WCT Big Bomb Bag Purchase", W_CLOCK_TOWN_BIG_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG, {Category::cWestClockTown,Category::cDayTwo, Category::cShop, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); - locationTable[POTION_SHOP_ITEM_1] = ItemLocation::Shop (0x0A,0x02, true, "Potion Shop Item 1", POTION_SHOP_ITEM_1, BLUE_POTION_REFILL, {Category::cSouthernSwamp,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP); + locationTable[POTION_SHOP_ITEM_1] = ItemLocation::Shop (0x0A,0x00, true, "Potion Shop Item 1", POTION_SHOP_ITEM_1, BLUE_POTION_REFILL, {Category::cSouthernSwamp,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP); locationTable[POTION_SHOP_ITEM_2] = ItemLocation::Shop (0x0A,0x01, true, "Potion Shop Item 2", POTION_SHOP_ITEM_2, GREEN_POTION_REFILL, {Category::cSouthernSwamp,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP); - locationTable[POTION_SHOP_ITEM_3] = ItemLocation::Shop (0x0A,0x00, true, "Potion Shop Item 3", POTION_SHOP_ITEM_3, RED_POTION_REFILL, {Category::cSouthernSwamp,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP); + locationTable[POTION_SHOP_ITEM_3] = ItemLocation::Shop (0x0A,0x02, true, "Potion Shop Item 3", POTION_SHOP_ITEM_3, RED_POTION_REFILL, {Category::cSouthernSwamp,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP); locationTable[GORON_SHOP_ITEM_1] = ItemLocation::Shop (0x3D,0x1E, true, "Goron Shop Item 1", GORON_SHOP_ITEM_1, BOMBS_10, {Category::cGoronVillage,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE); locationTable[GORON_SHOP_ITEM_2] = ItemLocation::Shop (0x3D,0x1F, true, "Goron Shop Item 2", GORON_SHOP_ITEM_2, ARROWS_10, {Category::cGoronVillage,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE); diff --git a/source/patch.cpp b/source/patch.cpp index 1209e76..a5a742b 100644 --- a/source/patch.cpp +++ b/source/patch.cpp @@ -230,25 +230,6 @@ bool WriteAllPatches() { } } */ - /*-------------------------------- - | rShopsanityPrices | - --------------------------------*/ -/* - if (Settings::Shopsanity.IsNot(SHOPSANITY_OFF) && Settings::Shopsanity.IsNot(SHOPSANITY_ZERO)) { - //Get prices from shop item vector - std::array rShopsanityPrices{}; - for (i = 0; i < 32; i++) { - rShopsanityPrices[i] = NonShopItems[i].Price; - } - - // Write shopsanity item prices to the patch - patchOffset = V_TO_P(RSHOPSANITYPRICES_ADDR); - patchSize = sizeof(rShopsanityPrices); - if (!WritePatch(patchOffset, patchSize, (char*)(&rShopsanityPrices), code, bytesWritten, totalRW, buf)) { - return false; - } - } - */ /*--------------------------------- | rDungeonRewardOverrides | ---------------------------------*/ From bfcb25d6c4d9ed75e1e8433d6d2115c26c7da759 Mon Sep 17 00:00:00 2001 From: pizza1398 <259104093+pizza1398@users.noreply.github.com> Date: Mon, 7 Sep 2026 12:37:57 +0200 Subject: [PATCH 29/63] Add Curiosity Shop Bomb Bag messages - Price at 1000 for now to prevent sequence breaks or whatever - Replace QM_WHITE with QM_DEFAULT to prevent warnings --- source/hints.cpp | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/source/hints.cpp b/source/hints.cpp index 7100317..b4d5765 100644 --- a/source/hints.cpp +++ b/source/hints.cpp @@ -586,19 +586,31 @@ void CreateShopMessages() { // Create display and purchase messages CustomMessages::CreateMessageFromTextObject(messageID , 0xFFFF, (0x3FFFFC00 | price), 0xFF0301, shopIntro + shopDescription, {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); - CustomMessages::CreateMessageFromTextObject(messageID + 1, 0xFFFF, (0x3FFFFC00 | price), 0xFF1301, shopIntro + buyPrompt, {QM_WHITE, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); + CustomMessages::CreateMessageFromTextObject(messageID + 1, 0xFFFF, (0x3FFFFC00 | price), 0xFF1301, shopIntro + buyPrompt, {QM_DEFAULT, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); // If Trading Post message, also generate part-timer version if ((0x06AC <= messageID) && (messageID <= 0x06BA)) { CustomMessages::CreateMessageFromTextObject(messageID + 0x1D, 0xFFFF, (0x3FFFFC00 | price), 0xFF0301, shopIntro + slopDescription, {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); - CustomMessages::CreateMessageFromTextObject(messageID + 0x1E, 0xFFFF, (0x3FFFFC00 | price), 0xFF1301, shopIntro + buyPrompt, {QM_WHITE, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); + CustomMessages::CreateMessageFromTextObject(messageID + 0x1E, 0xFFFF, (0x3FFFFC00 | price), 0xFF1301, shopIntro + buyPrompt, {QM_DEFAULT, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); } // If Goron Shop message, also generate spring copy if ((0x0BC5 <= messageID) && (messageID <= 0x0BC9)) { CustomMessages::CreateMessageFromTextObject(messageID + 0x6, 0xFFFF, (0x3FFFFC00 | price), 0xFF0301, shopIntro + shopDescription, {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); - CustomMessages::CreateMessageFromTextObject(messageID + 0x7, 0xFFFF, (0x3FFFFC00 | price), 0xFF1301, shopIntro + buyPrompt, {QM_WHITE, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); + CustomMessages::CreateMessageFromTextObject(messageID + 0x7, 0xFFFF, (0x3FFFFC00 | price), 0xFF1301, shopIntro + buyPrompt, {QM_DEFAULT, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); + } + // If Big Bomb Bag write stolen variant (inelegantly) + if (messageID == 0x0656) { + shopIntro = Text{"#"}+itemName+"&>>"+std::to_string(1000)+Text{ + " Rupees#&", " rubis#&", " rupias#&", " Rubine#&",// " rupie#&" + }; + CustomMessages::CreateMessageFromTextObject(0x29DB, 0xFFFF, (0x3FFFFC00 | 1000), 0xFF0301, shopIntro+Text{ + /*English*/"This is just between us, but this is&actually a Bomb Shop product.", + /*French */"Ça reste entre nous, mais c'est&un article de la boutique de bombes.", + /*Spanish*/"Esto es entre nosotros, pero&es el de la tienda de bombas.", + /*German */"Verrat's nicht weiter, aber die ist eigentlich Eigentum des Bomben-Shops.", // OVERFLOW RISK + // /*Italian*/"he resti tra noi, ma in realtà&questo articolo appartiene al&negozio delle bombe.", // OVERFLOW RISK + }, {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + CustomMessages::CreateMessageFromTextObject(0x29DC, 0xFFFF, (0x3FFFFC00 | 1000), 0xFF1301, shopIntro + buyPrompt, {QM_DEFAULT, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); } - // Stolen Big Bomb Bag stuff goes here?? - //Special message for the potion shop witch if you haven't given her a mushroom yet // WILL OVERFLOW IN MOST LANGUAGES WHEN ITEM NAME TRIGGERS LINE BREAK if (messageID == 0x0843) { From 77324ac7aff1403f932f2e8a882376e54fc7bec5 Mon Sep 17 00:00:00 2001 From: pizza1398 <259104093+pizza1398@users.noreply.github.com> Date: Mon, 7 Sep 2026 22:54:10 +0200 Subject: [PATCH 30/63] Add TrickNames to Tingle shops - Add GetShopItemName (POSITION AND NAME ETC. SUBJECT TO CHANGE?) - Separate Tingle prices from rest of his text "just in case" - Use GetShopItemName in CreateCustomMessages (and Tingle stuff ofc) --- source/hints.cpp | 48 ++++++++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/source/hints.cpp b/source/hints.cpp index b4d5765..a157241 100644 --- a/source/hints.cpp +++ b/source/hints.cpp @@ -437,52 +437,59 @@ static std::vector CalculateBarrenRegions() { return finalBarrenLocations; } +Text GetShopItemName(ItemKey itemKey) { + if (itemKey == ICE_TRAP) + return GetIceTrapName(ItemTable(itemKey).Value().looksLikeItemId); + else + return ItemTable(itemKey).GetName(); +} + void CreateTingleHintText() { // Create custom messages for Tingle items if we shuffled. if (Settings::ShuffleTingleMaps.Is(true)) { // Logic: Get item names from location. // Create custom message for each tingle location (6) - Text clockTownMap = ItemTable(Location(TINGLE_N_CLOCK_TOWN_CT)->GetPlacedItemKey()).GetName(); - Text woodfallMap = ItemTable(Location(TINGLE_N_CLOCK_TOWN_WF)->GetPlacedItemKey()).GetName(); - Text snowHeadMap = ItemTable(Location(TINGLE_TWIN_ISLANDS_SH)->GetPlacedItemKey()).GetName(); - Text romaniMap = ItemTable(Location(TINGLE_TWIN_ISLANDS_RR)->GetPlacedItemKey()).GetName(); - Text greatBayMap = ItemTable(Location(TINGLE_GBC_GB)->GetPlacedItemKey()).GetName(); - Text ikanaMap = ItemTable(Location(TINGLE_GBC_ST)->GetPlacedItemKey()).GetName(); - - // {"English", "French", "Spanish" "German" }; "Italian" - Text priceFive = {" ##5 Rupees#&#", " ##5 Rubis#&#", " ##5 rupias#&#", " - ##5 Rubine#&#" }; // , " ##5 rupie#&" - Text priceTwenty = {" ##20 Rupees#&#", " ##20 Rubis#&#", " ##20 rupias#&#", " - ##20 Rubine#&#"}; // , " ##20 rupie#&" - Text priceForty = {" ##40 Rupees#", " ##40 Rubis#", " ##40 rupias#", " - ##40 Rubine#" }; // , " ##40 rupie#" - Text leaveShop = {"&#No thanks#", "&#Non merci#", "&#No, gracias#", "&#Nein, danke!#" }; // , "&#No, grazie#" + Text clockTownMap = GetShopItemName(Location(TINGLE_N_CLOCK_TOWN_CT)->GetPlacedItemKey()); + Text woodfallMap = GetShopItemName(Location(TINGLE_N_CLOCK_TOWN_WF)->GetPlacedItemKey()); + Text snowHeadMap = GetShopItemName(Location(TINGLE_TWIN_ISLANDS_SH)->GetPlacedItemKey()); + Text romaniMap = GetShopItemName(Location(TINGLE_TWIN_ISLANDS_RR)->GetPlacedItemKey()); + Text greatBayMap = GetShopItemName(Location(TINGLE_GBC_GB)->GetPlacedItemKey()); + Text ikanaMap = GetShopItemName(Location(TINGLE_GBC_ST)->GetPlacedItemKey()); + + // {"English", "French", "Spanish", "German", }; // "Italian" + Text tingSplit = {" ##", " ##", " ##", " - ##", }; // " ##" + Text tingNext = {" Rupees#&#", " Rubis#&#", " rupias#&#", " Rubine#&#", }; // " rupie#&" + Text tingLeave = tingNext+ + Text{"No thanks#", "Non merci#", "No, gracias#", "Nein, danke!#", }; // "&#No, grazie#" // Clock Town message CustomMessages::CreateMessageFromTextObject(0x1D11, 0xFFFF, 0x3FF0A005, 0xFF1001, - Text{">3#"}+clockTownMap+priceFive+woodfallMap+priceForty+leaveShop, + Text{">3#"}+clockTownMap+tingSplit+"5"+tingNext+woodfallMap+tingSplit+"40"+tingLeave, {QM_GREEN, QM_RED, QM_GREEN, QM_RED, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); // Woodfall message CustomMessages::CreateMessageFromTextObject(0x1D12, 0xFFFF, 0x3FF0A014, 0xFF1001, - Text{">3#"}+woodfallMap+priceTwenty+snowHeadMap+priceForty+leaveShop, + Text{">3#"}+woodfallMap+tingSplit+"20"+tingNext+snowHeadMap+tingSplit+"40"+tingLeave, {QM_GREEN, QM_RED, QM_GREEN, QM_RED, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); // Snowhead message CustomMessages::CreateMessageFromTextObject(0x1D13, 0xFFFF, 0x3FF0A014, 0xFF1001, - Text{">3#"}+snowHeadMap+priceTwenty+romaniMap+priceForty+leaveShop, + Text{">3#"}+snowHeadMap+tingSplit+"20"+tingNext+romaniMap+tingSplit+"40"+tingLeave, {QM_GREEN, QM_RED, QM_GREEN, QM_RED, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); // Milk Road message CustomMessages::CreateMessageFromTextObject(0x1D14, 0xFFFF, 0x3FF0A014, 0xFF1001, - Text{">3#"}+romaniMap+priceTwenty+greatBayMap+priceForty+leaveShop, + Text{">3#"}+romaniMap+tingSplit+"20"+tingNext+greatBayMap+tingSplit+"40"+tingLeave, {QM_GREEN, QM_RED, QM_GREEN, QM_RED, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); // Great Bay message CustomMessages::CreateMessageFromTextObject(0x1D15, 0xFFFF, 0x3FF0A014, 0xFF1001, - Text{">3#"}+greatBayMap+priceTwenty+ikanaMap+priceForty+leaveShop, + Text{">3#"}+greatBayMap+tingSplit+"20"+tingNext+ikanaMap+tingSplit+"40"+tingLeave, {QM_GREEN, QM_RED, QM_GREEN, QM_RED, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); // Ikana message CustomMessages::CreateMessageFromTextObject(0x1D16, 0xFFFF, 0x3FF0A014, 0xFF1001, - Text{">3#"}+ikanaMap+priceTwenty+clockTownMap+priceForty+leaveShop, + Text{">3#"}+ikanaMap+tingSplit+"20"+tingNext+clockTownMap+tingSplit+"40"+tingLeave, {QM_GREEN, QM_RED, QM_GREEN, QM_RED, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); } } @@ -528,10 +535,7 @@ void CreateShopMessages() { u32 messageID = shopEntries[i].first; u16 price = Location(shopEntries[i].second)->GetPrice(); ItemKey itemKey = Location(shopEntries[i].second)->GetPlacedItemKey(); - Text itemName = ItemTable(itemKey).GetName(); - if (itemKey == ICE_TRAP) { - itemName = GetIceTrapName(ItemTable(itemKey).Value().looksLikeItemId); - } + Text itemName = GetShopItemName(itemKey); Text shopIntro = Text{"#"}+itemName+Text{ "&>>" // itemName.NAenglish.length() <= 30 ? ": " : "&>>", From 0b114f5cf350029d649f925d7b4ed65ff2e5709b Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Mon, 7 Sep 2026 16:39:24 -0500 Subject: [PATCH 31/63] Spoiler & Pool - Potential fix for spoiler log for shop entries - remove extra scrub arrays from item pool cause we dont need 3 --- source/fill.cpp | 10 ++++++++++ source/include/item_location.hpp | 1 + source/item_pool.cpp | 20 -------------------- 3 files changed, 11 insertions(+), 20 deletions(-) diff --git a/source/fill.cpp b/source/fill.cpp index f003cd2..fb317b8 100644 --- a/source/fill.cpp +++ b/source/fill.cpp @@ -840,6 +840,16 @@ int Fill() { RemoveStartingItemsFromPool(); FillExcludedLocations(); + //Temp place Shop things so i can figure shit out + PlaceItemInLocation(TRADING_POST_ITEM_1, GREEN_RUPEE); + PlaceItemInLocation(TRADING_POST_ITEM_2, BLUE_RUPEE); + PlaceItemInLocation(TRADING_POST_ITEM_3, RED_RUPEE); + PlaceItemInLocation(TRADING_POST_ITEM_4, SWAMP_SKULLTULA_TOKEN); + PlaceItemInLocation(TRADING_POST_ITEM_5, WOODFALL_TEMPLE_SMALL_KEY); + PlaceItemInLocation(TRADING_POST_ITEM_6, SNOWHEAD_TEMPLE_BOSS_KEY); + PlaceItemInLocation(TRADING_POST_ITEM_7, BOTTLE_WITH_RED_POTION); + PlaceItemInLocation(TRADING_POST_ITEM_8, WF_STRAY_FAIRY); + showItemProgress = true; //Place dungeon rewards diff --git a/source/include/item_location.hpp b/source/include/item_location.hpp index b5ed9f8..3e94c86 100644 --- a/source/include/item_location.hpp +++ b/source/include/item_location.hpp @@ -181,6 +181,7 @@ class ItemLocation { else if (type == ItemLocationType::TempleReward) {ovrtype = ItemOverride_Type::OVR_TEMPLE;} else if (type == ItemLocationType::StrayFairy) {ovrtype = ItemOverride_Type::OVR_STRAY_FAIRY;} else if (type == ItemLocationType::Cow) {ovrtype = ItemOverride_Type::OVR_COW;} + else if (type == ItemLocationType::Shop) {ovrtype = ItemOverride_Type::OVR_SHOP;} return ovrtype; } diff --git a/source/item_pool.cpp b/source/item_pool.cpp index bc9a2d2..a537965 100644 --- a/source/item_pool.cpp +++ b/source/item_pool.cpp @@ -239,12 +239,6 @@ const std::array shopsanityRupees = { RED_RUPEE, PURPLE_RUPEE, }; -const std::array dekuScrubItems = { - HUGE_RUPEE, - BLUE_POTION_REFILL, - MAGIC_BEAN, - GREEN_POTION_REFILL, -}; const std::array chestItems = { LENS_OF_TRUTH, @@ -444,13 +438,6 @@ const std::array vanillaCows = { MILK, }; -const std::array scrubPurchaseItems = { - MAGIC_BEAN, - PROGRESSIVE_BOMB_BAG,//BIGGEST_BOMB_BAG - GREEN_POTION_REFILL, - BLUE_POTION_REFILL, -}; - const std::array moonItemList = { //2Chests and 4 trial rewards, FDM separate //ARROWS_30, -just replace with junk @@ -1105,13 +1092,6 @@ void GenerateItemPool() { AddItemsToPool(ItemPool, dungeonRewards); - // TO-DO ItemPool for extra items & Scarce and Minimal pools - //if (ItemPoolValue.Is(ITEMPOOL_PLENTIFUL)) { - //AddItemsToPool(ItemPool, easyItems); - //} - //else { - //AddItemsToPool(ItemPool, normalItems); - //} if (ItemPoolValue.Is(ItemPoolSetting::ITEMPOOL_SCARCE)) {//TO DO SetScarceItemPool(); } From 31d44a72d8b82dff428b3195067119c440fd3f2d Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Mon, 7 Sep 2026 17:59:24 -0500 Subject: [PATCH 32/63] Update Z3DR --- Z3DR | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Z3DR b/Z3DR index 9402ce4..19dbafc 160000 --- a/Z3DR +++ b/Z3DR @@ -1 +1 @@ -Subproject commit 9402ce4093baf76562310347d3e595d5a04a8e9d +Subproject commit 19dbafc96d52e0e4023caed57186969a49bcc9d9 From ec8f371b7b1b38a7c22567bb621ce799795761e6 Mon Sep 17 00:00:00 2001 From: pizza1398 <259104093+pizza1398@users.noreply.github.com> Date: Tue, 8 Sep 2026 18:54:31 +0200 Subject: [PATCH 33/63] Update IceTrapModels list --- source/item_pool.cpp | 84 ++++++++++++++++++++++++++++++++------------ source/shops.cpp | 7 +++- 2 files changed, 68 insertions(+), 23 deletions(-) diff --git a/source/item_pool.cpp b/source/item_pool.cpp index a537965..01ad571 100644 --- a/source/item_pool.cpp +++ b/source/item_pool.cpp @@ -301,7 +301,7 @@ const std::array maskList = { GIBDOS_MASK, GAROS_MASK, CAPTAINS_HAT, - GIANTS_MASK, + GIANTS_MASK, MASK_OF_TRUTH, }; @@ -692,38 +692,37 @@ void GenerateItemPool() { 0x25, //GetItemID::GI_FIRE_ARROW, 0x26, //GetItemID::GI_ICE_ARROW, 0x27, //GetItemID::GI_LIGHT_ARROW, - 0xB8, //Double defense + 0xB2, //Double defense 0x46, //Progressive bomb bag 0x47, //Progressive bow 0x48, //Progressive wallet 0x49, //Progressive magic - 0x4A, //ProgressiveSword + 0x4A, //Progressive Sword }; //Check song shuffle and dungeon reward shuffle just for ice traps if (ShuffleSongs.Value() != 0) { //Push item ids for songs - IceTrapModels.push_back(0x4B); - IceTrapModels.push_back(0x4C); - IceTrapModels.push_back(0x4D); - IceTrapModels.push_back(0x4E); - IceTrapModels.push_back(0x4F); - IceTrapModels.push_back(0x51); - IceTrapModels.push_back(0x53); - IceTrapModels.push_back(0x54); - IceTrapModels.push_back(0x6C); - IceTrapModels.push_back(0x72); - IceTrapModels.push_back(0x73); - //IceTrapModels.push_back(0xC6); + IceTrapModels.push_back(0x4B); //GI_SONATA_OF_AWAKENING + IceTrapModels.push_back(0x45); // Progressive Lullaby + IceTrapModels.push_back(0x4E); //GI_NEW_WAVE_BOSSA_NOVA + IceTrapModels.push_back(0x4F); //GI_ELEGY_OF_EMPTINESS + IceTrapModels.push_back(0x51); //GI_OATH_TO_ORDER + IceTrapModels.push_back(0x53); //GI_SONG_OF_TIME + IceTrapModels.push_back(0x54); // Song of Healing + IceTrapModels.push_back(0x6C); //GI_EPONAS_SONG + IceTrapModels.push_back(0x72); //GI_SONG_OF_SOARING + IceTrapModels.push_back(0x73); //GI_SONG_OF_STORMS + //IceTrapModels.push_back(0xC6); //????? } if (ShuffleRewards.Value() != 0) { //Push item ids for dungeon rewards - IceTrapModels.push_back(0x55); - IceTrapModels.push_back(0x56); - IceTrapModels.push_back(0x57); - IceTrapModels.push_back(0x58); + IceTrapModels.push_back(0x55); // GI_ODOLWAS_REMAINS + IceTrapModels.push_back(0x56); // GI_GOHTS_REMAINS + IceTrapModels.push_back(0x57); // GI_GYORGS_REMAINS + IceTrapModels.push_back(0x58); // GI_TWINMOLDS_REMAINS } - + //Fixed Item Locations PlaceItemInLocation(MAJORA, MAJORAS_MASK, true); PlaceItemInLocation(WOODFALL_TEMPLE_DEKU_PRINCESS, DEKU_PRINCESS); @@ -754,6 +753,7 @@ void GenerateItemPool() { //OCARINA SHUFFLE if(StartingOcarina.Value() == 0) {//If starting without ocarina add it to pool AddItemToMainPool(OCARINA_OF_TIME, 1); + IceTrapModels.push_back(0x4C); //GI_OCARINA_OF_TIME } else { //else place it vanilla cause we start with it PlaceItemInLocation(CLOCK_TOWER_OCARINA_OF_TIME, OCARINA_OF_TIME, true); @@ -762,7 +762,6 @@ void GenerateItemPool() { //KOKIRISWORD SHUFFLE if(StartingKokiriSword.Value() == (u8)StartingSwordSetting::STARTINGSWORD_NONE) {//if starting with no sword we need to add an extra to the pool AddItemToMainPool(PROGRESSIVE_SWORD, 1); - IceTrapModels.push_back(0x37);//GetItemID::GI_KOKIRI_SWORD PlaceItemInLocation(HMS_STARTING_SWORD,GREEN_RUPEE);//Add Junk to this location because theres no way to get it otherwise } else { PlaceItemInLocation(HMS_STARTING_SWORD, KOKIRI_SWORD); //if starting with any sword place this here because this location is unobtainable @@ -778,7 +777,8 @@ void GenerateItemPool() { //SHUFFLE BOMBERS NOTEBOOK if(ShuffleBombersNotebook){ AddItemToMainPool(BOMBERS_NOTEBOOK); - //PlaceItemInLocation(HMS_BOMBERS_NOTEBOOK, GREEN_RUPEE);//Need to add check if starting with Song of Healing + IceTrapModels.push_back(0x50); //GI_BOMBERS_NOTEBOOK + //PlaceItemInLocation(HMS_BOMBERS_NOTEBOOK, GREEN_RUPEE);//Need to add check if starting with Song of Healing } else {PlaceItemInLocation(HMS_BOMBERS_NOTEBOOK, BOMBERS_NOTEBOOK);} @@ -826,6 +826,24 @@ void GenerateItemPool() { //NON TRANSFORM MASK SHUFFLE if (ShuffleMasks) { AddItemsToPool(ItemPool, maskList); + IceTrapModels.push_back(0x80); // GI_MASK_KEATON + IceTrapModels.push_back(0x7F); // GI_MASK_BUNNY_HOOD + IceTrapModels.push_back(0x84); // GI_MASK_POSTMANS + IceTrapModels.push_back(0x7E); // GI_MASK_ALL_NIGHT + IceTrapModels.push_back(0x8D); // GI_MASK_BLAST + IceTrapModels.push_back(0x8B); // GI_MASK_STONE + IceTrapModels.push_back(0x86); // GI_MASK_GREAT_FAIRYS + IceTrapModels.push_back(0x8C); // GI_MASK_BREMEN + IceTrapModels.push_back(0x88); // GI_MASK_DON_GEROS + IceTrapModels.push_back(0x8E); // GI_MASK_OF_SCENTS + IceTrapModels.push_back(0x82); // GI_MASK_ROMANIS + IceTrapModels.push_back(0x83); // GI_MASK_TROUPE_LEADERS + IceTrapModels.push_back(0x89); // GI_MASK_KAMARAOS + IceTrapModels.push_back(0x87); // GI_MASK_GIBDO + IceTrapModels.push_back(0x81); // GI_MASK_GARO + IceTrapModels.push_back(0x7C); // GI_MASK_CAPTAINS_HAT + IceTrapModels.push_back(0x7D); // GI_MASK_GIANTS + IceTrapModels.push_back(0x8A); // GI_MASK_OF_TRUTH } else { PlaceVanillaMasks(); @@ -883,6 +901,9 @@ void GenerateItemPool() { AddItemToMainPool(DEKU_MASK); AddItemToMainPool(GORON_MASK); AddItemToMainPool(ZORA_MASK); + IceTrapModels.push_back(0x78); // GI_MASK_DEKU + IceTrapModels.push_back(0x79); // GI_MASK_GORON + IceTrapModels.push_back(0x7A); // GI_MASK_ZORA } else { PlaceItemInLocation(HMS_DEKU_MASK,DEKU_MASK); @@ -893,6 +914,7 @@ void GenerateItemPool() { //FIERECE DEITY SHUFFLE if(ShuffleFierceDeity){ AddItemToMainPool(FIERCE_DEITY_MASK); + IceTrapModels.push_back(0x7B); // GI_MASK_FIERCE_DEITY } else{ PlaceItemInLocation(THE_MOON_MAJORA_CHILD,FIERCE_DEITY_MASK); @@ -926,6 +948,8 @@ void GenerateItemPool() { if(Tokensanity){ AddItemToMainPool(SWAMP_SKULLTULA_TOKEN, 30); AddItemToMainPool(OCEANSIDE_SKULLTULA_TOKEN, 30); + IceTrapModels.push_back(0x44); // Swamp Token + IceTrapModels.push_back(0x6D); // Ocean Token std::vector SwampSkullLocations = FilterFromPool(allLocations, [](const LocationKey loc) {return Location(loc)->IsCategory(Category::cSwampSkulltula);}); std::vector OceanSkullLocations = FilterFromPool(allLocations, [](const LocationKey loc1) {return Location(loc1)->IsCategory(Category::cOceanSkulltula);}); } @@ -936,6 +960,11 @@ void GenerateItemPool() { //DEKU MERCHANT TRADE QUEST if (ShuffleMerchants){//Merchants is Deku Scrub Trade Quest AddItemsToPool(ItemPool, scrubTradeItems); + IceTrapModels.push_back(0x96); // GI_MOONS_TEAR + IceTrapModels.push_back(0x97); // GI_TOWN_TITLE_DEED + IceTrapModels.push_back(0x98); // GI_SWAMP_TITLE_DEED + IceTrapModels.push_back(0x99); // GI_MOUNTAIN_TITLE_DEED + IceTrapModels.push_back(0x9A); // GI_OCEAN_TITLE_DEED } else { PlaceItemInLocation(TERMINA_FIELD_MOONS_TEAR, MOONS_TEAR); PlaceItemInLocation(S_CLOCK_TOWN_SCRUB_TRADE, LAND_TITLE); @@ -948,6 +977,11 @@ void GenerateItemPool() { //ANJU AND KAFEI QUEST ITEMS if (ShuffleTradeItems){//TradeItems refers to Anju&Kafei Items AddItemsToPool(ItemPool, anjuKafeiTradeItems); + IceTrapModels.push_back(0x8F); // GI_MASK_KAFEIS + IceTrapModels.push_back(0x85); // GI_MASK_COUPLES + IceTrapModels.push_back(0xAA); // GI_LETTER_TO_KAFEI + IceTrapModels.push_back(0xA1); // GI_LETTER_TO_MAMA + IceTrapModels.push_back(0xA0); // GI_ROOM_KEY } else { PlaceItemInLocation(E_CLOCK_TOWN_AROMA_IN_OFFICE, KAFEIS_MASK); PlaceItemInLocation(STOCKPOTINN_ANJU_AND_KAFEI, COUPLES_MASK); @@ -976,6 +1010,12 @@ void GenerateItemPool() { if (ShuffleTingleMaps) { //Add the 6 maps AddItemsToPool(ItemPool, tingleMaps); + IceTrapModels.push_back(0xB4); // GI_MAP_OF_CLOCK_TOWN = 0xB4 + IceTrapModels.push_back(0xB5); // GI_MAP_OF_WOODFALL + IceTrapModels.push_back(0xB6); // GI_MAP_OF_SNOWHEAD + IceTrapModels.push_back(0xB7); // GI_MAP_OF_ROMANI_RANCH + IceTrapModels.push_back(0xB8); // GI_MAP_OF_GREAT_BAY + IceTrapModels.push_back(0xB9); // GI_MAP_OF_STONE_TOWER //Place Junk in "Duplicate spots" so each map check contains the same item in both locations PlaceItemInLocation(TINGLE_N_CLOCK_TOWN_WF, BLUE_RUPEE); PlaceItemInLocation(TINGLE_ROAD_TO_SS_SH, BLUE_RUPEE); diff --git a/source/shops.cpp b/source/shops.cpp index f64657b..6d392af 100644 --- a/source/shops.cpp +++ b/source/shops.cpp @@ -152,6 +152,11 @@ void InitTrickNames() { Text{"Shield of the Hero", "", "", "", }, Text{"Legendary Shield", "", "", "", }, }; + trickNameTable[(u32)GetItemID::GI_SHIELD_MIRROR] = { + Text{"Scary Mirror", "", "", "", }, + Text{"Shield Mirror", "", "", "", }, + Text{"Minor Shield", "", "", "", }, + }; trickNameTable[(u32)GetItemID::GI_STICKS_1] = { Text{"Deku Branch", "", "", "", }, Text{"Stick", "", "", "", }, @@ -233,7 +238,7 @@ void InitTrickNames() { Text{"Might Arrow", "", "", "", }, }; trickNameTable[(u32)GetItemID::GI_HOOKSHOT] = { - Text{"Grapling Hook", "", "", "", }, + Text{"Grappling Hook", "", "", "", }, Text{"Longshot", "", "", "", }, Text{"Hookshort", "", "", "", }, }; From 3a28af1fa1f1cc416d7636b9f00f80bee21d51a2 Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Tue, 8 Sep 2026 17:21:43 -0500 Subject: [PATCH 34/63] Scrubsanity Initial - Implements Scrubsanity creating the following changes: - New Locations added for buying the scrub's item after they have moved when given a title deed in their original location - Implements new logic for the above locations - Slightly modify item pool generation to match new locations --- source/include/keys.hpp | 6 ++++++ source/include/logic.hpp | 4 ++++ source/item_location.cpp | 26 ++++++++++++++++++++++++-- source/item_pool.cpp | 12 +++++++++--- source/location_access.cpp | 10 ++++++++++ source/logic.cpp | 9 ++++++++- 6 files changed, 61 insertions(+), 6 deletions(-) diff --git a/source/include/keys.hpp b/source/include/keys.hpp index 8e7f45e..bfa735e 100644 --- a/source/include/keys.hpp +++ b/source/include/keys.hpp @@ -280,6 +280,7 @@ typedef enum { //Goron Village GORON_VILLAGE_POWDER_KEG_CHALLENGE, GORON_VILLAGE_SCRUB_PURCHASE, + GORON_VILLAGE_ZORA_SCRUB_PURCHASE, GORON_VILLAGE_LENS_OF_TRUTH_CHEST, GORON_VILLAGE_SCRUB_TRADE, GORON_VILLAGE_LEDGE, @@ -287,6 +288,7 @@ typedef enum { LENS_CAVE_PURPLE_RUPEE, GORON_VILLAGE_POWDER_KEG_CHALLENGE_SPRING, GORON_VILLAGE_SCRUB_PURCHASE_SPRING, + GORON_VILLAGE_ZORA_SCRUB_PURCHASE_SPRING, GORON_VILLAGE_SCRUB_TRADE_SPRING, GORON_VILLAGE_LEDGE_SPRING, GORON_SHOP_ITEM_1, @@ -391,6 +393,7 @@ typedef enum { DOGGY_RACETRACK_ROOF_CHEST, //S Clock Town S_CLOCK_TOWN_SCRUB_TRADE, + S_CLOCK_TOWN_SWAMP_SCRUB_PURCHASE, S_CLOCK_TOWN_POSTBOX, S_CLOCK_TOWN_CLOCK_TOWER_ENTRANCE, S_CLOCK_TOWN_STRAW_ROOF_CHEST, @@ -416,6 +419,8 @@ typedef enum { SOUTHERN_SWAMP_PICTOGRAPH_GOOD, SOUTHERN_SWAMP_SCRUB_PURCHASE, SOUTHERN_SWAMP_SCRUB_PURCHASE_CLEAR, + SOUTHERN_SWAMP_GORON_SCRUB_PURCHASE, + SOUTHERN_SWAMP_GORON_SCRUB_PURCHASE_CLEAR, SOUTHERN_SWAMP_SCRUB_TRADE_CLEAR, SWAMP_TOURIST_CENTER_ROOF_CLEAR, POTION_SHOP_ITEM_1, @@ -499,6 +504,7 @@ typedef enum { ZORA_HALL_EVAN, ZORA_HALL_LULU_ROOM_LEDGE, ZORA_HALL_SCRUB_PURCHASE, + ZORA_HALL_IKANA_SCRUB_PURCHASE, ZORA_HALL_STAGE_LIGHTS, ZORA_HALL_BAD_PHOTO_LULU, ZORA_HALL_GOOD_PHOTO_LULU, diff --git a/source/include/logic.hpp b/source/include/logic.hpp index aede534..9d106e0 100644 --- a/source/include/logic.hpp +++ b/source/include/logic.hpp @@ -331,6 +331,10 @@ namespace Logic { extern bool Milk; extern bool SpokeToKafei; extern bool PostedKafeiLetter; + extern bool CanTradeTownDeed; + extern bool CanTradeSwampDeed; + extern bool CanTradeMountainDeed; + extern bool CanTradeOceanDeed; extern bool CanGoToMoon; extern bool RemainsForMoon; diff --git a/source/item_location.cpp b/source/item_location.cpp index 5567285..3f935e2 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -65,6 +65,8 @@ void LocationTable_Init() { locationTable[GORON_VILLAGE_SCRUB_PURCHASE_SPRING] = ItemLocation::Base (0x48, 0x1D, false, "GV Scrub Purchase (Spring)", GORON_VILLAGE_SCRUB_PURCHASE_SPRING, PROGRESSIVE_BOMB_BAG, {Category::cGoronVillage, Category::cDekuScrub,Category::cDayOne, Category::cShop, Category::cAlternateCheck, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE ); locationTable[GORON_VILLAGE_SCRUB_TRADE_SPRING] = ItemLocation::Base (0x48, 0x99, true, "GV Deku Scrub Merchant Trade (Spring)", GORON_VILLAGE_SCRUB_TRADE_SPRING, MOUNTAIN_TITLE, {Category::cGoronVillage, Category::cDekuScrub,Category::cDayOne, Category::cAlternateCheck, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE ); locationTable[GORON_VILLAGE_LEDGE_SPRING] = ItemLocation::Collectable(0x48, 0x00, false, "GV Piece of Heart (Spring)", GORON_VILLAGE_LEDGE_SPRING, PIECE_OF_HEART, {Category::cGoronVillage, Category::cVanillaHeartPiece,Category::cDayOne, Category::cAlternateCheck, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE ); + locationTable[GORON_VILLAGE_ZORA_SCRUB_PURCHASE] = ItemLocation::Base (0x4D, 0x5C, false, "GV Zora Scrub Purchase", GORON_VILLAGE_ZORA_SCRUB_PURCHASE, GREEN_POTION_REFILL, {Category::cGoronVillage, Category::cDekuScrub,Category::cDayOne, Category::cShop, Category::cMainInventory}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE ); + locationTable[GORON_VILLAGE_ZORA_SCRUB_PURCHASE_SPRING] = ItemLocation::Base (0x48, 0x5C, false, "GV Zora Scrub Purchase (Spring)", GORON_VILLAGE_ZORA_SCRUB_PURCHASE_SPRING, GREEN_POTION_REFILL, {Category::cGoronVillage, Category::cDekuScrub,Category::cDayOne, Category::cShop, Category::cAlternateCheck}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE ); //Great Bay Coast locationTable[GBC_OCEAN_SPIDER_DAY1] = ItemLocation::Base (0x28, 0x48, false, "OSH Reward", GBC_OCEAN_SPIDER_DAY1, PROGRESSIVE_WALLET, {Category::cGreatBayCoast ,Category::cDayOne, Category::cMainInventory}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GREAT_BAY_COAST ); @@ -168,7 +170,8 @@ void LocationTable_Init() { locationTable[S_CLOCK_TOWN_BANK_REWARD_1] = ItemLocation::Base (0x6F, 0x48, false, "SCT Bank Reward 1 (200)", S_CLOCK_TOWN_BANK_REWARD_1, PROGRESSIVE_WALLET, {Category::cSouthClockTown,Category::cDayOne, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_S_CLOCK_TOWN ); locationTable[S_CLOCK_TOWN_BANK_REWARD_2] = ItemLocation::Base (0x6F, 0x03, false, "SCT Bank Reward 2 (500)", S_CLOCK_TOWN_BANK_REWARD_2, BLUE_RUPEE, {Category::cSouthClockTown,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_S_CLOCK_TOWN ); locationTable[S_CLOCK_TOWN_BANK_REWARD_3] = ItemLocation::Base (0x6F, 0x0C, false, "SCT Bank Reward 3 (1000)", S_CLOCK_TOWN_BANK_REWARD_3, PIECE_OF_HEART, {Category::cSouthClockTown, Category::cVanillaHeartPiece,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_S_CLOCK_TOWN ); - + locationTable[S_CLOCK_TOWN_SWAMP_SCRUB_PURCHASE] = ItemLocation::Base (0x6F, 0x35, true, "SCT Swamp Scrub Purchase", S_CLOCK_TOWN_SWAMP_SCRUB_PURCHASE, MAGIC_BEAN, {Category::cSouthClockTown, Category::cDekuScrub,Category::cDayOne, Category::cTradeItem, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_S_CLOCK_TOWN ); + //Snowhead locationTable[SNOWHEAD_GREAT_FAIRY] = ItemLocation::Base (0x26, 0x2B, false, "SH Great Fairy", SNOWHEAD_GREAT_FAIRY, PROGRESSIVE_MAGIC_METER, {Category::cSnowhead, Category::cFairyFountain,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SNOWHEAD ); @@ -191,6 +194,8 @@ void LocationTable_Init() { locationTable[SOUTHERN_SWAMP_SCRUB_PURCHASE_CLEAR] = ItemLocation::Base (0x00, 0x35, true, "SS Deku Scrub Merchant Purchase (Cleared)", SOUTHERN_SWAMP_SCRUB_PURCHASE_CLEAR, MAGIC_BEAN, {Category::cSouthernSwamp, Category::cDekuScrub,Category::cDayOne, Category::cShop, Category::cAlternateCheck}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); locationTable[SWAMP_TOURIST_CENTER_ROOF_CLEAR] = ItemLocation::Collectable(0x00, 0x00, false, "SS Tourist Center Roof (Cleared)", SWAMP_TOURIST_CENTER_ROOF_CLEAR, PIECE_OF_HEART, {Category::cSouthernSwamp, Category::cVanillaHeartPiece,Category::cDayOne, Category::cAlternateCheck}, SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); locationTable[SOUTHERN_SWAMP_SCRUB_TRADE_CLEAR] = ItemLocation::Base (0x00, 0x98, true, "SS Deku Scrub Merchant Trade (Cleared)", SOUTHERN_SWAMP_SCRUB_TRADE_CLEAR, SWAMP_TITLE, {Category::cSouthernSwamp, Category::cDekuScrub,Category::cDayOne,Category::cTradeItem, Category::cAlternateCheck}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); + locationTable[SOUTHERN_SWAMP_GORON_SCRUB_PURCHASE] = ItemLocation::Base (0x45, 0x1D, false, "SS Goron Scrub Merchant Purchase", SOUTHERN_SWAMP_GORON_SCRUB_PURCHASE, PROGRESSIVE_BOMB_BAG, {Category::cSouthernSwamp, Category::cDekuScrub,Category::cDayOne, Category::cShop, Category::cAlternateCheck}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); + locationTable[SOUTHERN_SWAMP_GORON_SCRUB_PURCHASE_CLEAR] = ItemLocation::Base (0x00, 0x1D, false, "SS Goron Scrub Merchant Purchase (Cleared)", SOUTHERN_SWAMP_GORON_SCRUB_PURCHASE_CLEAR, PROGRESSIVE_BOMB_BAG, {Category::cSouthernSwamp, Category::cDekuScrub,Category::cDayOne, Category::cShop, Category::cAlternateCheck}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP ); //Stock Pot Inn locationTable[STOCKPOTINN_RESERVATION] = ItemLocation::Base (0x61, 0xA0, true, "SPI Reservation", STOCKPOTINN_RESERVATION, ROOM_KEY, {Category::cStockPotInn,Category::cDayOne, Category::cAnjuAndKafei}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_STOCKPOTINN ); @@ -260,7 +265,7 @@ void LocationTable_Init() { //locationTable[ZORA_HALL_STAGE_LIGHTS] = ItemLocation::Base (0x33, 0x00, true, "ZH Stage Lights", ZORA_HALL_STAGE_LIGHTS, BLUE_RUPEE, {Category::cZoraHall}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ZORA_HALL ); //locationTable[ZORA_HALL_BAD_PHOTO_LULU] = ItemLocation::Base (0x4C, 0x00, true, "ZH Bad Photograph of Lulu", ZORA_HALL_SCRUB_TRADE, BLUE_RUPEE, {Category::cZoraHall, Category::cDekuScrub}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ZORA_HALL ); //locationTable[ZORA_HALL_GOOD_PHOTO_LULU] = ItemLocation::Base (0x4C, 0x00, true, "ZH Good Photograph of Lulu", ZORA_HALL_SCRUB_TRADE, BLUE_RUPEE, {Category::cZoraHall, Category::cDekuScrub}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ZORA_HALL ); - + locationTable[ZORA_HALL_IKANA_SCRUB_PURCHASE] = ItemLocation::Base (0x4C, 0x5D, true, "ZH Deku Scrub Merchant Purchase (Ikana)", ZORA_HALL_IKANA_SCRUB_PURCHASE, BLUE_POTION_REFILL, {Category::cZoraHall, Category::cDekuScrub,Category::cDayOne, Category::cShop}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_ZORA_HALL ); /*------------------- --- DUNGEONS -- @@ -825,6 +830,7 @@ std::vector overworldLocations = { //Goron Village GORON_VILLAGE_POWDER_KEG_CHALLENGE, GORON_VILLAGE_SCRUB_PURCHASE, + GORON_VILLAGE_ZORA_SCRUB_PURCHASE, GORON_VILLAGE_LENS_OF_TRUTH_CHEST, GORON_VILLAGE_SCRUB_TRADE, GORON_VILLAGE_LEDGE, @@ -833,6 +839,7 @@ std::vector overworldLocations = { LENS_CAVE_PURPLE_RUPEE, GORON_VILLAGE_POWDER_KEG_CHALLENGE_SPRING, GORON_VILLAGE_SCRUB_PURCHASE_SPRING, + GORON_VILLAGE_ZORA_SCRUB_PURCHASE_SPRING, GORON_VILLAGE_SCRUB_TRADE_SPRING, GORON_VILLAGE_LEDGE_SPRING, GORON_SHOP_ITEM_1, @@ -936,6 +943,7 @@ std::vector overworldLocations = { DOGGY_RACETRACK_ROOF_CHEST, //S Clock Town S_CLOCK_TOWN_SCRUB_TRADE, + S_CLOCK_TOWN_SWAMP_SCRUB_PURCHASE, S_CLOCK_TOWN_POSTBOX, S_CLOCK_TOWN_CLOCK_TOWER_ENTRANCE, S_CLOCK_TOWN_STRAW_ROOF_CHEST, @@ -961,7 +969,9 @@ std::vector overworldLocations = { //SOUTHERN_SWAMP_PICTOGRAPH_STANDARD, //SOUTHERN_SWAMP_PICTOGRAPH_GOOD, SOUTHERN_SWAMP_SCRUB_PURCHASE, + SOUTHERN_SWAMP_GORON_SCRUB_PURCHASE, SOUTHERN_SWAMP_SCRUB_PURCHASE_CLEAR, + SOUTHERN_SWAMP_GORON_SCRUB_PURCHASE_CLEAR, SOUTHERN_SWAMP_SCRUB_TRADE_CLEAR, SWAMP_TOURIST_CENTER_ROOF_CLEAR, POTION_SHOP_ITEM_1, @@ -1047,6 +1057,7 @@ std::vector overworldLocations = { ZORA_HALL_EVAN, ZORA_HALL_LULU_ROOM_LEDGE, ZORA_HALL_SCRUB_PURCHASE, + ZORA_HALL_IKANA_SCRUB_PURCHASE, //ZORA_HALL_STAGE_LIGHTS, //ZORA_HALL_BAD_PHOTO_LULU, //ZORA_HALL_GOOD_PHOTO_LULU, @@ -1241,6 +1252,17 @@ void CreateItemOverrides() { PlaceItemInLocation(W_CLOCK_TOWN_CURIOSITY_BOMB_BAG, loc24->GetPlacedItemKey()); auto loc25 = Location(LAUNDRY_POOL_SF); PlaceItemInLocation(E_CLOCK_TOWN_SF, loc25->GetPlacedItemKey()); + //Scrubsanity - make sure all scrubs have the same item in both locations + auto loc26 = Location(SOUTHERN_SWAMP_SCRUB_PURCHASE); + auto loc27 = Location(GORON_VILLAGE_SCRUB_PURCHASE); + auto loc28 = Location(ZORA_HALL_SCRUB_PURCHASE); + auto loc29 = Location(IKANA_CANYON_SCRUB_PURCHASE); + PlaceItemInLocation(S_CLOCK_TOWN_SWAMP_SCRUB_PURCHASE, loc26->GetPlacedItemKey()); + PlaceItemInLocation(SOUTHERN_SWAMP_GORON_SCRUB_PURCHASE, loc27->GetPlacedItemKey()); + PlaceItemInLocation(SOUTHERN_SWAMP_GORON_SCRUB_PURCHASE_CLEAR, loc27->GetPlacedItemKey()); + PlaceItemInLocation(GORON_VILLAGE_ZORA_SCRUB_PURCHASE, loc28->GetPlacedItemKey()); + PlaceItemInLocation(GORON_VILLAGE_ZORA_SCRUB_PURCHASE_SPRING, loc28->GetPlacedItemKey()); + PlaceItemInLocation(ZORA_HALL_IKANA_SCRUB_PURCHASE, loc29->GetPlacedItemKey()); for (LocationKey locKey : allLocations) { auto loc = Location(locKey); diff --git a/source/item_pool.cpp b/source/item_pool.cpp index 01ad571..2472325 100644 --- a/source/item_pool.cpp +++ b/source/item_pool.cpp @@ -651,6 +651,7 @@ static void PlaceVanillaShopItems() { }; static void PlaceVanillaScrubPurchases() { + PlaceItemInLocation(SOUTHERN_SWAMP_SCRUB_PURCHASE, MAGIC_BEAN); PlaceItemInLocation(GORON_VILLAGE_SCRUB_PURCHASE, PROGRESSIVE_BOMB_BAG); PlaceItemInLocation(GORON_VILLAGE_SCRUB_PURCHASE_SPRING, PROGRESSIVE_BOMB_BAG); PlaceItemInLocation(IKANA_CANYON_SCRUB_PURCHASE, BLUE_POTION_REFILL); @@ -729,9 +730,6 @@ void GenerateItemPool() { PlaceItemInLocation(W_CLOCK_TOWN_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG); PlaceItemInLocation(W_CLOCK_TOWN_BIG_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG); PlaceItemInLocation(W_CLOCK_TOWN_CURIOSITY_BOMB_BAG, PROGRESSIVE_BOMB_BAG); - - //temp placement until shopsanity works - PlaceItemInLocation(SOUTHERN_SWAMP_SCRUB_PURCHASE, MAGIC_BEAN); //Place Temp Items at alt locations so they don't get filled with important stuff - will be replaced later PlaceItemInLocation(SOUTHERN_SWAMP_KOTAKE_IN_WOODS, BLUE_RUPEE); @@ -748,6 +746,13 @@ void GenerateItemPool() { PlaceItemInLocation(SWAMP_TOURIST_CENTER_ROOF_CLEAR, BLUE_RUPEE); PlaceItemInLocation(STONE_TOWER_TEMPLE_UPRIGHT_DEATH_ARMOS_ROOM_CHEST, BLUE_RUPEE); PlaceItemInLocation(E_CLOCK_TOWN_SF, BLUE_RUPEE); + PlaceItemInLocation(S_CLOCK_TOWN_SWAMP_SCRUB_PURCHASE, BLUE_RUPEE); + PlaceItemInLocation(SOUTHERN_SWAMP_GORON_SCRUB_PURCHASE, BLUE_RUPEE); + PlaceItemInLocation(SOUTHERN_SWAMP_GORON_SCRUB_PURCHASE_CLEAR, BLUE_RUPEE); + PlaceItemInLocation(GORON_VILLAGE_ZORA_SCRUB_PURCHASE, BLUE_RUPEE); + PlaceItemInLocation(GORON_VILLAGE_ZORA_SCRUB_PURCHASE_SPRING, BLUE_RUPEE); + PlaceItemInLocation(ZORA_HALL_IKANA_SCRUB_PURCHASE, BLUE_RUPEE); + //Check Non Dungeon Settings //OCARINA SHUFFLE @@ -999,6 +1004,7 @@ void GenerateItemPool() { AddItemsToPool(ItemPool, normalRupees); PlaceVanillaShopItems(); } + //SCRUBSANITY if (Scrubsanity) { AddItemsToPool(ItemPool, scrubPurchases); } diff --git a/source/location_access.cpp b/source/location_access.cpp index 60bc5dc..f6c8643 100644 --- a/source/location_access.cpp +++ b/source/location_access.cpp @@ -550,6 +550,7 @@ void AreaTable_Init() { { //Locations LocationAccess(S_CLOCK_TOWN_SCRUB_TRADE, {[] {return MoonsTear;}}), + LocationAccess(S_CLOCK_TOWN_SWAMP_SCRUB_PURCHASE, {[] {return CanTradeTownDeed;}}), LocationAccess(S_CLOCK_TOWN_POSTBOX, {[] {return PostmansHat;}}), LocationAccess(S_CLOCK_TOWN_CLOCK_TOWER_ENTRANCE, {[] {return true;}}), LocationAccess(S_CLOCK_TOWN_STRAW_ROOF_CHEST, {[] {return Hookshot || (DekuMask && MoonsTear);}}), @@ -869,15 +870,18 @@ void AreaTable_Init() { EventAccess(&SpringWater, {[]{return AnyBottle;}}), EventAccess(&SwampFrog, {[]{return DonGerosMask;}}), EventAccess(&DekuBabaNuts, {[]{return Fighting;}}), + EventAccess(&CanTradeTownDeed, {[]{return LandTitle;}}), }, { //Locations LocationAccess(SOUTHERN_SWAMP_SCRUB_TRADE, {[] {return LandTitle;}}), LocationAccess(SOUTHERN_SWAMP_SCRUB_PURCHASE, {[]{return DekuMask;}}), + LocationAccess(SOUTHERN_SWAMP_GORON_SCRUB_PURCHASE, {[] {return CanTradeSwampDeed;}}), LocationAccess(SOUTHERN_SWAMP_MUSIC_STATUE, {[] {return true;}}), LocationAccess(SWAMP_TOURIST_CENTER_ROOF, {[] {return DekuMask && LandTitle;}}), LocationAccess(SOUTHERN_SWAMP_SCRUB_TRADE_CLEAR, {[] {return LandTitle && WoodfallClear;}}), LocationAccess(SOUTHERN_SWAMP_SCRUB_PURCHASE_CLEAR, {[]{return DekuMask && WoodfallClear;}}), + LocationAccess(SOUTHERN_SWAMP_GORON_SCRUB_PURCHASE_CLEAR, {[] {return CanTradeSwampDeed && WoodfallClear;}}), LocationAccess(SWAMP_TOURIST_CENTER_ROOF_CLEAR, {[] {return DekuMask && LandTitle && WoodfallClear;}}), //Gossip Stones LocationAccess(SS_GOSSIP, {[] {return true;}}), @@ -1230,15 +1234,18 @@ void AreaTable_Init() { areaTable[GORON_VILLAGE] = Area("Goron Village", "Goron Village", GORON_VILLAGE, { //Events //Owl talk? + EventAccess(&CanTradeSwampDeed, {[]{return SwampTitle && DekuMask;}}), }, { //Locations LocationAccess(GORON_VILLAGE_POWDER_KEG_CHALLENGE, {[] {return GoronMask && (SnowheadClear || CanUse(FIRE_ARROWS));}}), LocationAccess(GORON_VILLAGE_SCRUB_PURCHASE, {[] {return AnyWallet && GoronMask && (ProgressiveBombBag >= 2);}}), + LocationAccess(GORON_VILLAGE_ZORA_SCRUB_PURCHASE, {[] {return CanTradeMountainDeed;}}), LocationAccess(GORON_VILLAGE_SCRUB_TRADE, {[] {return DekuMask && SwampTitle;}}), LocationAccess(GORON_VILLAGE_LEDGE, {[] {return DekuMask && SwampTitle;}}), LocationAccess(GORON_VILLAGE_POWDER_KEG_CHALLENGE_SPRING, {[] {return GoronMask && (SnowheadClear || CanUse(FIRE_ARROWS));}}), LocationAccess(GORON_VILLAGE_SCRUB_PURCHASE_SPRING, {[] {return AnyWallet && GoronMask && (ProgressiveBombBag >= 2);}}), + LocationAccess(GORON_VILLAGE_ZORA_SCRUB_PURCHASE_SPRING, {[] {return CanTradeMountainDeed;}}), LocationAccess(GORON_VILLAGE_SCRUB_TRADE_SPRING, {[] {return DekuMask && SwampTitle;}}), LocationAccess(GORON_VILLAGE_LEDGE_SPRING, {[] {return DekuMask && SwampTitle;}}), }, @@ -1671,12 +1678,14 @@ void AreaTable_Init() { areaTable[ZORA_HALL_LULUS_ROOM] = Area("Zora Hall Lulu's Room", "Zora Hall Lulu's Room", NONE, { //Events + EventAccess(&CanTradeMountainDeed, {[] {return MountainTitle && GoronMask;}}), }, { //Locations LocationAccess(ZORA_HALL_SCRUB_TRADE, {[] {return GoronMask && MountainTitle;}}), LocationAccess(ZORA_HALL_LULU_ROOM_LEDGE, {[] {return GoronMask && DekuMask && MountainTitle;}}), LocationAccess(ZORA_HALL_SCRUB_PURCHASE, {[] {return ZoraMask;}}), + LocationAccess(ZORA_HALL_IKANA_SCRUB_PURCHASE, {[] {return HasBottle && CanTradeOceanDeed;}}), }, { //Exits @@ -1895,6 +1904,7 @@ void AreaTable_Init() { areaTable[IKANA_CANYON] = Area("Lower Ikana Canyon", "Lower Ikana Canyon", IKANA_CANYON, { //Events EventAccess(&EnterSakonHideout, {[]{return SpokeToKafei;}}),//Sakon spawns if Kafei was met in Laundry Pool + EventAccess(&CanTradeOceanDeed, {[] {return OceanTitle && ZoraMask;}}), }, { //Locations diff --git a/source/logic.cpp b/source/logic.cpp index 413726e..e222647 100644 --- a/source/logic.cpp +++ b/source/logic.cpp @@ -322,6 +322,10 @@ namespace Logic { bool Milk = false; bool SpokeToKafei = false; bool PostedKafeiLetter = false; + bool CanTradeTownDeed = false; + bool CanTradeSwampDeed = false; + bool CanTradeMountainDeed = false; + bool CanTradeOceanDeed = false; bool CanGoToMoon = false; @@ -879,7 +883,10 @@ namespace Logic { Milk = false; SpokeToKafei = false; PostedKafeiLetter = false; - + CanTradeTownDeed = false; + CanTradeSwampDeed = false; + CanTradeMountainDeed = false; + CanTradeOceanDeed = false; ZoraEgg = 0; CanGoToMoon = false; From 4f21dba567f7a7fb19c963b89ae634bb0987961e Mon Sep 17 00:00:00 2001 From: PhlexPlexico <3514085+PhlexPlexico@users.noreply.github.com> Date: Tue, 8 Sep 2026 16:51:35 -0600 Subject: [PATCH 35/63] feat: Include In-Game Option menu during save creation. (#205) --- Z3DR | 2 +- source/include/setting_descriptions.hpp | 9 +++++++- source/include/settings.hpp | 7 ++++++ source/setting_descriptions.cpp | 18 ++++++++++++++- source/settings.cpp | 29 +++++++++++++++++++++++++ 5 files changed, 62 insertions(+), 3 deletions(-) diff --git a/Z3DR b/Z3DR index 19dbafc..82c0c77 160000 --- a/Z3DR +++ b/Z3DR @@ -1 +1 @@ -Subproject commit 19dbafc96d52e0e4023caed57186969a49bcc9d9 +Subproject commit 82c0c773bcb9c69664c20cb1b8f67a1ca9902fe3 diff --git a/source/include/setting_descriptions.hpp b/source/include/setting_descriptions.hpp index 15ed4ce..63e73c4 100644 --- a/source/include/setting_descriptions.hpp +++ b/source/include/setting_descriptions.hpp @@ -242,4 +242,11 @@ extern string_view startingSwordGildedDesc; extern string_view startingShieldNoneDesc; extern string_view startingShieldHerosDesc; extern string_view startingShieldMirrorDesc; -extern string_view showPostmanItemDesc; \ No newline at end of file +extern string_view showPostmanItemDesc; + +extern string_view ingameLTargetingDesc; +extern string_view ingameFirstPersonCameraDesc; +extern string_view ingameFreeCameraDesc; +extern string_view ingameMotionControlsDesc; +extern string_view ingameSwimmingControlsDesc; +extern string_view ingameAdjustVolumeDesc; \ No newline at end of file diff --git a/source/include/settings.hpp b/source/include/settings.hpp index 6f8384b..9864a7d 100644 --- a/source/include/settings.hpp +++ b/source/include/settings.hpp @@ -570,6 +570,13 @@ namespace Settings { //Custom Buttons extern Menu customInputs; extern std::vector customButtons; + extern Option IngameLTargeting; + extern Option IngameFirstPersonCamera; + extern Option IngameFreeCamera; + extern Option IngameMotionControls; + extern Option IngameSwimmingControls; + extern Option IngameAdjustVolume; + extern Option CustomMapButton; extern Option CustomItemsButton; extern Option CustomMasksButton; diff --git a/source/setting_descriptions.cpp b/source/setting_descriptions.cpp index e9220c1..9b5813f 100644 --- a/source/setting_descriptions.cpp +++ b/source/setting_descriptions.cpp @@ -662,4 +662,20 @@ string_view startingShieldMirrorDesc = "Start with the Mirror Shield.\n" ------------------------------*/ // string_view showPostmanItemDesc = "Visually shows the reward for the \n" // "Postman's Freedom quest line \n" // - "above the Postman's head."; // \ No newline at end of file + "above the Postman's head."; // + +/*------------------------------ +| IN-GAME OPTIONS | +------------------------------*/ +string_view ingameLTargetingDesc = "Sets the L-Targeting mode on a new file.\n" // + "\"Vanilla\" is the game's default."; // +string_view ingameFirstPersonCameraDesc = "Sets the first person camera's inversion on a\n"// + "new file. \"Vanilla\" is the game's default."; // +string_view ingameFreeCameraDesc = "Sets the free camera's inversion on a new\n" // + "file. \"Vanilla\" is the game's default."; // +string_view ingameMotionControlsDesc = "Enables or disables motion controls on a new\n" // + "file. \"Vanilla\" is the game's default."; // +string_view ingameSwimmingControlsDesc = "Sets the Zora swimming control scheme on a new\n"// + "file. \"Vanilla\" is the game's default."; // +string_view ingameAdjustVolumeDesc = "Sets the overall volume on a new file.\n" // + "\"Vanilla\" is the game's default."; // diff --git a/source/settings.cpp b/source/settings.cpp index e55e283..80559b2 100644 --- a/source/settings.cpp +++ b/source/settings.cpp @@ -494,6 +494,26 @@ namespace Settings { Option BombchusInLogic = Option::U8("Bombchus In Logic", { "Off", "On" }, { bombchuInLogicDesc }); Option FastMasks = Option::Bool("Fast Mask Transform", {"No", "Yes"}, {fastMaskDesc}); Option NotebookAnimations = Option::Bool("Fast Notebook", {"No", "Yes"}, {disableBotebookAnimation}); + // In-game options written into CommonDataSub1 when a new file is created. Index 0 is + // "Vanilla" throughout, which leaves the game's own default in place -- only the Adjust + // Volume encoding (0 Lower / 1 Normal / 2 Higher) is confirmed against the save data, so the + // rest are opt-in rather than applied silently. + Option IngameLTargeting = Option::U8("L-Targeting", {"Vanilla", "Switch", "Hold"}, {ingameLTargetingDesc}); + Option IngameFirstPersonCamera = Option::U8("First Person Camera", {"Vanilla", "Normal", "Invert Y Axis", "Invert X Axis", "Invert Both"}, {ingameFirstPersonCameraDesc}); + Option IngameFreeCamera = Option::U8("Free Camera", {"Vanilla", "Normal", "Invert Y Axis", "Invert X Axis", "Invert Both"}, {ingameFreeCameraDesc}); + Option IngameMotionControls = Option::U8("Motion Controls", {"Vanilla", "On", "Off"}, {ingameMotionControlsDesc}); + Option IngameSwimmingControls = Option::U8("Swimming Controls", {"Vanilla", "Normal", "Invert Y Axis"}, {ingameSwimmingControlsDesc}); + Option IngameAdjustVolume = Option::U8("Adjust Volume", {"Vanilla", "Lower", "Normal", "Higher"}, {ingameAdjustVolumeDesc}); + + std::vector ingameOptions = { + &IngameLTargeting, + &IngameFirstPersonCamera, + &IngameFreeCamera, + &IngameMotionControls, + &IngameSwimmingControls, + &IngameAdjustVolume, + }; + std::vector comfortOptions = { &BlastMaskCooldown, @@ -707,6 +727,7 @@ namespace Settings { //Menu mainSettings = Menu::SubMenu("Main Settings", &mainSettingsOptions); Menu comfort = Menu::SubMenu("Comfort Settings", &comfortOptions); + Menu ingameOptionsMenu = Menu::SubMenu("In-Game Options", &ingameOptions); Menu restorationSettings = Menu::SubMenu("Restoration Settings", &restorationOptions); Menu cutsceneSettings = Menu::SubMenu("Cutscene Settings", &cutsceneOptions); Menu settingsPresets = Menu::SubMenu("Settings Presets", &settingsPresetItems); @@ -733,6 +754,7 @@ namespace Settings { &cutsceneSettings, &otherSettings, &customInputs, + &ingameOptionsMenu, &cosmetics, &settingsPresets, &generateRandomizer, @@ -868,6 +890,13 @@ namespace Settings { ctx.startingLightArrows = StartingLightArrows.Value(); ctx.startingLensOfTruth = StartingLensOfTruth.Value(); ctx.startingMagicBean = StartingMagicBean.Value(); + + ctx.ingameLTargeting = IngameLTargeting.Value(); + ctx.ingameFirstPersonCamera = IngameFirstPersonCamera.Value(); + ctx.ingameFreeCamera = IngameFreeCamera.Value(); + ctx.ingameMotionControls = IngameMotionControls.Value(); + ctx.ingameSwimmingControls = IngameSwimmingControls.Value(); + ctx.ingameAdjustVolume = IngameAdjustVolume.Value(); ctx.startingPowderKeg = StartingPowderKeg.Value(); ctx.startingPictographBox = StartingPictographBox.Value(); ctx.startingGreatFairySword = StartingGreatFairySword.Value(); From 71011b5f0d1af65034c428078a186fa63aca5f5e Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Sun, 13 Sep 2026 18:41:30 -0500 Subject: [PATCH 36/63] Beansanity - Unhides Beansanity setting allowing players to enable it - Implements new Logic related to Beans - Magic Bean Pack implemented as initial way to enable ability to buy Beans from any shop - Adjust Item Pool to add Magic Bean Pack to pool if setting is enabled - Adjust vanilla item for Bean Seller to be Magic Bean Pack to prevent issues with logic when not Beansanity is not enabled - Adjust placement logic so that Magic Bean Pack will not be placed in a shop since you cannot buy beans before obtaining the initial pack - Adjust logic on Scrub Purchases to include needing previous deed when scrub is moved. (I.E If the Goron Village Scrub is given the Swamp Title Deed but the Swamp Scrub is not given the Land Title Deed when you return to the Swamp the Swamp Scrub is still in the flower preventing the purchase of the Bomb Bag from the Goron Village Scrub) - Addition of basic messages for Bean Daddy and Scrub Purchases --- Z3DR | 2 +- source/fill.cpp | 4 ++++ source/hints.cpp | 39 ++++++++++++++++++++++++++++++++++++++ source/include/logic.hpp | 1 + source/item_location.cpp | 2 +- source/item_pool.cpp | 22 ++++++--------------- source/location_access.cpp | 18 +++++++++--------- source/logic.cpp | 5 ++++- source/settings.cpp | 2 +- 9 files changed, 66 insertions(+), 29 deletions(-) diff --git a/Z3DR b/Z3DR index 82c0c77..e0991d3 160000 --- a/Z3DR +++ b/Z3DR @@ -1 +1 @@ -Subproject commit 82c0c773bcb9c69664c20cb1b8f67a1ca9902fe3 +Subproject commit e0991d312df18ad3cff0f9fcfcf6c2c17baddae2 diff --git a/source/fill.cpp b/source/fill.cpp index fb317b8..4137218 100644 --- a/source/fill.cpp +++ b/source/fill.cpp @@ -522,6 +522,10 @@ static void AssumedFill(const std::vector& items, const std::vectorGetName()); itemsToPlace.push_back(item); } + else if (Location(selectedLocation)->IsCategory(Category::cShop) && (item == MAGIC_BEAN_PACK)) { + //Magic Bean Pack is what enables buying beans at shops so it cannot go into a shop itself + itemsToPlace.push_back(item); + } else { PlaceItemInLocation(selectedLocation, item); //PlacementLog_Msg("Placed " + ItemTable(item).GetName().GetNAEnglish() + " at " + Location(selectedLocation)->GetName()); diff --git a/source/hints.cpp b/source/hints.cpp index a157241..84f3848 100644 --- a/source/hints.cpp +++ b/source/hints.cpp @@ -633,6 +633,42 @@ void CreateShopMessages() { } }; +void CreateBeanDaddyHint() { + CustomMessages::CreateMessageFromTextObject(0x92f, 0x930, 0x3FFFFFFF, 0xFF0000, Text{ + /*NaEnglish*/"Do you need a #Mysterious Item#? ", + /*NaFrench */"", + /*NaSpanish*/"", + /*EuGerman */"", + // /*EuItalian*/"", + /*EuEnglish*/"", + /*EuFrench */"", + /*EuSpanish*/"", + }, {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_EVENTNEXT); +}; + +void CreateScrubPurchaseText() { + Text SwampScrubItem = ItemTable(Location(SOUTHERN_SWAMP_SCRUB_PURCHASE)->GetPlacedItemKey()).GetHint().GetText(); + CustomMessages::CreateMessageFromTextObject(0x15e9, 0xFFFF, 0x3FFFFFFF, 0xFF0000, Text{ + /*NaEnglish*/"Do you know what #" , + /*NaFrench */"", + /*NaSpanish*/"", + /*EuGerman */"", + // /*EuItalian*/"", + /*EuEnglish*/"", + /*EuFrench */"", + /*EuSpanish*/"",} + + SwampScrubItem + Text{ + /*NaEnglish*/" are, sir? I'll sell you one for #20 Rupees#.", + /*NaFrench */"", + /*NaSpanish*/"", + /*EuGerman */"", + // /*EuItalian*/"", + /*EuEnglish*/"", + /*EuFrench */"", + /*EuSpanish*/"", + },{QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_EVENTNEXT); +}; + void CreateOtherHints() { // Create other hints for various texts @@ -1044,6 +1080,9 @@ static Text BuildCountReq(const HintKey req, const Option& count) { void CreateAllHints() { //CreateGanonText(); + if (Scrubsanity) { + CreateScrubPurchaseText(); + } PlacementLog_Msg("\nNOW CREATING HINTS\n"); const HintSetting& hintSetting = hintSettingTable[Settings::HintDistribution.Value()]; diff --git a/source/include/logic.hpp b/source/include/logic.hpp index 9d106e0..c1f85a4 100644 --- a/source/include/logic.hpp +++ b/source/include/logic.hpp @@ -335,6 +335,7 @@ namespace Logic { extern bool CanTradeSwampDeed; extern bool CanTradeMountainDeed; extern bool CanTradeOceanDeed; + extern bool CanBuyBeans; extern bool CanGoToMoon; extern bool RemainsForMoon; diff --git a/source/item_location.cpp b/source/item_location.cpp index 3f935e2..2ac4654 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -26,7 +26,7 @@ void LocationTable_Init() { locationTable[HMS_STARTING_SHIELD] = ItemLocation::Base (0x00, 0x32, false, "Starting Shield", HMS_STARTING_SHIELD, HEROS_SHIELD, {Category::cClockTower, Category::cAlternateCheck}, SpoilerCollectionCheck::ItemGetInf(6), SpoilerCollectionCheckGroup::GROUP_NO_GROUP ); //Deku Palace - locationTable[DEKU_PALACE_BEAN_SELLER] = ItemLocation::Base (0x07, 0x35, true, "DP Bean Seller", DEKU_PALACE_BEAN_SELLER, MAGIC_BEAN, {Category::cDekuPalace,Category::cWoodfall,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_DEKU_PALACE ); + locationTable[DEKU_PALACE_BEAN_SELLER] = ItemLocation::Base (0x07, 0x35, true, "DP Bean Seller", DEKU_PALACE_BEAN_SELLER, MAGIC_BEAN_PACK, {Category::cDekuPalace,Category::cWoodfall,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_DEKU_PALACE ); locationTable[DEKU_PALACE_WEST_GARDEN] = ItemLocation::Collectable(0x2B, 0x00, false, "DP West Garden", DEKU_PALACE_WEST_GARDEN, PIECE_OF_HEART, {Category::cDekuPalace,Category::cWoodfall, Category::cFreestandingItems, Category::cVanillaHeartPiece,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_DEKU_PALACE ); locationTable[DEKU_PALACE_BUTLER_RACE] = ItemLocation::Base (0x52, 0x8E, false, "DP Butler Race", DEKU_PALACE_BUTLER_RACE, MASK_OF_SCENTS, {Category::cDekuPalace,Category::cWoodfall, Category::cVanillaMask,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_DEKU_PALACE ); locationTable[DEKU_PALACE_IMPRISONED_MONKEY] = ItemLocation::Base (0x3E, 0x4B, false, "DP Imprisoned Monkey", DEKU_PALACE_IMPRISONED_MONKEY, SONATA_OF_AWAKENING, {Category::cDekuPalace,Category::cSong,Category::cWoodfall,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_DEKU_PALACE ); diff --git a/source/item_pool.cpp b/source/item_pool.cpp index 2472325..69dd947 100644 --- a/source/item_pool.cpp +++ b/source/item_pool.cpp @@ -797,26 +797,16 @@ void GenerateItemPool() { PlaceVanillaCowMilk(); } - //MAGIC BEAN SHUFFLE--NEEDS WORK - PlaceItemInLocation(DEKU_PALACE_BEAN_SELLER, MAGIC_BEAN);//vanilla for now because replacing causes odd occurances where you cannot buy beans elsewhere - /* - if(ShuffleMagicBeans) { //does not shuffle bean salesman yet - AddItemToMainPool(MAGIC_BEAN); + //MAGIC BEAN SHUFFLE + if(ShuffleMagicBeans) { + AddItemToMainPool(MAGIC_BEAN_PACK); if (ItemPoolValue.Is(ItemPoolSetting::ITEMPOOL_PLENTIFUL)){ - AddItemToPool(PendingJunkPool, MAGIC_BEAN); + AddItemToPool(PendingJunkPool, MAGIC_BEAN_PACK); } IceTrapModels.push_back(0x75); - - if(Shopsanity){ - AddItemToMainPool(MAGIC_BEAN); - if (ItemPoolValue.Is(ItemPoolSetting::ITEMPOOL_PLENTIFUL)){ - AddItemToPool(PendingJunkPool, MAGIC_BEAN); - } - } } else { - PlaceItemInLocation(STONE_TOWER_INVERTED_LEFT_CHEST, MAGIC_BEAN); - if(!Shopsanity){PlaceItemInLocation(SOUTHERN_SWAMP_SCRUB_PURCHASE, MAGIC_BEAN);} - }*/ + PlaceItemInLocation(DEKU_PALACE_BEAN_SELLER, MAGIC_BEAN_PACK); + } //MAININVENTORY SHUFFLE if(ShuffleMainInventory){ diff --git a/source/location_access.cpp b/source/location_access.cpp index f6c8643..7e5ec0b 100644 --- a/source/location_access.cpp +++ b/source/location_access.cpp @@ -876,12 +876,12 @@ void AreaTable_Init() { //Locations LocationAccess(SOUTHERN_SWAMP_SCRUB_TRADE, {[] {return LandTitle;}}), LocationAccess(SOUTHERN_SWAMP_SCRUB_PURCHASE, {[]{return DekuMask;}}), - LocationAccess(SOUTHERN_SWAMP_GORON_SCRUB_PURCHASE, {[] {return CanTradeSwampDeed;}}), + LocationAccess(SOUTHERN_SWAMP_GORON_SCRUB_PURCHASE, {[] {return CanTradeSwampDeed && LandTitle;}}), LocationAccess(SOUTHERN_SWAMP_MUSIC_STATUE, {[] {return true;}}), LocationAccess(SWAMP_TOURIST_CENTER_ROOF, {[] {return DekuMask && LandTitle;}}), LocationAccess(SOUTHERN_SWAMP_SCRUB_TRADE_CLEAR, {[] {return LandTitle && WoodfallClear;}}), LocationAccess(SOUTHERN_SWAMP_SCRUB_PURCHASE_CLEAR, {[]{return DekuMask && WoodfallClear;}}), - LocationAccess(SOUTHERN_SWAMP_GORON_SCRUB_PURCHASE_CLEAR, {[] {return CanTradeSwampDeed && WoodfallClear;}}), + LocationAccess(SOUTHERN_SWAMP_GORON_SCRUB_PURCHASE_CLEAR, {[] {return CanTradeSwampDeed && LandTitle && WoodfallClear;}}), LocationAccess(SWAMP_TOURIST_CENTER_ROOF_CLEAR, {[] {return DekuMask && LandTitle && WoodfallClear;}}), //Gossip Stones LocationAccess(SS_GOSSIP, {[] {return true;}}), @@ -1023,7 +1023,7 @@ void AreaTable_Init() { areaTable[DEKU_PALACE_BEAN_GROTTO] = Area("Deku Palace Bean Grotto", "Deku Palace Bean Grotto", NONE, { //Events - EventAccess(&LimitlessBeans, {[]{return true;}}), + EventAccess(&LimitlessBeans, {[]{return CanBuyBeans;}}), EventAccess(&SpringWater, {[]{return AnyBottle;}}), EventAccess(&Mushroom, {[]{return false;}}),//Trick for obscure mushroom? EventAccess(&Bugs, {[]{return AnyBottle;}}), @@ -1240,14 +1240,14 @@ void AreaTable_Init() { //Locations LocationAccess(GORON_VILLAGE_POWDER_KEG_CHALLENGE, {[] {return GoronMask && (SnowheadClear || CanUse(FIRE_ARROWS));}}), LocationAccess(GORON_VILLAGE_SCRUB_PURCHASE, {[] {return AnyWallet && GoronMask && (ProgressiveBombBag >= 2);}}), - LocationAccess(GORON_VILLAGE_ZORA_SCRUB_PURCHASE, {[] {return CanTradeMountainDeed;}}), + LocationAccess(GORON_VILLAGE_ZORA_SCRUB_PURCHASE, {[] {return CanTradeMountainDeed && SwampTitle;}}), LocationAccess(GORON_VILLAGE_SCRUB_TRADE, {[] {return DekuMask && SwampTitle;}}), LocationAccess(GORON_VILLAGE_LEDGE, {[] {return DekuMask && SwampTitle;}}), LocationAccess(GORON_VILLAGE_POWDER_KEG_CHALLENGE_SPRING, {[] {return GoronMask && (SnowheadClear || CanUse(FIRE_ARROWS));}}), - LocationAccess(GORON_VILLAGE_SCRUB_PURCHASE_SPRING, {[] {return AnyWallet && GoronMask && (ProgressiveBombBag >= 2);}}), - LocationAccess(GORON_VILLAGE_ZORA_SCRUB_PURCHASE_SPRING, {[] {return CanTradeMountainDeed;}}), - LocationAccess(GORON_VILLAGE_SCRUB_TRADE_SPRING, {[] {return DekuMask && SwampTitle;}}), - LocationAccess(GORON_VILLAGE_LEDGE_SPRING, {[] {return DekuMask && SwampTitle;}}), + LocationAccess(GORON_VILLAGE_SCRUB_PURCHASE_SPRING, {[] {return AnyWallet && GoronMask && (ProgressiveBombBag >= 2) && SnowheadClear;}}), + LocationAccess(GORON_VILLAGE_ZORA_SCRUB_PURCHASE_SPRING, {[] {return CanTradeMountainDeed && SwampTitle && SnowheadClear;}}), + LocationAccess(GORON_VILLAGE_SCRUB_TRADE_SPRING, {[] {return DekuMask && SwampTitle && SnowheadClear;}}), + LocationAccess(GORON_VILLAGE_LEDGE_SPRING, {[] {return DekuMask && SwampTitle && SnowheadClear;}}), }, { //Exits @@ -1685,7 +1685,7 @@ void AreaTable_Init() { LocationAccess(ZORA_HALL_SCRUB_TRADE, {[] {return GoronMask && MountainTitle;}}), LocationAccess(ZORA_HALL_LULU_ROOM_LEDGE, {[] {return GoronMask && DekuMask && MountainTitle;}}), LocationAccess(ZORA_HALL_SCRUB_PURCHASE, {[] {return ZoraMask;}}), - LocationAccess(ZORA_HALL_IKANA_SCRUB_PURCHASE, {[] {return HasBottle && CanTradeOceanDeed;}}), + LocationAccess(ZORA_HALL_IKANA_SCRUB_PURCHASE, {[] {return HasBottle && CanTradeOceanDeed && MountainTitle;}}), }, { //Exits diff --git a/source/logic.cpp b/source/logic.cpp index e222647..58cfa4e 100644 --- a/source/logic.cpp +++ b/source/logic.cpp @@ -326,6 +326,7 @@ namespace Logic { bool CanTradeSwampDeed = false; bool CanTradeMountainDeed = false; bool CanTradeOceanDeed = false; + bool CanBuyBeans = false; bool CanGoToMoon = false; @@ -520,12 +521,13 @@ namespace Logic { HasExplosives = AnyBombBag || (BlastMask && AnyShield);//Shield required to use Blast Mask without killing the player //Item Helpers - AnyMagicBean = MagicBean || LimitlessBeans; + AnyMagicBean = (MagicBean && CanBuyBeans) || LimitlessBeans; AnyWallet = Townwallet200 || OceanWallet500 || (ProgressiveWallet >= 1); AnyBottle = WitchBottle || AlienBottle || BeaverRaceBottle || ArcheryBottle || GoronRaceBottle || ChateauBottle || UsableMysteryMilkBottle || HasBottle; MagicMeter = (ProgressiveMagic >= 1) || MagicPower || ExtendedMagicPower; Scarecrow = Hookshot && CanPlay(ScarecrowSong); AnyPaper = (LandTitle || SwampTitle || OceanTitle || MountainTitle || LetterKafei || LetterMama); + CanBuyBeans = MagicBeanPack; //Bombs & Bombchus AnyBombBag = (ProgressiveBombBag >= 1) || BombBag20 || TownBombBag || MountainBombBag; @@ -887,6 +889,7 @@ namespace Logic { CanTradeSwampDeed = false; CanTradeMountainDeed = false; CanTradeOceanDeed = false; + CanBuyBeans = false; ZoraEgg = 0; CanGoToMoon = false; diff --git a/source/settings.cpp b/source/settings.cpp index 80559b2..0dae3dd 100644 --- a/source/settings.cpp +++ b/source/settings.cpp @@ -414,7 +414,7 @@ namespace Settings { &ShuffleTingleMaps, &ShuffleBombersNotebook, &ShuffleCows, - //&ShuffleMagicBeans, + &ShuffleMagicBeans, &ShuffleMoonItems, &ShuffleFierceDeity, }; From 6f9956d61c58986f556ba9135d663b02cec9a9b8 Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Sun, 13 Sep 2026 19:34:52 -0500 Subject: [PATCH 37/63] NonShopItems - Implements NonShopItems functionality borrowed from OOT3DR --- source/fill.cpp | 37 +++++++++++++++++++++++++++++++++++++ source/include/shops.hpp | 2 +- source/spoiler_log.cpp | 5 +++-- 3 files changed, 41 insertions(+), 3 deletions(-) diff --git a/source/fill.cpp b/source/fill.cpp index 4137218..1559d0b 100644 --- a/source/fill.cpp +++ b/source/fill.cpp @@ -1008,6 +1008,43 @@ int Fill() { AssumedFill(gfItems, gfLocations, true); } + + //Place Shop Items first + NonShopItems = {}; + if (Shopsanity){ + ItemAndPrice init; + init.Name = Text{ + /*NaEnglish*/"No Item", + /*NaFrench */"", + /*NaSpanish*/"", + /*EuGerman */"", + // /*EuItalian*/"", + /*EuEnglish*/"", + /*EuFrench */"", + /*EuSpanish*/"", + }; + init.Price = -1; + init.Repurchaseable = false; + NonShopItems.assign(32,init); + for (size_t i = 0; i < ShopLocationLists.size(); i++) { + for (int j = 0; j < ShopLocationLists[i].size(); j++) { + int shopsanityPrice = GetShopPrice(); + NonShopItems[TransformShopIndex(i*8 + j-1)].Price = shopsanityPrice; //Set the price for the item to be passed + Location(ShopLocationLists[i][j-1])->SetShopsanityPrice(shopsanityPrice); //Set the price for the location to be passed + } + } + } + //Below may not be needed? + // //Get all locations and items that dont have a shopsanity price attached + // std::vector shopLocations = {}; + // for (size_t i = 0; i < ShopLocationLists.size(); i++){ + // for (int j = 0; j < ShopLocationLists[i].size(); j++){ + // LocationKey loc = ShopLocationLists[i][j]; + // if (!(Location(loc)->HasShopsanityPrice())) { + // shopLocations.push_back(loc); + // } + // } + // } //Place Main Inventory First //So first get all items in the pool + DekuMask, diff --git a/source/include/shops.hpp b/source/include/shops.hpp index 0514cfa..056de2e 100644 --- a/source/include/shops.hpp +++ b/source/include/shops.hpp @@ -8,7 +8,7 @@ struct ItemAndPrice { Text Name; - int price; + int Price; bool Repurchaseable; }; diff --git a/source/spoiler_log.cpp b/source/spoiler_log.cpp index e6baeb6..8fa7829 100644 --- a/source/spoiler_log.cpp +++ b/source/spoiler_log.cpp @@ -9,6 +9,7 @@ //#include "trial.hpp" #include "tinyxml2.h" #include "utils.hpp" +#include "shops.hpp" #include <3ds.h> #include @@ -302,12 +303,12 @@ static void WriteIngameSpoilerLog() { } auto locItem = loc->GetPlacedItemName().GetNAEnglish(); - /*if (loc->IsCategory(Category::cShop)) { + if (loc->IsCategory(Category::cShop)) { if (loc->GetPlacedItemKey() == ICE_TRAP) { locItem = NonShopItems[TransformShopIndex(GetShopIndex(key))].Name.GetNAEnglish(); } locItem += ": " + std::to_string(loc->GetPrice()) + " Rupees"; - }*/ + } if (stringOffsetMap.find(locItem) == stringOffsetMap.end()) { if (spoilerStringOffset + locItem.size() + 1 >= SPOILER_STRING_DATA_SIZE) { spoilerOutOfSpace = true; From f57b1f4958a6d14b8bdbc1fe3834e62a4e1fc9f7 Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Sun, 13 Sep 2026 19:36:54 -0500 Subject: [PATCH 38/63] Update fill.cpp fix wrong type used --- source/fill.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/fill.cpp b/source/fill.cpp index 1559d0b..6f73ed1 100644 --- a/source/fill.cpp +++ b/source/fill.cpp @@ -1027,7 +1027,7 @@ int Fill() { init.Repurchaseable = false; NonShopItems.assign(32,init); for (size_t i = 0; i < ShopLocationLists.size(); i++) { - for (int j = 0; j < ShopLocationLists[i].size(); j++) { + for (size_t j = 0; j < ShopLocationLists[i].size(); j++) { int shopsanityPrice = GetShopPrice(); NonShopItems[TransformShopIndex(i*8 + j-1)].Price = shopsanityPrice; //Set the price for the item to be passed Location(ShopLocationLists[i][j-1])->SetShopsanityPrice(shopsanityPrice); //Set the price for the location to be passed From cb239543a17a3db370e7d3ff525cfbf998d931cf Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Sun, 13 Sep 2026 20:22:58 -0500 Subject: [PATCH 39/63] ShopPrices - Implement shopsanity prices - Adjust shop assignment logic so assigns every item a price - Adjust Bomb Shop Goron to not be a shop ~ Leaving vanilla for now --- source/fill.cpp | 9 +++++---- source/item_location.cpp | 2 +- source/item_pool.cpp | 7 ++++--- source/settings.cpp | 1 + source/shops.cpp | 4 ++-- 5 files changed, 13 insertions(+), 10 deletions(-) diff --git a/source/fill.cpp b/source/fill.cpp index 6f73ed1..3a833c2 100644 --- a/source/fill.cpp +++ b/source/fill.cpp @@ -1012,6 +1012,7 @@ int Fill() { //Place Shop Items first NonShopItems = {}; if (Shopsanity){ + CitraPrint("Placing Shopsanity Items"); ItemAndPrice init; init.Name = Text{ /*NaEnglish*/"No Item", @@ -1025,12 +1026,12 @@ int Fill() { }; init.Price = -1; init.Repurchaseable = false; - NonShopItems.assign(32,init); + NonShopItems.assign(21,init); for (size_t i = 0; i < ShopLocationLists.size(); i++) { for (size_t j = 0; j < ShopLocationLists[i].size(); j++) { - int shopsanityPrice = GetShopPrice(); - NonShopItems[TransformShopIndex(i*8 + j-1)].Price = shopsanityPrice; //Set the price for the item to be passed - Location(ShopLocationLists[i][j-1])->SetShopsanityPrice(shopsanityPrice); //Set the price for the location to be passed + int shopsanityPrice = GetShopPrice(); + NonShopItems[TransformShopIndex(i*8 + j)].Price = shopsanityPrice; //Set the price for the item to be passed + Location(ShopLocationLists[i][j])->SetShopsanityPrice(shopsanityPrice); //Set the price for the location to be passed } } } diff --git a/source/item_location.cpp b/source/item_location.cpp index 2ac4654..4598857 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -239,7 +239,7 @@ void LocationTable_Init() { locationTable[W_CLOCK_TOWN_SWORDSMANS_SCHOOL] = ItemLocation::Base (0x54, 0x0C, false, "WCT Swordsman's School", W_CLOCK_TOWN_SWORDSMANS_SCHOOL, PIECE_OF_HEART, {Category::cWestClockTown, Category::cVanillaHeartPiece,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); locationTable[W_CLOCK_TOWN_ALL_NIGHT_MASK_BUY] = ItemLocation::Base (0x0D, 0x7E, false, "WCT All-Night Mask Purchase", W_CLOCK_TOWN_ALL_NIGHT_MASK_BUY, ALL_NIGHT_MASK, {Category::cWestClockTown, Category::cVanillaMask,Category::cDayThree}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); //locationTable[W_CLOCK_TOWN_LOTTERY] = ItemLocation::Base (0x39, 0x00, true, "WCT Lottery", W_CLOCK_TOWN_LOTTERY, PURPLE_RUPEE, {Category::cWestClockTown}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); - locationTable[W_CLOCK_TOWN_BOMB_SHOP_GORON] = ItemLocation::Base (0x0D, 0x34, true, "WCT Bomb Shop Goron", W_CLOCK_TOWN_BOMB_SHOP_GORON, POWDER_KEG, {Category::cWestClockTown, Category::cMerchant,Category::cDayOne, Category::cShop, Category::cMainInventory}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); + locationTable[W_CLOCK_TOWN_BOMB_SHOP_GORON] = ItemLocation::Base (0x0D, 0x34, true, "WCT Bomb Shop Goron", W_CLOCK_TOWN_BOMB_SHOP_GORON, POWDER_KEG, {Category::cWestClockTown, Category::cMerchant,Category::cDayOne, Category::cMainInventory}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); locationTable[W_CLOCK_TOWN_CURIOSITY_BOMB_BAG] = ItemLocation::Base (0x0D, 0x1D, true, "WCT Curiosity Shop Bomb Bag", W_CLOCK_TOWN_CURIOSITY_BOMB_BAG, PROGRESSIVE_BOMB_BAG, {Category::cWestClockTown, Category::cDayTwo, Category::cShop, Category::cMainInventory}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_W_CLOCK_TOWN ); //Woodfall locationTable[WOODFALL_BRIDGE_CHEST] = ItemLocation::Chest (0x46, 0x01, true, "WF Bridge Chest", WOODFALL_BRIDGE_CHEST, PIECE_OF_HEART, {Category::cWoodfall, Category::cVanillaHeartPiece, Category::cChest, Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_WOODFALL ); diff --git a/source/item_pool.cpp b/source/item_pool.cpp index 69dd947..385fb61 100644 --- a/source/item_pool.cpp +++ b/source/item_pool.cpp @@ -727,9 +727,10 @@ void GenerateItemPool() { //Fixed Item Locations PlaceItemInLocation(MAJORA, MAJORAS_MASK, true); PlaceItemInLocation(WOODFALL_TEMPLE_DEKU_PRINCESS, DEKU_PRINCESS); - PlaceItemInLocation(W_CLOCK_TOWN_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG); - PlaceItemInLocation(W_CLOCK_TOWN_BIG_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG); - PlaceItemInLocation(W_CLOCK_TOWN_CURIOSITY_BOMB_BAG, PROGRESSIVE_BOMB_BAG); + // PlaceItemInLocation(W_CLOCK_TOWN_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG); + // PlaceItemInLocation(W_CLOCK_TOWN_BIG_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG); + // PlaceItemInLocation(W_CLOCK_TOWN_CURIOSITY_BOMB_BAG, PROGRESSIVE_BOMB_BAG); + PlaceItemInLocation(W_CLOCK_TOWN_BOMB_SHOP_GORON, POWDER_KEG);//Not Randomized for simplicity //Place Temp Items at alt locations so they don't get filled with important stuff - will be replaced later PlaceItemInLocation(SOUTHERN_SWAMP_KOTAKE_IN_WOODS, BLUE_RUPEE); diff --git a/source/settings.cpp b/source/settings.cpp index 0dae3dd..6c4d09f 100644 --- a/source/settings.cpp +++ b/source/settings.cpp @@ -404,6 +404,7 @@ namespace Settings { &ShuffleSongOfTime, &Tokensanity, &Shopsanity, + &ShopsanityPrices, &Scrubsanity, &ShuffleGFRewards, }; diff --git a/source/shops.cpp b/source/shops.cpp index 6d392af..1b179b2 100644 --- a/source/shops.cpp +++ b/source/shops.cpp @@ -64,10 +64,10 @@ double CalculateCumulativeDistributionFunction(double input) { int GetShopPrice() { const int stepSize = 5; - if (Settings::ShopsanityPrices.Value() == 1) /*Affordable*/ { + if (Settings::ShopsanityPrices) /*Affordable*/ { // Affordable option is like affordable scrubs. All items cost 10 rupees. return 10; - } else if (Settings::ShopsanityPrices.Value() == 0) /*Random*/ { + } else if (!Settings::ShopsanityPrices) /*Random*/ { // "Original" Shopsanity price behaviour. Using the precomputed probability values from the ShopPriceProbability // array. double random = RandomDouble(); // Randomly generated probability value From 2545115ec275eac7ea644046b815e2ce14b8c4fe Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Sun, 13 Sep 2026 20:30:44 -0500 Subject: [PATCH 40/63] Update fill.cpp remove static items not needed anymore --- source/fill.cpp | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/source/fill.cpp b/source/fill.cpp index 3a833c2..835d817 100644 --- a/source/fill.cpp +++ b/source/fill.cpp @@ -843,16 +843,6 @@ int Fill() { GenerateStartingInventory(); RemoveStartingItemsFromPool(); FillExcludedLocations(); - - //Temp place Shop things so i can figure shit out - PlaceItemInLocation(TRADING_POST_ITEM_1, GREEN_RUPEE); - PlaceItemInLocation(TRADING_POST_ITEM_2, BLUE_RUPEE); - PlaceItemInLocation(TRADING_POST_ITEM_3, RED_RUPEE); - PlaceItemInLocation(TRADING_POST_ITEM_4, SWAMP_SKULLTULA_TOKEN); - PlaceItemInLocation(TRADING_POST_ITEM_5, WOODFALL_TEMPLE_SMALL_KEY); - PlaceItemInLocation(TRADING_POST_ITEM_6, SNOWHEAD_TEMPLE_BOSS_KEY); - PlaceItemInLocation(TRADING_POST_ITEM_7, BOTTLE_WITH_RED_POTION); - PlaceItemInLocation(TRADING_POST_ITEM_8, WF_STRAY_FAIRY); showItemProgress = true; From adb2254a9f05c85a6fd67765ea192ea818dba5e5 Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Sun, 13 Sep 2026 23:06:07 -0500 Subject: [PATCH 41/63] InitialScrubPurchaseText - Adds initial test for scrub text - Adds price onto curiosity shop bomb bag --- source/hints.cpp | 28 +++++++++++++++++++++++++--- source/item_location.cpp | 5 +++++ 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/source/hints.cpp b/source/hints.cpp index 84f3848..3f0e436 100644 --- a/source/hints.cpp +++ b/source/hints.cpp @@ -647,6 +647,28 @@ void CreateBeanDaddyHint() { }; void CreateScrubPurchaseText() { + //Set initial Scrub Prices + Location(SOUTHERN_SWAMP_SCRUB_PURCHASE)->SetShopsanityPrice(GetShopPrice()); + u16 SwampPrice = Location(SOUTHERN_SWAMP_SCRUB_PURCHASE)->GetPrice(); + Location(GORON_VILLAGE_SCRUB_PURCHASE)->SetShopsanityPrice(GetShopPrice()); + u16 GoronPrice = Location(GORON_VILLAGE_SCRUB_PURCHASE)->GetPrice(); + Location(ZORA_HALL_SCRUB_PURCHASE)->SetShopsanityPrice(GetShopPrice()); + u16 ZoraPrice = Location(ZORA_HALL_SCRUB_PURCHASE)->GetPrice(); + Location(IKANA_CANYON_SCRUB_PURCHASE)->SetShopsanityPrice(GetShopPrice()); + u16 IkanaPrice = Location(IKANA_CANYON_SCRUB_PURCHASE)->GetPrice(); + + Text RupeeText{" Rupees#&", " rubis#&", " rupias#&", " Rubine#&",/* " rupie#&"*/}; + + //Set prices on moved Scrub locations + Location(SOUTHERN_SWAMP_SCRUB_PURCHASE_CLEAR)->SetShopsanityPrice(SwampPrice); + Location(S_CLOCK_TOWN_SWAMP_SCRUB_PURCHASE)->SetShopsanityPrice(SwampPrice); + Location(GORON_VILLAGE_SCRUB_PURCHASE_SPRING)->SetShopsanityPrice(GoronPrice); + Location(SOUTHERN_SWAMP_GORON_SCRUB_PURCHASE)->SetShopsanityPrice(GoronPrice); + Location(SOUTHERN_SWAMP_GORON_SCRUB_PURCHASE_CLEAR)->SetShopsanityPrice(GoronPrice); + Location(GORON_VILLAGE_ZORA_SCRUB_PURCHASE)->SetShopsanityPrice(ZoraPrice); + Location(GORON_VILLAGE_ZORA_SCRUB_PURCHASE_SPRING)->SetShopsanityPrice(ZoraPrice); + Location(ZORA_HALL_IKANA_SCRUB_PURCHASE)->SetShopsanityPrice(IkanaPrice); + Text SwampScrubItem = ItemTable(Location(SOUTHERN_SWAMP_SCRUB_PURCHASE)->GetPlacedItemKey()).GetHint().GetText(); CustomMessages::CreateMessageFromTextObject(0x15e9, 0xFFFF, 0x3FFFFFFF, 0xFF0000, Text{ /*NaEnglish*/"Do you know what #" , @@ -658,15 +680,15 @@ void CreateScrubPurchaseText() { /*EuFrench */"", /*EuSpanish*/"",} + SwampScrubItem + Text{ - /*NaEnglish*/" are, sir? I'll sell you one for #20 Rupees#.", + /*NaEnglish*/" are, sir? I'll sell you one for #", /*NaFrench */"", /*NaSpanish*/"", /*EuGerman */"", // /*EuItalian*/"", /*EuEnglish*/"", /*EuFrench */"", - /*EuSpanish*/"", - },{QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_EVENTNEXT); + /*EuSpanish*/"",} + + Text{std::to_string(SwampPrice)} + RupeeText,{QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_EVENTNEXT); }; void CreateOtherHints() { diff --git a/source/item_location.cpp b/source/item_location.cpp index 4598857..070045c 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -1264,6 +1264,11 @@ void CreateItemOverrides() { PlaceItemInLocation(GORON_VILLAGE_ZORA_SCRUB_PURCHASE_SPRING, loc28->GetPlacedItemKey()); PlaceItemInLocation(ZORA_HALL_IKANA_SCRUB_PURCHASE, loc29->GetPlacedItemKey()); + //Price adjustments for shopsanity - make sure shop prices are the same for both locations + u16 price1 = Location(W_CLOCK_TOWN_BIG_BOMB_BAG_BUY)->GetPrice(); + Location(W_CLOCK_TOWN_CURIOSITY_BOMB_BAG)->SetPrice(price1); + + for (LocationKey locKey : allLocations) { auto loc = Location(locKey); ItemOverride_Value val = ItemTable(loc->GetPlacedItemKey()).Value(); From 174eb48c83853a9d0cabe8831e6cfc187a0aa288 Mon Sep 17 00:00:00 2001 From: pizza1398 <259104093+pizza1398@users.noreply.github.com> Date: Mon, 14 Sep 2026 13:29:40 +0200 Subject: [PATCH 42/63] Match Ice Trap TrickNames to their appearance --- source/fill.cpp | 14 +++--------- source/hints.cpp | 48 ++++++++++++++++++++-------------------- source/include/shops.hpp | 1 - source/item_location.cpp | 12 +++++----- source/shops.cpp | 30 +++++++++---------------- source/spoiler_log.cpp | 2 +- 6 files changed, 44 insertions(+), 63 deletions(-) diff --git a/source/fill.cpp b/source/fill.cpp index 835d817..06dcb08 100644 --- a/source/fill.cpp +++ b/source/fill.cpp @@ -1004,23 +1004,15 @@ int Fill() { if (Shopsanity){ CitraPrint("Placing Shopsanity Items"); ItemAndPrice init; - init.Name = Text{ - /*NaEnglish*/"No Item", - /*NaFrench */"", - /*NaSpanish*/"", - /*EuGerman */"", - // /*EuItalian*/"", - /*EuEnglish*/"", - /*EuFrench */"", - /*EuSpanish*/"", - }; + // English French Spanish German Italian + init.Name = Text{"No Item", "Pas d'objet", "Sin objeto", "Kein Item", /*"Nessun Oggetto",*/ }; init.Price = -1; init.Repurchaseable = false; NonShopItems.assign(21,init); for (size_t i = 0; i < ShopLocationLists.size(); i++) { for (size_t j = 0; j < ShopLocationLists[i].size(); j++) { int shopsanityPrice = GetShopPrice(); - NonShopItems[TransformShopIndex(i*8 + j)].Price = shopsanityPrice; //Set the price for the item to be passed + NonShopItems[GetShopIndex(ShopLocationLists[i][j])].Price = shopsanityPrice; //Set the price for the item to be passed Location(ShopLocationLists[i][j])->SetShopsanityPrice(shopsanityPrice); //Set the price for the location to be passed } } diff --git a/source/hints.cpp b/source/hints.cpp index 3f0e436..3d1c6e4 100644 --- a/source/hints.cpp +++ b/source/hints.cpp @@ -535,7 +535,7 @@ void CreateShopMessages() { u32 messageID = shopEntries[i].first; u16 price = Location(shopEntries[i].second)->GetPrice(); ItemKey itemKey = Location(shopEntries[i].second)->GetPlacedItemKey(); - Text itemName = GetShopItemName(itemKey); + Text itemName = NonShopItems[GetShopIndex(shopEntries[i].second)].Name; Text shopIntro = Text{"#"}+itemName+Text{ "&>>" // itemName.NAenglish.length() <= 30 ? ": " : "&>>", @@ -636,13 +636,13 @@ void CreateShopMessages() { void CreateBeanDaddyHint() { CustomMessages::CreateMessageFromTextObject(0x92f, 0x930, 0x3FFFFFFF, 0xFF0000, Text{ /*NaEnglish*/"Do you need a #Mysterious Item#? ", - /*NaFrench */"", - /*NaSpanish*/"", - /*EuGerman */"", - // /*EuItalian*/"", - /*EuEnglish*/"", - /*EuFrench */"", - /*EuSpanish*/"", + // /*NaFrench */"", + // /*NaSpanish*/"", + // /*EuGerman */"", + // // /*EuItalian*/"", + // /*EuEnglish*/"", + // /*EuFrench */"", + // /*EuSpanish*/"", }, {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_EVENTNEXT); }; @@ -672,23 +672,23 @@ void CreateScrubPurchaseText() { Text SwampScrubItem = ItemTable(Location(SOUTHERN_SWAMP_SCRUB_PURCHASE)->GetPlacedItemKey()).GetHint().GetText(); CustomMessages::CreateMessageFromTextObject(0x15e9, 0xFFFF, 0x3FFFFFFF, 0xFF0000, Text{ /*NaEnglish*/"Do you know what #" , - /*NaFrench */"", - /*NaSpanish*/"", - /*EuGerman */"", - // /*EuItalian*/"", - /*EuEnglish*/"", - /*EuFrench */"", - /*EuSpanish*/"",} - + SwampScrubItem + Text{ + // /*NaFrench */"", + // /*NaSpanish*/"", + // /*EuGerman */"", + // // /*EuItalian*/"", + // /*EuEnglish*/"", + // /*EuFrench */"", + // /*EuSpanish*/"", + } + SwampScrubItem + Text{ /*NaEnglish*/" are, sir? I'll sell you one for #", - /*NaFrench */"", - /*NaSpanish*/"", - /*EuGerman */"", - // /*EuItalian*/"", - /*EuEnglish*/"", - /*EuFrench */"", - /*EuSpanish*/"",} - + Text{std::to_string(SwampPrice)} + RupeeText,{QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_EVENTNEXT); + // /*NaFrench */"", + // /*NaSpanish*/"", + // /*EuGerman */"", + // // /*EuItalian*/"", + // /*EuEnglish*/"", + // /*EuFrench */"", + // /*EuSpanish*/"", + } + Text{std::to_string(SwampPrice)} + RupeeText,{QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_EVENTNEXT); }; void CreateOtherHints() { diff --git a/source/include/shops.hpp b/source/include/shops.hpp index 056de2e..6b7e52e 100644 --- a/source/include/shops.hpp +++ b/source/include/shops.hpp @@ -17,6 +17,5 @@ extern int GetShopPrice(); extern s16 GetRandomScrubPrice(); extern Text GetIceTrapName(u8 id); extern int GetShopIndex(LocationKey loc); -extern int TransformShopIndex(int index); extern std::vector NonShopItems; \ No newline at end of file diff --git a/source/item_location.cpp b/source/item_location.cpp index 070045c..6303f46 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -1127,11 +1127,11 @@ void PlaceItemInLocation(LocationKey locKey, ItemKey item, bool applyEffectImmed } //If we're placing a non-shop item in a shop location, we want to record it for custom messages - /* if (ItemTable(item).GetItemType() != ITEMTYPE_SHOP && loc->IsCategory(Category::cShop)) { - int index = TransformShopIndex(GetShopIndex(locKey)); + if (ItemTable(item).GetItemType() != ITEMTYPE_SHOP && loc->IsCategory(Category::cShop)) { + int index = GetShopIndex(locKey); NonShopItems[index].Name = ItemTable(item).GetName(); NonShopItems[index].Repurchaseable = ItemTable(item).GetItemType() == ITEMTYPE_REFILL || ItemTable(item).GetHintKey() == PROGRESSIVE_BOMBCHUS; - }*/ + } loc->SetPlacedItem(item); } @@ -1273,9 +1273,9 @@ void CreateItemOverrides() { auto loc = Location(locKey); ItemOverride_Value val = ItemTable(loc->GetPlacedItemKey()).Value(); //If this is an ice trap in a shop, change the name based on what the model will look like - //if (loc->GetPlacedItemKey() == ICE_TRAP && loc->IsCategory(Category::cShop)) { - //NonShopItems[TransformShopIndex(GetShopIndex(locKey))].Name = GetIceTrapName(val.looksLikeItemId); - //} + if (loc->GetPlacedItemKey() == ICE_TRAP && loc->IsCategory(Category::cShop)) { + NonShopItems[GetShopIndex(locKey)].Name = GetIceTrapName(val.looksLikeItemId); + } overrides.insert({ .key = loc->Key(), .value = val, diff --git a/source/shops.cpp b/source/shops.cpp index 1b179b2..7ecea65 100644 --- a/source/shops.cpp +++ b/source/shops.cpp @@ -866,25 +866,15 @@ Text GetIceTrapName(u8 id) { } // Get shop index based on a given location -static std::map ShopNameToNum = { { "Trading Post", 0 }, { "Bomb Shop", 1 }, - { "Swamp Potion Shop", 2 }, { "Goron Village Shop", 3 }, - { "Zora Hall Shop", 4 }, }; int GetShopIndex(LocationKey loc) { - // Kind of hacky, but extract the shop and item position from the name - const std::string& name(Location(loc)->GetName()); - int split = name.find(" Item "); - std::string_view shop(name.c_str(), split); - int pos = std::stoi(name.substr(split + 6, 1)) - 1; - int shopnum = ShopNameToNum[shop]; - return shopnum * 8 + pos; -} - -// Without this transformed index, shop-related tables and arrays would need 64 entries- But only half of that is needed -// for shopsanity So we use this transformation to map only important indices to an array with 32 entries in the -// following manner: Shop index: 4 5 6 7 12 13 14 15 20 21 22 23... Transformed: 0 1 2 3 4 5 6 7 8 9 -// 10 11... So we first divide the shop index by 4, then by 2 which basically tells us the index of the shop it's in, -// then multiply by 4 since there are 4 items per shop -// And finally we use a modulo by 4 to get the index within the "shop" of 4 items, and add -int TransformShopIndex(int index) { - return 4 * ((index / 4) / 2) + index % 4; + int n = 0; + for (size_t i = 0; i < ShopLocationLists.size(); i++) { + for (size_t j = 0; j < ShopLocationLists[i].size(); j++) { + if (ShopLocationLists[i][j] == loc) + return n; + else + n++; + } + } + return 0; } \ No newline at end of file diff --git a/source/spoiler_log.cpp b/source/spoiler_log.cpp index 8fa7829..6b8a2a8 100644 --- a/source/spoiler_log.cpp +++ b/source/spoiler_log.cpp @@ -305,7 +305,7 @@ static void WriteIngameSpoilerLog() { auto locItem = loc->GetPlacedItemName().GetNAEnglish(); if (loc->IsCategory(Category::cShop)) { if (loc->GetPlacedItemKey() == ICE_TRAP) { - locItem = NonShopItems[TransformShopIndex(GetShopIndex(key))].Name.GetNAEnglish(); + locItem = NonShopItems[GetShopIndex(key)].Name.GetNAEnglish(); } locItem += ": " + std::to_string(loc->GetPrice()) + " Rupees"; } From 75a6273a0ca6eaacb4ce184ab1a1d63b54193176 Mon Sep 17 00:00:00 2001 From: Phlex <3514085+PhlexPlexico@users.noreply.github.com> Date: Mon, 14 Sep 2026 08:38:15 -0600 Subject: [PATCH 43/63] fix: Update Z3DR fix: Update shop item placement to avoid crashes. --- Z3DR | 2 +- source/fill.cpp | 10 +++------- source/include/shops.hpp | 1 + source/item_location.cpp | 13 +++++++++---- source/shops.cpp | 19 ++++++++++++++++++- source/spoiler_log.cpp | 5 +++-- 6 files changed, 35 insertions(+), 15 deletions(-) diff --git a/Z3DR b/Z3DR index e0991d3..7d1cd0e 160000 --- a/Z3DR +++ b/Z3DR @@ -1 +1 @@ -Subproject commit e0991d312df18ad3cff0f9fcfcf6c2c17baddae2 +Subproject commit 7d1cd0e4b6aca2a55db9c53268b6a0a68209e103 diff --git a/source/fill.cpp b/source/fill.cpp index 06dcb08..74d0d93 100644 --- a/source/fill.cpp +++ b/source/fill.cpp @@ -785,6 +785,7 @@ static void RandomizeLinksPocket() { int VanillaFill() { //Perform minimum needed initialization // CitraPrint("Starting VanillaFill\n"); + ResetNonShopItems(); AreaTable_Init(); //Reset the world graph to intialize the proper locations ItemReset(); //Reset shops incase of shopsanity random GenerateLocationPool(); @@ -836,6 +837,7 @@ int Fill() { wothLocations.clear(); ocarinaObtainable = false; songOfTimeObtainable = false; + ResetNonShopItems(); //Before any placement -- see ResetNonShopItems AreaTable_Init(); //Reset the world graph to intialize the proper locations ItemReset(); //Reset shops incase of shopsanity random GenerateLocationPool(); @@ -1000,15 +1002,9 @@ int Fill() { } //Place Shop Items first - NonShopItems = {}; + //NonShopItems is already sized by ResetNonShopItems if (Shopsanity){ CitraPrint("Placing Shopsanity Items"); - ItemAndPrice init; - // English French Spanish German Italian - init.Name = Text{"No Item", "Pas d'objet", "Sin objeto", "Kein Item", /*"Nessun Oggetto",*/ }; - init.Price = -1; - init.Repurchaseable = false; - NonShopItems.assign(21,init); for (size_t i = 0; i < ShopLocationLists.size(); i++) { for (size_t j = 0; j < ShopLocationLists[i].size(); j++) { int shopsanityPrice = GetShopPrice(); diff --git a/source/include/shops.hpp b/source/include/shops.hpp index 6b7e52e..4641c3c 100644 --- a/source/include/shops.hpp +++ b/source/include/shops.hpp @@ -17,5 +17,6 @@ extern int GetShopPrice(); extern s16 GetRandomScrubPrice(); extern Text GetIceTrapName(u8 id); extern int GetShopIndex(LocationKey loc); +extern void ResetNonShopItems(); extern std::vector NonShopItems; \ No newline at end of file diff --git a/source/item_location.cpp b/source/item_location.cpp index 6303f46..210d5d3 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -1128,9 +1128,11 @@ void PlaceItemInLocation(LocationKey locKey, ItemKey item, bool applyEffectImmed //If we're placing a non-shop item in a shop location, we want to record it for custom messages if (ItemTable(item).GetItemType() != ITEMTYPE_SHOP && loc->IsCategory(Category::cShop)) { - int index = GetShopIndex(locKey); - NonShopItems[index].Name = ItemTable(item).GetName(); - NonShopItems[index].Repurchaseable = ItemTable(item).GetItemType() == ITEMTYPE_REFILL || ItemTable(item).GetHintKey() == PROGRESSIVE_BOMBCHUS; + const int index = GetShopIndex(locKey); + if (index >= 0) { + NonShopItems[index].Name = ItemTable(item).GetName(); + NonShopItems[index].Repurchaseable = ItemTable(item).GetItemType() == ITEMTYPE_REFILL || ItemTable(item).GetHintKey() == PROGRESSIVE_BOMBCHUS; + } } loc->SetPlacedItem(item); @@ -1274,7 +1276,10 @@ void CreateItemOverrides() { ItemOverride_Value val = ItemTable(loc->GetPlacedItemKey()).Value(); //If this is an ice trap in a shop, change the name based on what the model will look like if (loc->GetPlacedItemKey() == ICE_TRAP && loc->IsCategory(Category::cShop)) { - NonShopItems[GetShopIndex(locKey)].Name = GetIceTrapName(val.looksLikeItemId); + const int index = GetShopIndex(locKey); + if (index >= 0) { + NonShopItems[index].Name = GetIceTrapName(val.looksLikeItemId); + } } overrides.insert({ .key = loc->Key(), diff --git a/source/shops.cpp b/source/shops.cpp index 7ecea65..6bb10d1 100644 --- a/source/shops.cpp +++ b/source/shops.cpp @@ -15,6 +15,23 @@ using namespace Settings; std::vector NonShopItems = {}; +// Gives every shop slot a live "No Item" entry. Has to run before anything is placed: items reach shop +// locations from GenerateItemPool onward, long before shopsanity assigns prices, and +// PlaceItemInLocation records their names as they land. +void ResetNonShopItems() { + ItemAndPrice init; + // English French Spanish German Italian + init.Name = Text{"No Item", "Pas d'objet", "Sin objeto", "Kein Item", /*"Nessun Oggetto",*/ }; + init.Price = -1; + init.Repurchaseable = false; + + size_t slotCount = 0; + for (const auto& shopLocations : ShopLocationLists) { + slotCount += shopLocations.size(); + } + NonShopItems.assign(slotCount, init); +} + static std::array, 0xD5> trickNameTable; //Table of trick ice trap names bool initTrickNames = false; //indicates if trick ice trap names have been initialized yet @@ -876,5 +893,5 @@ int GetShopIndex(LocationKey loc) { n++; } } - return 0; + return -1; } \ No newline at end of file diff --git a/source/spoiler_log.cpp b/source/spoiler_log.cpp index 6b8a2a8..ecda1b1 100644 --- a/source/spoiler_log.cpp +++ b/source/spoiler_log.cpp @@ -304,8 +304,9 @@ static void WriteIngameSpoilerLog() { auto locItem = loc->GetPlacedItemName().GetNAEnglish(); if (loc->IsCategory(Category::cShop)) { - if (loc->GetPlacedItemKey() == ICE_TRAP) { - locItem = NonShopItems[GetShopIndex(key)].Name.GetNAEnglish(); + const int shopIndex = GetShopIndex(key); + if (loc->GetPlacedItemKey() == ICE_TRAP && shopIndex >= 0) { + locItem = NonShopItems[shopIndex].Name.GetNAEnglish(); } locItem += ": " + std::to_string(loc->GetPrice()) + " Rupees"; } From f42f8cc8cc42cec217a7ed4215e8124ec8907f55 Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Mon, 14 Sep 2026 18:18:26 -0500 Subject: [PATCH 44/63] MilkBar - Adds Chateau Romani Refill Item + hints - Adjusts Magic Bean itemtype - Adds Milk Bar Milk and Chateau purchase locations to Shopsanity - Moves Scrubsanity setting from Major Items category to Side Quest category - Minor adjustments to item pool generation (Adds vanilla placements for progressive bomb bags to clock town & milk/chateau to Milk Bar ) - Cleans up more commented out code --- source/hint_list.cpp | 30 ++++++++++++++++++------------ source/hints.cpp | 26 ++++++++++++++++++++++---- source/include/keys.hpp | 1 + source/item_list.cpp | 5 +++-- source/item_location.cpp | 8 ++++---- source/item_pool.cpp | 24 +++++++++--------------- source/location_access.cpp | 5 ++++- source/settings.cpp | 2 +- source/shops.cpp | 5 +++++ 9 files changed, 67 insertions(+), 39 deletions(-) diff --git a/source/hint_list.cpp b/source/hint_list.cpp index 1ec47bf..52f3e6f 100644 --- a/source/hint_list.cpp +++ b/source/hint_list.cpp @@ -1009,6 +1009,12 @@ void HintTable_Init() { }, //clear Text{"a Deku Stick", "un bâton mojo", "un palo Deku", "einen Deku-Stab"} ); + hintTable[CHATEAU_ROMANI_REFILL] = HintText::Item({ + //obscure + Text{"an adult beverage", "un breuvage adulte", "un trago para adultos", "ein Getränk für Erwachsene"} + }, //clear + Text{"Chateau Romani Refill", "de Cuvée Romani", "de Reserva Romani", "ein Chateau Romani"} + ); /*---------------- | SHOP ITEMS | @@ -1177,18 +1183,18 @@ void HintTable_Init() { }, //clear Text{"the #postbox# contains", "la #boîte aux lettres# contient", "el buzón contiene", "der #Briefkasten# enthält"} ); - //hintTable[E_CLOCK_TOWN_MILK_BAR_CHATEAU] = HintText::Sometimes({ - // //obscure - // Text{"**ENGLISH**", "un #spécialiste laitier# vend", "un lugar de copas vende", "ein #exklusives Getränk# entlohnt"} - // }, //clear - // Text{"the #Milk Bar# sells", "le #bar laitier# vend", "el Bar Lácteo vende", "die #Milchbar# verkauft"} - //); - //hintTable[E_CLOCK_TOWN_MILK_BAR_MILK] = HintText::Sometimes({ - // //obscure - // Text{"**ENGLISH**", "un #spécialiste laitier# vend", "un lugar de copas vende", "ein #Getränk# entlohnt"} - // }, //clear - // Text{"the #Milk Bar# sells", "le #bar laitier# vend", "el Bar Lácteo vende", "die #Milchbar# verkauft"} - //); + hintTable[E_CLOCK_TOWN_MILK_BAR_CHATEAU] = HintText::Sometimes({ + //obscure + Text{"the #Bar# sells", "un #spécialiste laitier# vend", "un lugar de copas vende", "ein #exklusives Getränk# entlohnt"} + }, //clear + Text{"the #Milk Bar# sells", "le #bar laitier# vend", "el Bar Lácteo vende", "die #Milchbar# verkauft"} + ); + hintTable[E_CLOCK_TOWN_MILK_BAR_MILK] = HintText::Sometimes({ + //obscure + Text{"the #Bar# sells", "un #spécialiste laitier# vend", "un lugar de copas vende", "ein #Getränk# entlohnt"} + }, //clear + Text{"the #Milk Bar# sells", "le #bar laitier# vend", "el Bar Lácteo vende", "die #Milchbar# verkauft"} + ); hintTable[GORMAN_TRACK_MYSTERY_MILK_QUEST] = HintText::Sometimes({ //obscure Text{"an #upset stomach cure# rewards", "#soigner un mal de ventre# produit", "la cura a un mal estomacal recompensa con", "die #Heilung eines verstimmten Magens# entlohnt"} diff --git a/source/hints.cpp b/source/hints.cpp index 3d1c6e4..3df4e1b 100644 --- a/source/hints.cpp +++ b/source/hints.cpp @@ -631,6 +631,24 @@ void CreateShopMessages() { }, {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); } } + // Custom Messages for Other Shops + // Milk Bar + Text MilkBarMilkItem = GetShopItemName(Location(E_CLOCK_TOWN_MILK_BAR_MILK)->GetPlacedItemKey()); + Text MilkBarChateauItem = GetShopItemName(Location(E_CLOCK_TOWN_MILK_BAR_CHATEAU)->GetPlacedItemKey()); + Location(E_CLOCK_TOWN_MILK_BAR_MILK)->SetShopsanityPrice(static_cast(GetShopPrice())); + Location(E_CLOCK_TOWN_MILK_BAR_CHATEAU)->SetShopsanityPrice(static_cast(GetShopPrice())); + u16 MilkBarMilkPrice = Location(E_CLOCK_TOWN_MILK_BAR_MILK)->GetPrice(); + u16 MilkBarChateauPrice = Location(E_CLOCK_TOWN_MILK_BAR_CHATEAU)->GetPrice(); + // {"English", "French", "Spanish", "German", }; // "Italian" + Text MilkBarIntro = {"What'll it be?&", "", "", ""}; + Text MilkSplit = {" ##", " ##", " ##", " - ##", }; // " ##" + Text MilkNext = {" Rupees#&#", " Rubis#&#", " rupias#&#", " Rubine#&#", }; // " rupie#&" + Text MilkLeave = MilkNext + Text{"Nothing#", "Non merci#", "No, gracias#", "Nein, danke!#", }; // "&#No, grazie#" + + CustomMessages::CreateMessageFromTextObject(0x2b0b, 0xFFFF, 0x3fffffff, 0xff1001, + /*Text{">3#"}+*/MilkBarIntro+MilkBarMilkItem+MilkSplit+std::to_string(MilkBarMilkPrice)+MilkNext+MilkBarChateauItem+MilkSplit+std::to_string(MilkBarChateauPrice)+MilkLeave, + {QM_GREEN, QM_RED, QM_GREEN, QM_RED, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); + // Milk Road Gorman Bros Milk }; void CreateBeanDaddyHint() { @@ -648,13 +666,13 @@ void CreateBeanDaddyHint() { void CreateScrubPurchaseText() { //Set initial Scrub Prices - Location(SOUTHERN_SWAMP_SCRUB_PURCHASE)->SetShopsanityPrice(GetShopPrice()); + Location(SOUTHERN_SWAMP_SCRUB_PURCHASE)->SetShopsanityPrice(static_cast(GetShopPrice())); u16 SwampPrice = Location(SOUTHERN_SWAMP_SCRUB_PURCHASE)->GetPrice(); - Location(GORON_VILLAGE_SCRUB_PURCHASE)->SetShopsanityPrice(GetShopPrice()); + Location(GORON_VILLAGE_SCRUB_PURCHASE)->SetShopsanityPrice(static_cast(GetShopPrice())); u16 GoronPrice = Location(GORON_VILLAGE_SCRUB_PURCHASE)->GetPrice(); - Location(ZORA_HALL_SCRUB_PURCHASE)->SetShopsanityPrice(GetShopPrice()); + Location(ZORA_HALL_SCRUB_PURCHASE)->SetShopsanityPrice(static_cast(GetShopPrice())); u16 ZoraPrice = Location(ZORA_HALL_SCRUB_PURCHASE)->GetPrice(); - Location(IKANA_CANYON_SCRUB_PURCHASE)->SetShopsanityPrice(GetShopPrice()); + Location(IKANA_CANYON_SCRUB_PURCHASE)->SetShopsanityPrice(static_cast(GetShopPrice())); u16 IkanaPrice = Location(IKANA_CANYON_SCRUB_PURCHASE)->GetPrice(); Text RupeeText{" Rupees#&", " rubis#&", " rupias#&", " Rubine#&",/* " rupie#&"*/}; diff --git a/source/include/keys.hpp b/source/include/keys.hpp index bfa735e..e1393c1 100644 --- a/source/include/keys.hpp +++ b/source/include/keys.hpp @@ -186,6 +186,7 @@ typedef enum { HEART_CONTAINER, ICE_TRAP, MILK, + CHATEAU_ROMANI_REFILL, BOMBS_5, BOMBS_10, diff --git a/source/item_list.cpp b/source/item_list.cpp index 3c6a606..1c4bac2 100644 --- a/source/item_list.cpp +++ b/source/item_list.cpp @@ -33,7 +33,7 @@ void ItemTable_Init() { //repeatable denotes that an item in a vanilla playth itemTable[ICE_ARROWS] = Item(true, false, &IceArrows, Text{"Ice Arrow", "Flèche de glace", "Flecha de hielo", "Eispfeile", }, ICE_ARROWS, (u32)GetItemID::GI_ICE_ARROW, ITEMTYPE_ITEM); itemTable[LIGHT_ARROWS] = Item(true, false, &LightArrows, Text{"Light Arrow", "Flèche de lumière", "Flecha de luz", "Lichtpfeile", }, LIGHT_ARROWS, (u32)GetItemID::GI_LIGHT_ARROW, ITEMTYPE_ITEM); itemTable[HOOKSHOT] = Item(true, false, &Hookshot, Text{"Hookshot", "Grappin", "Gancho", "Fanghaken", }, HOOKSHOT, (u32)GetItemID::GI_HOOKSHOT, ITEMTYPE_ITEM); - itemTable[MAGIC_BEAN] = Item(true, false, &MagicBean, Text{"Magic Bean", "Haricot magique", "Habichuelas mágicas", "Wundererbse", }, MAGIC_BEAN, (u32)GetItemID::GI_MAGIC_BEAN, ITEMTYPE_ITEM); + itemTable[MAGIC_BEAN] = Item(true, false, &MagicBean, Text{"Magic Bean", "Haricot magique", "Habichuelas mágicas", "Wundererbse", }, MAGIC_BEAN, (u32)GetItemID::GI_MAGIC_BEAN, ITEMTYPE_REFILL); itemTable[MAGIC_BEAN_PACK] = Item(true, false, &MagicBeanPack, Text{"Magic Bean Pack", "Paquet de haricots magiques", "Lote de habichuelas mágicas", "Wundererbsen-Paket", }, MAGIC_BEAN_PACK, (u32)GetItemID::GI_MAGIC_BEAN, ITEMTYPE_ITEM); itemTable[DOUBLE_DEFENSE] = Item(true, false, &noVariable, Text{"Double Defense", "Résistance Double", "Poder defensivo doble", "Verstärkter Rüstungsschutz", }, DOUBLE_DEFENSE, 0xB2, ITEMTYPE_GFAIRY); itemTable[OCARINA_OF_TIME] = Item(true, false, &Ocarina, Text{"Ocarina of Time", "Ocarina du temps", "Ocarina del Tiempo", "Ocarina der Zeit", }, OCARINA_OF_TIME, (u32)GetItemID::GI_OCARINA_OF_TIME, ITEMTYPE_ITEM); @@ -190,7 +190,8 @@ void ItemTable_Init() { //repeatable denotes that an item in a vanilla playth itemTable[PIECE_OF_HEART] = Item(true, false, &PiecesOfHeart, Text{"Piece of Heart", "Quart de cœur", "Pieza de corazón", "Herzteil", "", "Fragment de cœur", "" }, PIECE_OF_HEART, (u32)GetItemID::GI_HEART_PIECE, ITEMTYPE_ITEM); itemTable[HEART_CONTAINER] = Item(true, false, &HeartContainers, Text{"Heart Container", "Réceptacle de cœur", "Contenedor de corazón", "Herzcontainer", }, HEART_CONTAINER, (u32)GetItemID::GI_HEART_CONTAINER, ITEMTYPE_ITEM); itemTable[ICE_TRAP] = Item(false, false, &noVariable, Text{"Ice Trap", "Piège de glace", "Trampa de hielo", "Eis-Falle", }, ICE_TRAP, 0x12, ITEMTYPE_ITEM); - itemTable[MILK] = Item(false, false, &HasBottle, Text{"Milk", "Lait", "Leche", "Milch", }, NONE, 0x92, ITEMTYPE_ITEM); + itemTable[MILK] = Item(false, false, &HasBottle, Text{"Milk", "Lait", "Leche", "Milch", }, NONE, 0x92, ITEMTYPE_REFILL); + itemTable[CHATEAU_ROMANI_REFILL] = Item(false, false, &HasBottle, Text{"Chateau Romani Refill", "Cuvée Romani", "Reserva Romani", "Chateau Romani", "", "", "" }, NONE, 0x91, ITEMTYPE_REFILL); //Refills itemTable[BOMBS_5] = Item(false, false, &noVariable, Text{"Bombs (5)", "Bombes (5)", "Bombas (5)", "5 Bomben", }, BOMBS_5, (u32)GetItemID::GI_BOMBS_5, ITEMTYPE_REFILL); diff --git a/source/item_location.cpp b/source/item_location.cpp index 210d5d3..2c7045b 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -44,8 +44,8 @@ void LocationTable_Init() { locationTable[E_CLOCK_TOWN_AROMA_IN_OFFICE] = ItemLocation::Base (0x12, 0x8F, false, "ECT Mayor's Office Madame Aroma", E_CLOCK_TOWN_AROMA_IN_OFFICE, KAFEIS_MASK, {Category::cEastClockTown, Category::cDayOne, Category::cAnjuAndKafei}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); locationTable[BOMBERS_HIDEOUT_CHEST] = ItemLocation::Chest (0x29, 0x00, true, "Bombers' Hideout Chest", BOMBERS_HIDEOUT_CHEST, SILVER_RUPEE, {Category::cEastClockTown, Category::cChest,Category::cDayOne, Category::cNoOcarinaStart }, SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); locationTable[E_CLOCK_TOWN_CHEST] = ItemLocation::Chest (0x6C, 0x0A, true, "ECT Chest", E_CLOCK_TOWN_CHEST, SILVER_RUPEE, {Category::cEastClockTown, Category::cChest ,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); - //locationTable[E_CLOCK_TOWN_MILK_BAR_CHATEAU] = ItemLocation::Base (0x12, 0x00, true, "Milk Bar Chateau Buy", E_CLOCK_TOWN_MILK_BAR_CHATEAU, CHATEAU_ROMANI, {Category::cEastClockTown}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); - //locationTable[E_CLOCK_TOWN_MILK_BAR_MILK] = ItemLocation::Base (0x12, 0x00, true, "Milk Bar Milk Buy", E_CLOCK_TOWN_MILK_BAR_MILK, MILK, {Category::cEastClockTown}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); + locationTable[E_CLOCK_TOWN_MILK_BAR_CHATEAU] = ItemLocation::Base (0x15, 0x91, true, "Milk Bar Chateau Buy", E_CLOCK_TOWN_MILK_BAR_CHATEAU, CHATEAU_ROMANI_REFILL, {Category::cEastClockTown, Category::cDayOne, Category::cShop}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); + locationTable[E_CLOCK_TOWN_MILK_BAR_MILK] = ItemLocation::Base (0x15, 0x92, true, "Milk Bar Milk Buy", E_CLOCK_TOWN_MILK_BAR_MILK, MILK, {Category::cEastClockTown, Category::cDayOne, Category::cShop}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); //locationTable[E_CLOCK_TOWN_HONEY_DARLING_ANY_DAY] = ItemLocation::Base (0x11, 0x00, true, "Honey and Darling Any Day", E_CLOCK_TOWN_HONEY_DARLING_ANY_DAY, PURPLE_RUPEE, {Category::cEClockTown,Category::cMinigame}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); //locationTable[E_CLOCK_TOWN_TREASURE_CHEST_GAME_HUMAN] = ItemLocation::Base (0x17, 0x00, true, "Treasure Chest Game (Human)", E_CLOCK_TOWN_TREASURE_CHEST_GAME_HUMAN PURPLE_RUPEE, {Category::cEClockTown,Category::cMinigame,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); //locationTable[E_CLOCK_TOWN_TREASURE_CHEST_GAME_ZORA] = ItemLocation::Base (0x17, 0x00, true, "Treasure Chest Game (Zora)", E_CLOCK_TOWN_TREASURE_CHEST_GAME_ZORA, RED_RUPEE, {Category::cEClockTown,Category::cMinigame ,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); @@ -819,8 +819,8 @@ std::vector overworldLocations = { BOMBERS_HIDEOUT_CHEST, E_CLOCK_TOWN_CHEST, E_CLOCK_TOWN_POSTBOX, - //E_CLOCK_TOWN_MILK_BAR_CHATEAU, - //E_CLOCK_TOWN_MILK_BAR_MILK, + E_CLOCK_TOWN_MILK_BAR_CHATEAU, + E_CLOCK_TOWN_MILK_BAR_MILK, GORMAN_TRACK_MYSTERY_MILK_QUEST, //E_CLOCK_TOWN_HONEY_DARLING_ANY_DAY, //E_CLOCK_TOWN_TREASURE_CHEST_GAME_HUMAN, diff --git a/source/item_pool.cpp b/source/item_pool.cpp index 385fb61..3e54dff 100644 --- a/source/item_pool.cpp +++ b/source/item_pool.cpp @@ -252,16 +252,12 @@ const std::array chestItems = { }; const std::array songList = { - //SONG_OF_TIME, - //SONG_OF_DOUBLE_TIME, - //INVERTED_SONG_OF_TIME, //SoT not included yet + // Song of Soaring and Song of Time are not in this list + // As they are handled by different settings SONG_OF_STORMS, EPONAS_SONG, SONG_OF_HEALING, - //SONG_OF_SOARING, SONATA_OF_AWAKENING, - //LULLABY_INTRO, - //GORONS_LULLABY, PROGRESSIVE_LULLABY, PROGRESSIVE_LULLABY, NEW_WAVE_BOSSA_NOVA, @@ -491,12 +487,13 @@ std::array tingleMaps = { ROMANI_RANCH_MAP, }; -std::array shopItems = { // Only include non junk items/potions/milk +std::array shopItems = { // Only include non junk items/potions/milk HEROS_SHIELD, HEROS_SHIELD, MAGIC_BEAN, PROGRESSIVE_BOMB_BAG, PROGRESSIVE_BOMB_BAG, + CHATEAU_ROMANI_REFILL, }; void AddItemToPool(std::vector& pool, ItemKey item, size_t count /*= 1*/) { pool.insert(pool.end(), count, item); @@ -636,6 +633,9 @@ static void PlaceVanillaShopItems() { PlaceItemInLocation(TRADING_POST_ITEM_8, BUY_MAGIC_BEAN); PlaceItemInLocation(BOMB_SHOP_ITEM_1, BUY_BOMBS_10); PlaceItemInLocation(BOMB_SHOP_ITEM_2, BUY_BOMBCHU_10); + PlaceItemInLocation(W_CLOCK_TOWN_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG); + PlaceItemInLocation(W_CLOCK_TOWN_BIG_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG); + PlaceItemInLocation(W_CLOCK_TOWN_CURIOSITY_BOMB_BAG, PROGRESSIVE_BOMB_BAG); PlaceItemInLocation(W_CLOCK_TOWN_BOMB_SHOP_GORON, POWDER_KEG); PlaceItemInLocation(POTION_SHOP_ITEM_1, BUY_BLUE_POTION); PlaceItemInLocation(POTION_SHOP_ITEM_2, BUY_GREEN_POTION); @@ -647,6 +647,8 @@ static void PlaceVanillaShopItems() { PlaceItemInLocation(ZORA_SHOP_ITEM_2, BUY_ARROWS_10); PlaceItemInLocation(ZORA_SHOP_ITEM_3, BUY_RED_POTION); PlaceItemInLocation(MILK_ROAD_GORMAN_MILK_BUY, MILK); + PlaceItemInLocation(E_CLOCK_TOWN_MILK_BAR_MILK, MILK); + PlaceItemInLocation(E_CLOCK_TOWN_MILK_BAR_CHATEAU, CHATEAU_ROMANI_REFILL); //other 2 scrub sales handled in beans and main inventory }; @@ -727,9 +729,6 @@ void GenerateItemPool() { //Fixed Item Locations PlaceItemInLocation(MAJORA, MAJORAS_MASK, true); PlaceItemInLocation(WOODFALL_TEMPLE_DEKU_PRINCESS, DEKU_PRINCESS); - // PlaceItemInLocation(W_CLOCK_TOWN_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG); - // PlaceItemInLocation(W_CLOCK_TOWN_BIG_BOMB_BAG_BUY, PROGRESSIVE_BOMB_BAG); - // PlaceItemInLocation(W_CLOCK_TOWN_CURIOSITY_BOMB_BAG, PROGRESSIVE_BOMB_BAG); PlaceItemInLocation(W_CLOCK_TOWN_BOMB_SHOP_GORON, POWDER_KEG);//Not Randomized for simplicity //Place Temp Items at alt locations so they don't get filled with important stuff - will be replaced later @@ -1043,12 +1042,7 @@ void GenerateItemPool() { //DUNGEON STUFF - //PlaceVanillaBossRemains(); //done in fill.cpp - RandomizeDungeonRewards() - //PlaceVanillaBossKeys(); //todo Keysanity settings - //PlaceVanillaSmallKeys(); // for now all vanilla PlaceVanillaZoraEggs(); //for now all vanilla - //PlaceVanillaMapsAndCompasses();//for now all vanilla - //PlaceVanillaStrayFairies();//for now all vanilla if(ShuffleHeartContainers) { AddItemToMainPool(HEART_CONTAINER, 4); diff --git a/source/location_access.cpp b/source/location_access.cpp index 7e5ec0b..4f360f1 100644 --- a/source/location_access.cpp +++ b/source/location_access.cpp @@ -382,8 +382,11 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(E_CLOCK_TOWN_GORMAN, {[] {return DekuMask && GoronMask && ZoraMask && RomanisMask;}}), + LocationAccess(E_CLOCK_TOWN_GORMAN, {[] {return DekuMask && GoronMask && ZoraMask && RomanisMask && Ocarina;}}), LocationAccess(E_CLOCK_TOWN_AROMA_IN_BAR, {[] {return LetterMama && KafeisMask;}}), + LocationAccess(E_CLOCK_TOWN_MILK_BAR_MILK, {[] {return HasBottle;}}), + LocationAccess(E_CLOCK_TOWN_MILK_BAR_CHATEAU, {[] {return HasBottle;}}), + }, { //Exits diff --git a/source/settings.cpp b/source/settings.cpp index 6c4d09f..c84ad78 100644 --- a/source/settings.cpp +++ b/source/settings.cpp @@ -405,7 +405,6 @@ namespace Settings { &Tokensanity, &Shopsanity, &ShopsanityPrices, - &Scrubsanity, &ShuffleGFRewards, }; @@ -416,6 +415,7 @@ namespace Settings { &ShuffleBombersNotebook, &ShuffleCows, &ShuffleMagicBeans, + &Scrubsanity, &ShuffleMoonItems, &ShuffleFierceDeity, }; diff --git a/source/shops.cpp b/source/shops.cpp index 6bb10d1..bcf4f2c 100644 --- a/source/shops.cpp +++ b/source/shops.cpp @@ -869,6 +869,11 @@ void InitTrickNames() { Text{"Progressive Lab Ally", "", "", "", }, Text{"Progressive Lullabye", "", "", "", }, }; + trickNameTable[0x92] = { /*Chateau Romani Refill*/ + Text{"Fancy Milk", "", "", "", }, + Text{"Adult Beverage", "", "", "", }, + Text{"Chateau LonLon", "", "", "", }, + }; } // Generate a fake name for the ice trap based on the item it's displayed as From d6cdf57537f9719e1cf82285691243a543291637 Mon Sep 17 00:00:00 2001 From: pizza1398 <259104093+pizza1398@users.noreply.github.com> Date: Tue, 15 Sep 2026 12:10:57 +0200 Subject: [PATCH 45/63] Use NonShopItems for messages --- source/hints.cpp | 5 ++--- source/item_location.cpp | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/source/hints.cpp b/source/hints.cpp index 3df4e1b..45e1120 100644 --- a/source/hints.cpp +++ b/source/hints.cpp @@ -533,8 +533,7 @@ void CreateShopMessages() { for (u8 i = 0; i < 21; i++) { u32 messageID = shopEntries[i].first; - u16 price = Location(shopEntries[i].second)->GetPrice(); - ItemKey itemKey = Location(shopEntries[i].second)->GetPlacedItemKey(); + u16 price = NonShopItems[GetShopIndex(shopEntries[i].second)].Price; Text itemName = NonShopItems[GetShopIndex(shopEntries[i].second)].Name; Text shopIntro = Text{"#"}+itemName+Text{ "&>>" @@ -550,7 +549,7 @@ void CreateShopMessages() { " Rupees#&", " rubis#&", " rupias#&", " Rubine#&",// " rupie#&" }; // Descriptions when hovering over the item - if (ItemTable(itemKey).IsReusable()) { + if (NonShopItems[GetShopIndex(shopEntries[i].second)].Repurchaseable) { shopDescription = { /*NaEnglish*/"Special deal!&Buy as many as you want!", /*NaFrench */"Offre spéciale!&Achetez-en à volonté!", diff --git a/source/item_location.cpp b/source/item_location.cpp index 2c7045b..1caeff9 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -1131,7 +1131,7 @@ void PlaceItemInLocation(LocationKey locKey, ItemKey item, bool applyEffectImmed const int index = GetShopIndex(locKey); if (index >= 0) { NonShopItems[index].Name = ItemTable(item).GetName(); - NonShopItems[index].Repurchaseable = ItemTable(item).GetItemType() == ITEMTYPE_REFILL || ItemTable(item).GetHintKey() == PROGRESSIVE_BOMBCHUS; + NonShopItems[index].Repurchaseable = ItemTable(item).GetItemType() == ITEMTYPE_REFILL; } } From abb639119d1d12a169805ce986e51bd2acc10848 Mon Sep 17 00:00:00 2001 From: pizza1398 <259104093+pizza1398@users.noreply.github.com> Date: Tue, 15 Sep 2026 17:40:29 +0200 Subject: [PATCH 46/63] Update shop messages - Use "variables" for Tingle shop prices - Fix up milk bar dialogue - Fill up more scrub messages --- source/hints.cpp | 108 ++++++++++++++++++++++++++++++----------------- 1 file changed, 69 insertions(+), 39 deletions(-) diff --git a/source/hints.cpp b/source/hints.cpp index 45e1120..f208e70 100644 --- a/source/hints.cpp +++ b/source/hints.cpp @@ -455,6 +455,9 @@ void CreateTingleHintText() { Text romaniMap = GetShopItemName(Location(TINGLE_TWIN_ISLANDS_RR)->GetPlacedItemKey()); Text greatBayMap = GetShopItemName(Location(TINGLE_GBC_GB)->GetPlacedItemKey()); Text ikanaMap = GetShopItemName(Location(TINGLE_GBC_ST)->GetPlacedItemKey()); + u16 tingPriceTiny = 5; + u16 tingPriceSmall = 20; + u16 tingPriceBig = 40; // {"English", "French", "Spanish", "German", }; // "Italian" Text tingSplit = {" ##", " ##", " ##", " - ##", }; // " ##" @@ -463,33 +466,33 @@ void CreateTingleHintText() { Text{"No thanks#", "Non merci#", "No, gracias#", "Nein, danke!#", }; // "&#No, grazie#" // Clock Town message - CustomMessages::CreateMessageFromTextObject(0x1D11, 0xFFFF, 0x3FF0A005, 0xFF1001, - Text{">3#"}+clockTownMap+tingSplit+"5"+tingNext+woodfallMap+tingSplit+"40"+tingLeave, + CustomMessages::CreateMessageFromTextObject(0x1D11, 0xFFFF, (0x3FF00000 | tingPriceTiny | (tingPriceBig << 10)), 0xFF1001, + Text{">3#"}+clockTownMap+tingSplit+std::to_string(tingPriceTiny)+tingNext+woodfallMap+tingSplit+std::to_string(tingPriceBig)+tingLeave, {QM_GREEN, QM_RED, QM_GREEN, QM_RED, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); // Woodfall message - CustomMessages::CreateMessageFromTextObject(0x1D12, 0xFFFF, 0x3FF0A014, 0xFF1001, - Text{">3#"}+woodfallMap+tingSplit+"20"+tingNext+snowHeadMap+tingSplit+"40"+tingLeave, + CustomMessages::CreateMessageFromTextObject(0x1D12, 0xFFFF, (0x3FF00000 | tingPriceSmall | (tingPriceBig << 10)), 0xFF1001, + Text{">3#"}+woodfallMap+tingSplit+std::to_string(tingPriceSmall)+tingNext+snowHeadMap+tingSplit+std::to_string(tingPriceBig)+tingLeave, {QM_GREEN, QM_RED, QM_GREEN, QM_RED, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); // Snowhead message - CustomMessages::CreateMessageFromTextObject(0x1D13, 0xFFFF, 0x3FF0A014, 0xFF1001, - Text{">3#"}+snowHeadMap+tingSplit+"20"+tingNext+romaniMap+tingSplit+"40"+tingLeave, + CustomMessages::CreateMessageFromTextObject(0x1D13, 0xFFFF, (0x3FF00000 | tingPriceSmall | (tingPriceBig << 10)), 0xFF1001, + Text{">3#"}+snowHeadMap+tingSplit+std::to_string(tingPriceSmall)+tingNext+romaniMap+tingSplit+std::to_string(tingPriceBig)+tingLeave, {QM_GREEN, QM_RED, QM_GREEN, QM_RED, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); // Milk Road message - CustomMessages::CreateMessageFromTextObject(0x1D14, 0xFFFF, 0x3FF0A014, 0xFF1001, - Text{">3#"}+romaniMap+tingSplit+"20"+tingNext+greatBayMap+tingSplit+"40"+tingLeave, + CustomMessages::CreateMessageFromTextObject(0x1D14, 0xFFFF, (0x3FF00000 | tingPriceSmall | (tingPriceBig << 10)), 0xFF1001, + Text{">3#"}+romaniMap+tingSplit+std::to_string(tingPriceSmall)+tingNext+greatBayMap+tingSplit+std::to_string(tingPriceBig)+tingLeave, {QM_GREEN, QM_RED, QM_GREEN, QM_RED, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); // Great Bay message - CustomMessages::CreateMessageFromTextObject(0x1D15, 0xFFFF, 0x3FF0A014, 0xFF1001, - Text{">3#"}+greatBayMap+tingSplit+"20"+tingNext+ikanaMap+tingSplit+"40"+tingLeave, + CustomMessages::CreateMessageFromTextObject(0x1D15, 0xFFFF, (0x3FF00000 | tingPriceSmall | (tingPriceBig << 10)), 0xFF1001, + Text{">3#"}+greatBayMap+tingSplit+std::to_string(tingPriceSmall)+tingNext+ikanaMap+tingSplit+std::to_string(tingPriceBig)+tingLeave, {QM_GREEN, QM_RED, QM_GREEN, QM_RED, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); // Ikana message - CustomMessages::CreateMessageFromTextObject(0x1D16, 0xFFFF, 0x3FF0A014, 0xFF1001, - Text{">3#"}+ikanaMap+tingSplit+"20"+tingNext+clockTownMap+tingSplit+"40"+tingLeave, + CustomMessages::CreateMessageFromTextObject(0x1D16, 0xFFFF, (0x3FF00000 | tingPriceSmall | (tingPriceBig << 10)), 0xFF1001, + Text{">3#"}+ikanaMap+tingSplit+std::to_string(tingPriceSmall)+tingNext+clockTownMap+tingSplit+std::to_string(tingPriceBig)+tingLeave, {QM_GREEN, QM_RED, QM_GREEN, QM_RED, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); } } @@ -630,6 +633,7 @@ void CreateShopMessages() { }, {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); } } + // Custom Messages for Other Shops // Milk Bar Text MilkBarMilkItem = GetShopItemName(Location(E_CLOCK_TOWN_MILK_BAR_MILK)->GetPlacedItemKey()); @@ -638,15 +642,21 @@ void CreateShopMessages() { Location(E_CLOCK_TOWN_MILK_BAR_CHATEAU)->SetShopsanityPrice(static_cast(GetShopPrice())); u16 MilkBarMilkPrice = Location(E_CLOCK_TOWN_MILK_BAR_MILK)->GetPrice(); u16 MilkBarChateauPrice = Location(E_CLOCK_TOWN_MILK_BAR_CHATEAU)->GetPrice(); - // {"English", "French", "Spanish", "German", }; // "Italian" - Text MilkBarIntro = {"What'll it be?&", "", "", ""}; - Text MilkSplit = {" ##", " ##", " ##", " - ##", }; // " ##" - Text MilkNext = {" Rupees#&#", " Rubis#&#", " rupias#&#", " Rubine#&#", }; // " rupie#&" - Text MilkLeave = MilkNext + Text{"Nothing#", "Non merci#", "No, gracias#", "Nein, danke!#", }; // "&#No, grazie#" - - CustomMessages::CreateMessageFromTextObject(0x2b0b, 0xFFFF, 0x3fffffff, 0xff1001, - /*Text{">3#"}+*/MilkBarIntro+MilkBarMilkItem+MilkSplit+std::to_string(MilkBarMilkPrice)+MilkNext+MilkBarChateauItem+MilkSplit+std::to_string(MilkBarChateauPrice)+MilkLeave, - {QM_GREEN, QM_RED, QM_GREEN, QM_RED, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); + // {"English", "French", "Spanish", "German", }; // "Italian" + Text MilkBarIntro = {"What'll it be?&", "Qu'est-ce que ce s'ra?", "¿Qué quiere tomar?", "Was darf's sein?", // "Cosa prendi?", + "", "", "¿Qué va a ser?", }; + Text MilkSplit = {": ##", " : ##", ": ##", ": ##", }; // " ##", + Text MilkNext = {" Rupees#&#", " Rubis#&#", " rupias#&#", " Rubine#&#", }; // " rupie#&#", + Text MilkLeave = MilkNext + + Text{"Nothing#", "Rien#", "Nada#", "Nichts#", }; // "Niente#", + + CustomMessages::CreateMessageFromTextObject(0x2b0b, 0xFFFF, (0x3FF00000 | MilkBarMilkPrice | (MilkBarChateauPrice << 10)), 0xff1001, + MilkBarIntro+">3#"+MilkBarMilkItem+MilkSplit+std::to_string(MilkBarMilkPrice)+MilkNext+MilkBarChateauItem+MilkSplit+std::to_string(MilkBarChateauPrice)+MilkLeave, + {QM_GREEN, QM_MAGENTA, QM_GREEN, QM_MAGENTA, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); + // CustomMessages::CreateMessage(0x614A, 0xFFFF, (0x3FFFFFFF), 0xff0000, + // {"With all due respect, sir, I think you've had enough of that."}, + // {}, {}, {}, 0x0, false, false, MESSAGE_END_NORMAL); // For refusing purchase + // Milk Road Gorman Bros Milk }; @@ -674,21 +684,9 @@ void CreateScrubPurchaseText() { Location(IKANA_CANYON_SCRUB_PURCHASE)->SetShopsanityPrice(static_cast(GetShopPrice())); u16 IkanaPrice = Location(IKANA_CANYON_SCRUB_PURCHASE)->GetPrice(); - Text RupeeText{" Rupees#&", " rubis#&", " rupias#&", " Rubine#&",/* " rupie#&"*/}; - - //Set prices on moved Scrub locations - Location(SOUTHERN_SWAMP_SCRUB_PURCHASE_CLEAR)->SetShopsanityPrice(SwampPrice); - Location(S_CLOCK_TOWN_SWAMP_SCRUB_PURCHASE)->SetShopsanityPrice(SwampPrice); - Location(GORON_VILLAGE_SCRUB_PURCHASE_SPRING)->SetShopsanityPrice(GoronPrice); - Location(SOUTHERN_SWAMP_GORON_SCRUB_PURCHASE)->SetShopsanityPrice(GoronPrice); - Location(SOUTHERN_SWAMP_GORON_SCRUB_PURCHASE_CLEAR)->SetShopsanityPrice(GoronPrice); - Location(GORON_VILLAGE_ZORA_SCRUB_PURCHASE)->SetShopsanityPrice(ZoraPrice); - Location(GORON_VILLAGE_ZORA_SCRUB_PURCHASE_SPRING)->SetShopsanityPrice(ZoraPrice); - Location(ZORA_HALL_IKANA_SCRUB_PURCHASE)->SetShopsanityPrice(IkanaPrice); - - Text SwampScrubItem = ItemTable(Location(SOUTHERN_SWAMP_SCRUB_PURCHASE)->GetPlacedItemKey()).GetHint().GetText(); - CustomMessages::CreateMessageFromTextObject(0x15e9, 0xFFFF, 0x3FFFFFFF, 0xFF0000, Text{ - /*NaEnglish*/"Do you know what #" , + Text RupeeText{" Rupees#.", " rubis#.", " rupias#.", " Rubine#.",/* " rupie#.",*/ }; + Text ScrubSellTextOne = Text{ + /*NaEnglish*/"So, I'll sell you #" , // /*NaFrench */"", // /*NaSpanish*/"", // /*EuGerman */"", @@ -696,8 +694,9 @@ void CreateScrubPurchaseText() { // /*EuEnglish*/"", // /*EuFrench */"", // /*EuSpanish*/"", - } + SwampScrubItem + Text{ - /*NaEnglish*/" are, sir? I'll sell you one for #", + }; + Text ScrubSellTextTwo = Text{ + /*NaEnglish*/"# for #", // /*NaFrench */"", // /*NaSpanish*/"", // /*EuGerman */"", @@ -705,7 +704,38 @@ void CreateScrubPurchaseText() { // /*EuEnglish*/"", // /*EuFrench */"", // /*EuSpanish*/"", - } + Text{std::to_string(SwampPrice)} + RupeeText,{QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_EVENTNEXT); + }; + + //Set prices on moved Scrub locations + Location(SOUTHERN_SWAMP_SCRUB_PURCHASE_CLEAR)->SetShopsanityPrice(SwampPrice); + Location(S_CLOCK_TOWN_SWAMP_SCRUB_PURCHASE)->SetShopsanityPrice(SwampPrice); + Location(GORON_VILLAGE_SCRUB_PURCHASE_SPRING)->SetShopsanityPrice(GoronPrice); + Location(SOUTHERN_SWAMP_GORON_SCRUB_PURCHASE)->SetShopsanityPrice(GoronPrice); + Location(SOUTHERN_SWAMP_GORON_SCRUB_PURCHASE_CLEAR)->SetShopsanityPrice(GoronPrice); + Location(GORON_VILLAGE_ZORA_SCRUB_PURCHASE)->SetShopsanityPrice(ZoraPrice); + Location(GORON_VILLAGE_ZORA_SCRUB_PURCHASE_SPRING)->SetShopsanityPrice(ZoraPrice); + Location(ZORA_HALL_IKANA_SCRUB_PURCHASE)->SetShopsanityPrice(IkanaPrice); + + Text SwampScrubSellText = ScrubSellTextOne + ItemTable(Location(SOUTHERN_SWAMP_SCRUB_PURCHASE)->GetPlacedItemKey()).GetHint().GetText() + + ScrubSellTextTwo + std::to_string(SwampPrice) + RupeeText; + CustomMessages::CreateMessageFromTextObject(0x15E9, 0xFFFF, 0x3FFFFFFF, 0xFF0000, SwampScrubSellText, {QM_RED, QM_MAGENTA}, {}, {}, 0x0, false, false, MESSAGE_END_EVENTNEXT); + CustomMessages::CreateMessageFromTextObject(0x15F3, 0xFFFF, 0x3FFFFFFF, 0xFF0000, SwampScrubSellText, {QM_RED, QM_MAGENTA}, {}, {}, 0x0, false, false, MESSAGE_END_EVENTNEXT); + + // This doesn't require bomb bag, right?? + Text GoronScrubSellText = ScrubSellTextOne + ItemTable(Location(GORON_VILLAGE_SCRUB_PURCHASE)->GetPlacedItemKey()).GetHint().GetText() + + ScrubSellTextTwo + std::to_string(GoronPrice) + RupeeText; + CustomMessages::CreateMessageFromTextObject(0x1600, 0xFFFF, 0x3FFFFFFF, 0xFF0000, GoronScrubSellText, {QM_RED, QM_MAGENTA}, {}, {}, 0x0, false, false, MESSAGE_END_EVENTNEXT); + CustomMessages::CreateMessageFromTextObject(0x1606, 0xFFFF, 0x3FFFFFFF, 0xFF0000, GoronScrubSellText, {QM_RED, QM_MAGENTA}, {}, {}, 0x0, false, false, MESSAGE_END_EVENTNEXT); + + Text ZoraScrubSellText = ScrubSellTextOne + ItemTable(Location(ZORA_HALL_SCRUB_PURCHASE)->GetPlacedItemKey()).GetHint().GetText() + + ScrubSellTextTwo + std::to_string(ZoraPrice) + RupeeText; + CustomMessages::CreateMessageFromTextObject(0x1612, 0xFFFF, 0x3FFFFFFF, 0xFF0000, ZoraScrubSellText, {QM_RED, QM_MAGENTA}, {}, {}, 0x0, false, false, MESSAGE_END_EVENTNEXT); + CustomMessages::CreateMessageFromTextObject(0x1617, 0xFFFF, 0x3FFFFFFF, 0xFF0000, ZoraScrubSellText, {QM_RED, QM_MAGENTA}, {}, {}, 0x0, false, false, MESSAGE_END_EVENTNEXT); + + Text IkanaScrubSellText = ScrubSellTextOne + ItemTable(Location(IKANA_CANYON_SCRUB_PURCHASE)->GetPlacedItemKey()).GetHint().GetText() + + ScrubSellTextTwo + std::to_string(IkanaPrice) + RupeeText; + CustomMessages::CreateMessageFromTextObject(0x1626, 0xFFFF, 0x3FFFFFFF, 0xFF0000, IkanaScrubSellText, {QM_RED, QM_MAGENTA}, {}, {}, 0x0, false, false, MESSAGE_END_EVENTNEXT); + CustomMessages::CreateMessageFromTextObject(0x162D, 0xFFFF, 0x3FFFFFFF, 0xFF0000, IkanaScrubSellText, {QM_RED, QM_MAGENTA}, {}, {}, 0x0, false, false, MESSAGE_END_EVENTNEXT); }; void CreateOtherHints() { From 3c9cac965388fcb123e630cc3a26339bfd860523 Mon Sep 17 00:00:00 2001 From: pizza1398 <259104093+pizza1398@users.noreply.github.com> Date: Tue, 15 Sep 2026 19:36:53 +0200 Subject: [PATCH 47/63] Curiosity Shop messages still pretty sloppy --- source/hints.cpp | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/source/hints.cpp b/source/hints.cpp index f208e70..6ae8fb5 100644 --- a/source/hints.cpp +++ b/source/hints.cpp @@ -603,19 +603,19 @@ void CreateShopMessages() { CustomMessages::CreateMessageFromTextObject(messageID + 0x6, 0xFFFF, (0x3FFFFC00 | price), 0xFF0301, shopIntro + shopDescription, {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); CustomMessages::CreateMessageFromTextObject(messageID + 0x7, 0xFFFF, (0x3FFFFC00 | price), 0xFF1301, shopIntro + buyPrompt, {QM_DEFAULT, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); } - // If Big Bomb Bag write stolen variant (inelegantly) + // If Big Bomb Bag write stolen variant (inelegantly) (Price is left unchanged... maybe someday?) if (messageID == 0x0656) { - shopIntro = Text{"#"}+itemName+"&>>"+std::to_string(1000)+Text{ + shopIntro = Text{"#"}+itemName+"&>>"+std::to_string(price)+Text{ " Rupees#&", " rubis#&", " rupias#&", " Rubine#&",// " rupie#&" }; - CustomMessages::CreateMessageFromTextObject(0x29DB, 0xFFFF, (0x3FFFFC00 | 1000), 0xFF0301, shopIntro+Text{ + CustomMessages::CreateMessageFromTextObject(0x29DB, 0xFFFF, (0x3FFFFC00 | price), 0xFF0301, shopIntro+Text{ /*English*/"This is just between us, but this is&actually a Bomb Shop product.", /*French */"Ça reste entre nous, mais c'est&un article de la boutique de bombes.", /*Spanish*/"Esto es entre nosotros, pero&es el de la tienda de bombas.", /*German */"Verrat's nicht weiter, aber die ist eigentlich Eigentum des Bomben-Shops.", // OVERFLOW RISK // /*Italian*/"he resti tra noi, ma in realtà&questo articolo appartiene al&negozio delle bombe.", // OVERFLOW RISK }, {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); - CustomMessages::CreateMessageFromTextObject(0x29DC, 0xFFFF, (0x3FFFFC00 | 1000), 0xFF1301, shopIntro + buyPrompt, {QM_DEFAULT, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); + CustomMessages::CreateMessageFromTextObject(0x29DC, 0xFFFF, (0x3FFFFC00 | price), 0xFF1301, shopIntro + buyPrompt, {QM_DEFAULT, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); } //Special message for the potion shop witch if you haven't given her a mushroom yet // WILL OVERFLOW IN MOST LANGUAGES WHEN ITEM NAME TRIGGERS LINE BREAK @@ -634,6 +634,28 @@ void CreateShopMessages() { } } + // Curiosity Shop dialogue !TEMPORARY! + Location(W_CLOCK_TOWN_ALL_NIGHT_MASK_BUY)->SetShopsanityPrice(static_cast(GetShopPrice())); + u16 allNightPrice = Location(W_CLOCK_TOWN_ALL_NIGHT_MASK_BUY)->GetPrice(); + Text csMaskIntro = Text{"#"}+GetShopItemName(Location(W_CLOCK_TOWN_ALL_NIGHT_MASK_BUY)->GetPlacedItemKey())+Text{ + "&>>" + // itemName.NAenglish.length() <= 30 ? ": " : "&>>", + // itemName.NAfrench.length() <= 30 ? " : " : "&>>", + // itemName.NAspanish.length() <= 30 ? ": " : "&>>", + // itemName.EURgerman.length() <= 30 ? ": " : "&>>", + // // itemName.EURitalian.length() <= 30 ? ": " : "&>>", + // itemName.EURenglish.length() <= 30 ? ": " : "&>>", + // itemName.EURfrench.length() <= 30 ? " : " : "&>>", + // itemName.EURspanish.length() <= 30 ? ": " : "&>>", + }+std::to_string(allNightPrice)+Text{ + " Rupees#&", " rubis#&", " rupias#&", " Rubine#&",// " rupie#&" + }; + CustomMessages::CreateMessageFromTextObject(0x29D9, 0xFFFF, (0x3FFFFC00 | allNightPrice), 0xFF0301, csMaskIntro + Text{ + "Wait, is this what I was just talking about?" + }, {QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_ENDLESS); + CustomMessages::CreateMessageFromTextObject(0x29DA, 0xFFFF, (0x3FFFFC00 | allNightPrice), 0xFF1301, csMaskIntro + buyPrompt, {QM_DEFAULT, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); + + // Custom Messages for Other Shops // Milk Bar Text MilkBarMilkItem = GetShopItemName(Location(E_CLOCK_TOWN_MILK_BAR_MILK)->GetPlacedItemKey()); From bc4f5942cc1af4d4fc0e73227f22f641f81a335f Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Tue, 15 Sep 2026 15:35:54 -0500 Subject: [PATCH 48/63] Update Z3DR --- Z3DR | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Z3DR b/Z3DR index 7d1cd0e..4b5b4ca 160000 --- a/Z3DR +++ b/Z3DR @@ -1 +1 @@ -Subproject commit 7d1cd0e4b6aca2a55db9c53268b6a0a68209e103 +Subproject commit 4b5b4ca4f938784931273bbccb61a93252b16c9d From 86adb2bb1519b0d32c829c70e44b6c6dc3584300 Mon Sep 17 00:00:00 2001 From: pizza1398 <259104093+pizza1398@users.noreply.github.com> Date: Wed, 16 Sep 2026 23:48:14 +0200 Subject: [PATCH 49/63] Disable custom pricing on incompatible shops --- source/hints.cpp | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/source/hints.cpp b/source/hints.cpp index 6ae8fb5..74c8fcf 100644 --- a/source/hints.cpp +++ b/source/hints.cpp @@ -660,10 +660,10 @@ void CreateShopMessages() { // Milk Bar Text MilkBarMilkItem = GetShopItemName(Location(E_CLOCK_TOWN_MILK_BAR_MILK)->GetPlacedItemKey()); Text MilkBarChateauItem = GetShopItemName(Location(E_CLOCK_TOWN_MILK_BAR_CHATEAU)->GetPlacedItemKey()); - Location(E_CLOCK_TOWN_MILK_BAR_MILK)->SetShopsanityPrice(static_cast(GetShopPrice())); - Location(E_CLOCK_TOWN_MILK_BAR_CHATEAU)->SetShopsanityPrice(static_cast(GetShopPrice())); - u16 MilkBarMilkPrice = Location(E_CLOCK_TOWN_MILK_BAR_MILK)->GetPrice(); - u16 MilkBarChateauPrice = Location(E_CLOCK_TOWN_MILK_BAR_CHATEAU)->GetPrice(); + // Location(E_CLOCK_TOWN_MILK_BAR_MILK)->SetShopsanityPrice(static_cast(GetShopPrice())); + // Location(E_CLOCK_TOWN_MILK_BAR_CHATEAU)->SetShopsanityPrice(static_cast(GetShopPrice())); + u16 MilkBarMilkPrice = 20;// Location(E_CLOCK_TOWN_MILK_BAR_MILK)->GetPrice(); + u16 MilkBarChateauPrice = 200;// Location(E_CLOCK_TOWN_MILK_BAR_CHATEAU)->GetPrice(); // {"English", "French", "Spanish", "German", }; // "Italian" Text MilkBarIntro = {"What'll it be?&", "Qu'est-ce que ce s'ra?", "¿Qué quiere tomar?", "Was darf's sein?", // "Cosa prendi?", "", "", "¿Qué va a ser?", }; @@ -697,14 +697,14 @@ void CreateBeanDaddyHint() { void CreateScrubPurchaseText() { //Set initial Scrub Prices - Location(SOUTHERN_SWAMP_SCRUB_PURCHASE)->SetShopsanityPrice(static_cast(GetShopPrice())); - u16 SwampPrice = Location(SOUTHERN_SWAMP_SCRUB_PURCHASE)->GetPrice(); - Location(GORON_VILLAGE_SCRUB_PURCHASE)->SetShopsanityPrice(static_cast(GetShopPrice())); - u16 GoronPrice = Location(GORON_VILLAGE_SCRUB_PURCHASE)->GetPrice(); - Location(ZORA_HALL_SCRUB_PURCHASE)->SetShopsanityPrice(static_cast(GetShopPrice())); - u16 ZoraPrice = Location(ZORA_HALL_SCRUB_PURCHASE)->GetPrice(); - Location(IKANA_CANYON_SCRUB_PURCHASE)->SetShopsanityPrice(static_cast(GetShopPrice())); - u16 IkanaPrice = Location(IKANA_CANYON_SCRUB_PURCHASE)->GetPrice(); + // Location(SOUTHERN_SWAMP_SCRUB_PURCHASE)->SetShopsanityPrice(static_cast(GetShopPrice())); + u16 SwampPrice = 10;// Location(SOUTHERN_SWAMP_SCRUB_PURCHASE)->GetPrice(); + // Location(GORON_VILLAGE_SCRUB_PURCHASE)->SetShopsanityPrice(static_cast(GetShopPrice())); + u16 GoronPrice = 200;// Location(GORON_VILLAGE_SCRUB_PURCHASE)->GetPrice(); + // Location(ZORA_HALL_SCRUB_PURCHASE)->SetShopsanityPrice(static_cast(GetShopPrice())); + u16 ZoraPrice = 40;// Location(ZORA_HALL_SCRUB_PURCHASE)->GetPrice(); + // Location(IKANA_CANYON_SCRUB_PURCHASE)->SetShopsanityPrice(static_cast(GetShopPrice())); + u16 IkanaPrice = 100;// Location(IKANA_CANYON_SCRUB_PURCHASE)->GetPrice(); Text RupeeText{" Rupees#.", " rubis#.", " rupias#.", " Rubine#.",/* " rupie#.",*/ }; Text ScrubSellTextOne = Text{ From 2bc3bcac42ee6b19207510672ba3c644cbcc64f8 Mon Sep 17 00:00:00 2001 From: pizza1398 <259104093+pizza1398@users.noreply.github.com> Date: Thu, 17 Sep 2026 16:30:17 +0200 Subject: [PATCH 50/63] Update patchside data tables - Update some hint text - Update German - Add Pendant and Stray Fairies to Ice Trap disguises - Fix(?) Magic Bean Ice Trap disguise - Fix Chateau Romani Refill in TrickNameTable - Update ItemTable Item Types --- source/hint_list.cpp | 70 ++++++++++++++++++++++---------------------- source/item_list.cpp | 16 +++++----- source/item_pool.cpp | 8 ++++- source/shops.cpp | 30 +++++++------------ 4 files changed, 60 insertions(+), 64 deletions(-) diff --git a/source/hint_list.cpp b/source/hint_list.cpp index 52f3e6f..319ca28 100644 --- a/source/hint_list.cpp +++ b/source/hint_list.cpp @@ -43,7 +43,7 @@ void HintTable_Init() { ); hintTable[GREAT_FAIRYS_SWORD] = HintText::Item({ //obscure - Text{"A powerful fairy blade", "une lame féerique", "el poderoso acero de las hadas", "eine mächtige Feenklinge"} + Text{"a powerful fairy blade", "une lame féerique", "el poderoso acero de las hadas", "eine mächtige Feenklinge"} }, //clear Text{"the Great Fairy's Sword", "l'épée de la grande fée", "la Espada de la Gran Hada", "das Feenschwert", "", "la grande épée des fées", ""} ); @@ -115,7 +115,7 @@ void HintTable_Init() { ); hintTable[LETTER_MAMA] = HintText::Item({ //obscure - Text{"A special delivery", "une livraison spéciale", "una entrega especial", "eine besondere Zustellung"} + Text{"a special delivery", "une livraison spéciale", "una entrega especial", "eine besondere Zustellung"} }, //clear Text{"the Letter to Mama", "la lettre express pour Maman", "la Entrega especial a mamá", "die Eilpost an Mama", "", "la lettre express pour maman", ""} ); @@ -383,7 +383,7 @@ void HintTable_Init() { //obscure Text{"a lost fairy", "un fragment d'être", "una hada perdida", "eine verlorene Fee"} }, //clear - Text{"the Clock Town Stray Fairy", "la fée égarée de Cadranbourg", "la hada extraviada de la Ciudad", "eine verirrte Fee aus Unruh-Stadt", "", "la fée égarée de Bourg-Clocher", ""} + Text{"the Clock Town Stray Fairy", "la fée égarée de Cadranbourg", "la hada extraviada de la Ciudad", "die verirrte Fee aus Unruh-Stadt", "", "la fée égarée de Bourg-Clocher", ""} ); hintTable[WF_STRAY_FAIRY] = HintText::Item({ //obscure @@ -426,7 +426,7 @@ void HintTable_Init() { //obscure Text{"a progressive bow", "une capacité de tir accrue", "un arco progresivo", "ein wachsender Bogen"} }, //clear - Text{"a progressive quiver", "un carquois progressif", "un carcaj progresivo", "ein Köcher-Upgrade"} + Text{"a progressive quiver", "un carquois progressif", "un carcaj progresivo", "ein Bogen-Upgrade"} ); hintTable[PROGRESSIVE_WALLET] = HintText::Item({ //obscure @@ -442,9 +442,9 @@ void HintTable_Init() { ); hintTable[PROGRESSIVE_LULLABY] = HintText::Item({ //obscure - Text{"a progressive lullaby", "une fraction de mélodie", "una canción de cuna progresiva", ""} + Text{"a progressive lullaby", "une fraction de mélodie", "una canción de cuna progresiva", "ein unvollständiges Wiegenlied"} }, //clear - Text{"a progressive lullaby", "une berceuse progressive", "una canción de cuna progresiva", ""} + Text{"a progressive lullaby", "une berceuse progressive", "una canción de cuna progresiva", "ein Schlummerlied-Upgrade"} ); //PROGRESSIVE_BOMBCHUS //BOTTLE ITEMS @@ -587,7 +587,7 @@ void HintTable_Init() { //SONGS hintTable[SONG_OF_TIME] = HintText::Item({ //obscure - Text{"song of time", "une boucle temporelle", "una canción temporal", "das Lied der Zeit"} + Text{"a timely melody", "une boucle temporelle", "una canción temporal", "das Lied der Zeit"} }, //clear Text{"the Song of Time", "le Chant du temps", "la canción del tiempo", "die Hymne der Zeit"} ); @@ -623,7 +623,7 @@ void HintTable_Init() { //); hintTable[EPONAS_SONG] = HintText::Item({ //obscure - Text{"a horses song", "l'appel d'une partenaire", "una canción equina", "das Lied eines Pferdes"} + Text{"a horse's song", "l'appel d'une partenaire", "una canción equina", "das Lied eines Pferdes"} }, //clear Text{"Epona's Song", "le Chant d'Épona", "la canción de Epona", "Eponas Lied", "", "le Chant d'Epona", ""} ); @@ -814,25 +814,25 @@ void HintTable_Init() { //); hintTable[WOODFALL_TEMPLE_SMALL_KEY] = HintText::Item({ //obscure - Text{"swampy small key", "une clé marécageuse", "una llave pantanosa", "ein sumpfiger Schlüssel"} + Text{"a swampy small key", "une clé marécageuse", "una llave pantanosa", "ein sumpfiger Schlüssel"} }, //clear Text{"the Woodfall Temple Small Key", "la petite clé du temple de Boisé-les-Cascades", "la llave pequeña del Templo del Bosque Catarata", "den Kleinen Schlüssel des Dämmerwald-Tempels", "", "la petite clé du temple de Bois-Cascade", ""} ); hintTable[SNOWHEAD_TEMPLE_SMALL_KEY] = HintText::Item({ //obscure - Text{"icy small key", "une clé glacée", "una llave helada", "ein eisiger Schlüssel"} + Text{"an icy small key", "une clé glacée", "una llave helada", "ein eisiger Schlüssel"} }, //clear Text{"a Snowhead Temple Small Key", "une petite clé du temple du Pic des neiges", "una llave pequeña del Templo del Pico Nevado", "einen Kleinen Schlüssel des Pic-Hibernia-Tempels", "", "une petite clé du temple du pic des Neiges", ""} ); hintTable[GBT_SMALL_KEY] = HintText::Item({ //obscure - Text{"ocean small key", "une clé marine", "una llave húmeda", "ein feuchter Schlüssel"} + Text{"an oceanic small key", "une clé marine", "una llave húmeda", "ein feuchter Schlüssel"} }, //clear Text{"the Great Bay Temple Small Key", "la petite clé du temple de la Grande Baie", "la llave pequeña del Templo de la Gran Bahía", "den Kleinen Schlüssel des Schädelbucht-Tempels"} ); hintTable[STONE_TOWER_TEMPLE_SMALL_KEY] = HintText::Item({ //obscure - Text{"rocky small key", "une clé rocheuse", "una llave rocosa", "ein steinerner Schlüssel"} + Text{"a rocky small key", "une clé rocheuse", "una llave rocosa", "ein steinerner Schlüssel"} }, //clear Text{"a Stone Tower Temple Small Key", "une petite clé du temple de la forteresse de pierre", "una llave pequeña del Templo de la Torre de Piedra", "einen Kleinen Schlüssel des Felsenturm-Tempels"} ); @@ -867,43 +867,43 @@ void HintTable_Init() { -----------------------*/ hintTable[RECOVERY_HEART] = HintText::Item({ //obscure - Text{"Recovery Heart", "un petit soin", "un pequeño corazón", "ein Herz zur Genesung"} + Text{"a small heal", "un petit soin", "un pequeño corazón", "ein Herz zur Genesung"} }, //clear Text{"a Recovery Heart", "un cœur de vie", "un corazón", "ein Herz"} ); hintTable[GREEN_RUPEE] = HintText::Item({ //obscure - Text{"Green rupee", "le début de la richesse", "una gema verdeante", "ein grüner Rubin"} + Text{"budding wealth", "le début de la richesse", "una gema verdeante", "ein grüner Rubin"} }, //clear Text{"a Green Rupee", "un rubis vert", "una rupia verde", "einen grünen Rubin"} ); hintTable[BLUE_RUPEE] = HintText::Item({ //obscure - Text{"Blue rupee", "une richesse azurée", "una gema cerúlea", "ein blauer Rubin"} + Text{"a blue gem", "une richesse azurée", "una gema cerúlea", "ein blauer Rubin"} }, //clear Text{"a Blue Rupee", "un rubis bleu", "una rupia azul", "einen blauen Rubin"} ); hintTable[RED_RUPEE] = HintText::Item({ //obscure - Text{"Red rupee", "une richesse écarlate", "una gema carmesí", "ein roter Rubin"} + Text{"a scarlet stone", "une richesse écarlate", "una gema carmesí", "ein roter Rubin"} }, //clear Text{"a Red Rupee", "un rubis rouge", "una rupia roja", "einen roten Rubin"} ); hintTable[PURPLE_RUPEE] = HintText::Item({ //obscure - Text{"Purple rupee", "une richesse violacée", "una gema cárdena", "ein violetter Rubin"} + Text{"a purple gem", "une richesse violacée", "una gema cárdena", "ein violetter Rubin"} }, //clear Text{"a Purple Rupee", "un rubis mauve", "una rupia púrpura", "einen violetten Rubin", "", "un rubis violet", ""} ); hintTable[SILVER_RUPEE] = HintText::Item({ //obscure - Text{"Silver rupee", "une richesse scintillante", "una gema argéntea", "ein silberner Rubin"} + Text{"shining wealth", "une richesse scintillante", "una gema argéntea", "ein silberner Rubin"} }, //clear Text{"a Silver Rupee", "un rubis argenté", "una rupia plateada", "einen silbernen Rubin"} ); hintTable[HUGE_RUPEE] = HintText::Item({ //obscure - Text{"Huge rupee", "une richesse écrasante", "una gema enorme", "ein riesiger Rubin"} + Text{"great wealth", "une richesse écrasante", "una gema enorme", "ein riesiger Rubin"} }, //clear Text{"a Huge Rupee", "un énorme rubis", "una rupia enorme", "einen goldenen Rubin"} ); @@ -1010,10 +1010,10 @@ void HintTable_Init() { Text{"a Deku Stick", "un bâton mojo", "un palo Deku", "einen Deku-Stab"} ); hintTable[CHATEAU_ROMANI_REFILL] = HintText::Item({ - //obscure - Text{"an adult beverage", "un breuvage adulte", "un trago para adultos", "ein Getränk für Erwachsene"} - }, //clear - Text{"Chateau Romani Refill", "de Cuvée Romani", "de Reserva Romani", "ein Chateau Romani"} + //obscure + Text{"an adult beverage", "un breuvage adulte", "un trago para adultos", "ein Getränk für Erwachsene"} + }, //clear + Text{"some Chateau Romani", "de la Cuvée Romani", "un relleno de Reserva Romani", "ein Chateau Romani"} ); /*---------------- @@ -1184,16 +1184,16 @@ void HintTable_Init() { Text{"the #postbox# contains", "la #boîte aux lettres# contient", "el buzón contiene", "der #Briefkasten# enthält"} ); hintTable[E_CLOCK_TOWN_MILK_BAR_CHATEAU] = HintText::Sometimes({ - //obscure - Text{"the #Bar# sells", "un #spécialiste laitier# vend", "un lugar de copas vende", "ein #exklusives Getränk# entlohnt"} - }, //clear - Text{"the #Milk Bar# sells", "le #bar laitier# vend", "el Bar Lácteo vende", "die #Milchbar# verkauft"} + //obscure + Text{"an #exclusive establishment# sells", "un #spécialiste laitier# vend", "un lugar de copas vende", "ein #exklusives Getränk# entlohnt"} + }, //clear + Text{"the #Milk Bar# sells", "le #bar laitier# vend", "el Bar Lácteo vende", "die #Milchbar# verkauft"} ); hintTable[E_CLOCK_TOWN_MILK_BAR_MILK] = HintText::Sometimes({ - //obscure - Text{"the #Bar# sells", "un #spécialiste laitier# vend", "un lugar de copas vende", "ein #Getränk# entlohnt"} - }, //clear - Text{"the #Milk Bar# sells", "le #bar laitier# vend", "el Bar Lácteo vende", "die #Milchbar# verkauft"} + //obscure + Text{"an #exclusive establishment# sells", "un #spécialiste laitier# vend", "un lugar de copas vende", "ein #Getränk# entlohnt"} + }, //clear + Text{"the #Milk Bar# sells", "le #bar laitier# vend", "el Bar Lácteo vende", "die #Milchbar# verkauft"} ); hintTable[GORMAN_TRACK_MYSTERY_MILK_QUEST] = HintText::Sometimes({ //obscure @@ -1369,7 +1369,7 @@ void HintTable_Init() { //obscure Text{"the #pirates' loot# teaches", "le #butin des pirates# enseigne", "el botín de los piratas enseña", "die #Piratenbeute# lehrt"} }, //clear - Text{"the #baby Zoras# have", "les #bébés zoras# ont", "los bebés Zora tienen", "die #Zora-Babys# haben"} + Text{"the #baby Zoras# have", "les #bébés zoras# ont", "los bebés Zora tienen", "die #geschlüpften Zora-Babys# haben"} ); hintTable[GBC_GROTTO_CHEST] = HintText::Sometimes({ //obscure @@ -3859,7 +3859,7 @@ void HintTable_Init() { //obscure Text{"the home of pirates", "le foyer des pirates", "el hogar de las piratas", "die Heimat der Piraten"} }, //clear - Text{"the Pirates' Fortress", "la forteresse des pirates", "la Fortaleza Pirata", "die Piratenfestung"} + Text{"the Pirates' Fortress", "la forteresse des pirates", "la Fortaleza Pirata", "Piratenfestung"} ); hintTable[BENEATH_THE_WELL] = HintText::DungeonName({ //obscure @@ -3883,13 +3883,13 @@ void HintTable_Init() { //obscure Text{"a home to muddy spiders", "un nid puant d'araignées", "un hogar para arañas lodosas", "ein Zuhause für schlammige Spinnen"} }, //clear - Text{"the Swamp Spider House", "la maison des araignées des marais", "la Casa de las Arañas del Pantano", "das Sumpf-Spinnenhaus"} + Text{"the Swamp Spider House", "la maison des araignées des marais", "la Casa de las Arañas del Pantano", "das Spinnenhaus im Sumpf"} ); hintTable[OSH] = HintText::DungeonName({ //obscure Text{"a home To swimming spiders", "un nid poussiéreux d'araignées", "un hogar para arañas nadadoras", "ein Zuhause für schwimmende Spinnen"} }, //clear - Text{"the Ocean Spider House", "la maison des araignées de la côte", "la Casa de las Arañas de la Playa", "das Meer-Spinnenhaus"} + Text{"the Ocean Spider House", "la maison des araignées de la côte", "la Casa de las Arañas de la Playa", "das Spinnenhaus am Meer"} ); hintTable[THE_MOON] = HintText::DungeonName({ //obscure diff --git a/source/item_list.cpp b/source/item_list.cpp index 1c4bac2..5c00085 100644 --- a/source/item_list.cpp +++ b/source/item_list.cpp @@ -14,8 +14,8 @@ void ItemTable_Init() { //repeatable denotes that an item in a vanilla playth itemTable[NONE] = Item(false, false, &noVariable, Text{"No Item", "Rien", "Sin Objeto", "Kein Item", }, NONE, (u32)GetItemID::GI_NONE, ITEMTYPE_EVENT); itemTable[KOKIRI_SWORD] = Item(true, false, &KokiriSword, Text{"Kokiri Sword", "Épée Kokiri", "Espada Kokiri", "Kokiri-Schwert", }, KOKIRI_SWORD, (u32)GetItemID::GI_KOKIRI_SWORD, ITEMTYPE_ITEM); itemTable[GREAT_FAIRYS_SWORD] = Item(true, false, &GreatFairySword, Text{"Great Fairy's Sword", "Épée de la grande fée", "Espada de la Gran Hada", "Feenschwert", "", "Grande épée des fées", "" }, GREAT_FAIRYS_SWORD, (u32)GetItemID::GI_GREAT_FAIRY_SWORD, ITEMTYPE_GFAIRY); - itemTable[HEROS_SHIELD] = Item(false, false, &HerosShield, Text{"Heros Shield", "Bouclier du Héros", "Escudo del Héroe", "Heroen-Schild", }, HEROS_SHIELD, (u32)GetItemID::GI_SHIELD_HERO, ITEMTYPE_ITEM); - itemTable[DEKU_STICK] = Item(true, false, &DekuStick, Text{"Deku Stick", "Bâton Mojo", "Palo deku", "Deku-Stab", }, DEKU_STICK, (u32)GetItemID::GI_STICKS_1, ITEMTYPE_ITEM); + itemTable[HEROS_SHIELD] = Item(false, false, &HerosShield, Text{"Hero's Shield", "Bouclier du Héros", "Escudo del Héroe", "Heroen-Schild", }, HEROS_SHIELD, (u32)GetItemID::GI_SHIELD_HERO, ITEMTYPE_REFILL); + itemTable[DEKU_STICK] = Item(true, false, &DekuStick, Text{"Deku Stick", "Bâton Mojo", "Palo deku", "Deku-Stab", }, DEKU_STICK, (u32)GetItemID::GI_STICKS_1, ITEMTYPE_REFILL); itemTable[LAND_TITLE] = Item(true, true, &LandTitle, Text{"Land Title Deed", "Titre de terre", "Escritura de propiedad de la Ciudad", "Land-Urkunde", }, LAND_TITLE, (u32)GetItemID::GI_TOWN_TITLE_DEED, ITEMTYPE_TRADE); itemTable[SWAMP_TITLE] = Item(true, true, &SwampTitle, Text{"Swamp Title Deed", "Titre de marais", "Escritura de propiedad del Pantano", "Sumpf-Urkunde", }, SWAMP_TITLE, (u32)GetItemID::GI_SWAMP_TITLE_DEED, ITEMTYPE_TRADE); itemTable[MOUNTAIN_TITLE] = Item(true, true, &MountainTitle, Text{"Mountain Title Deed", "Titre de montagne", "Escritura de propiedad de la Montañaa", "Berg-Urkunde", }, MOUNTAIN_TITLE, (u32)GetItemID::GI_MOUNTAIN_TITLE_DEED, ITEMTYPE_TRADE); @@ -38,7 +38,7 @@ void ItemTable_Init() { //repeatable denotes that an item in a vanilla playth itemTable[DOUBLE_DEFENSE] = Item(true, false, &noVariable, Text{"Double Defense", "Résistance Double", "Poder defensivo doble", "Verstärkter Rüstungsschutz", }, DOUBLE_DEFENSE, 0xB2, ITEMTYPE_GFAIRY); itemTable[OCARINA_OF_TIME] = Item(true, false, &Ocarina, Text{"Ocarina of Time", "Ocarina du temps", "Ocarina del Tiempo", "Ocarina der Zeit", }, OCARINA_OF_TIME, (u32)GetItemID::GI_OCARINA_OF_TIME, ITEMTYPE_ITEM); itemTable[PICTOGRAPH_BOX] = Item(true, false, &Pictobox, Text{"Pictograph Box", "Boite à image", "Caja Luminográfica", "Fotobox", }, PICTOGRAPH_BOX, (u32)GetItemID::GI_PICTOGRAPH_BOX, ITEMTYPE_ITEM); - itemTable[POWDER_KEG] = Item(true, false, &PowderKeg, Text{"Powder Keg", "Baril de poudre", "Barril de Pólvora", "Pulverfass", }, POWDER_KEG, (u32)GetItemID::GI_POWDER_KEG, ITEMTYPE_ITEM); + itemTable[POWDER_KEG] = Item(true, false, &PowderKeg, Text{"Powder Keg", "Baril de poudre", "Barril de Pólvora", "Pulverfass", }, POWDER_KEG, (u32)GetItemID::GI_POWDER_KEG, ITEMTYPE_REFILL); itemTable[KEATON_MASK] = Item(true, false, &KeatonMask, Text{"Keaton Mask", "Masque de keaton", "Máscara Keaton", "Fuchsmaske", "", "Masque de renard", "" }, KEATON_MASK, (u32)GetItemID::GI_MASK_KEATON, ITEMTYPE_MASK); itemTable[BUNNY_HOOD] = Item(true, false, &BunnyHood, Text{"Bunny Hood", "Capuchon de lapin", "Capucha de conejo", "Hasenohren", "", "Masque de lapin", "" }, BUNNY_HOOD, (u32)GetItemID::GI_MASK_BUNNY_HOOD, ITEMTYPE_MASK); itemTable[GORON_MASK] = Item(true, false, &GoronMask, Text{"Goron Mask", "Masque goron", "Máscara Goron", "Goronen-Haut", }, GORON_MASK, (u32)GetItemID::GI_MASK_GORON, ITEMTYPE_MASK); @@ -98,7 +98,7 @@ void ItemTable_Init() { //repeatable denotes that an item in a vanilla playth itemTable[CHATEAU_ROMANI] = Item(true, false, &ChateauBottle, Text{"Chateau Romani", "Cuvée Romani", "Reserva Romani", "Chateau Romani", }, CHATEAU_ROMANI, (u32)GetItemID::GI_BOTTLE_CHATEAU_ROMANI, ITEMTYPE_ITEM); itemTable[BOTTLE_WITH_MYSTERY_MILK] = Item(true, true, &MysteryMilkBottle, Text{"Bottle with Mystery Milk", "Flacon de lait mystère", "Botella de leche sospechosa", "Flasche mit verdächtiger Milch", "", "Flacon de lait suspect", "" }, BOTTLE_WITH_MYSTERY_MILK, (u32)GetItemID::GI_BOTTLE_MYSTERY_MILK, ITEMTYPE_QUEST); //Other bottle items - itemTable[DEKU_PRINCESS] = Item(true, true, &DekuPrincess, Text{"Deku Princess", "Princesse Mojo", "Princesa Deku", "Deku-Prinzessin", }, DEKU_PRINCESS, (u32)GetItemID::GI_DEKU_PRINCESS_FAIRY, ITEMTYPE_ITEM); + itemTable[DEKU_PRINCESS] = Item(true, true, &DekuPrincess, Text{"Deku Princess", "Princesse Mojo", "Princesa Deku", "Deku-Prinzessin", }, DEKU_PRINCESS, (u32)GetItemID::GI_DEKU_PRINCESS_FAIRY, ITEMTYPE_REFILL); itemTable[BOTTLE_WITH_GREEN_POTION] = Item(false, false, &HasBottle, Text{"Bottle with Green Potion", "Flacon de potion verte", "Botella de poción verde", "Flasche mit grünem Elixir", }, BOTTLE_WITH_GREEN_POTION, (u32)GetItemID::GI_POTION_GREEN, ITEMTYPE_ITEM); itemTable[BOTTLE_WITH_BLUE_POTION] = Item(false, false, &HasBottle, Text{"Bottle with Blue Potion", "Flacon de potion bleue", "Botella de poción azul", "Flasche mit blauem Elixir", }, BOTTLE_WITH_BLUE_POTION, (u32)GetItemID::GI_POTION_BLUE, ITEMTYPE_ITEM); itemTable[BOTTLE_WITH_FAIRY] = Item(false, false, &HasBottle, Text{"Bottle with Fairy", "Fée en flacon", "Botella con hada", "Flasche mit einer kleinen Fee", }, BOTTLE_WITH_FAIRY, (u32)GetItemID::GI_FAIRY, ITEMTYPE_ITEM); @@ -111,7 +111,7 @@ void ItemTable_Init() { //repeatable denotes that an item in a vanilla playth itemTable[BOTTLE_WITH_ZORA_EGG] = Item(false, true, &HasBottle, Text{"Bottle with Zora Egg", "Œuf de Zora en flacon", "Botella con huevo Zora", "Flasche mit einem Zora-Ei", }, BOTTLE_WITH_ZORA_EGG, (u32)GetItemID::GI_BOTTLE_ZORA_EGG, ITEMTYPE_ITEM); itemTable[BOTTLE_WITH_MUSHROOM] = Item(false, false, &HasBottle, Text{"Bottle with Mushroom", "Champignon magique en flacon", "Botella con champiñón mágico", "Flasche mit magischem Pilz", }, BOTTLE_WITH_MUSHROOM, (u32)GetItemID::GI_BOTTLE_MAGIC_MUSHROOM, ITEMTYPE_ITEM); itemTable[ZORA_EGG] = Item(false, true, &ZoraEgg, Text{"Zora Egg", "Œuf de Zora", "Huevo Zora", "Zora-Ei", }, ZORA_EGG, (u32)GetItemID::GI_BOTTLE_ZORA_EGG, ITEMTYPE_ITEM); - itemTable[SEAHORSE] = Item(true, true, &Seahorse, Text{"Seahorse", "Hippocampe", "Caballo de mar", "Seepferdchen", }, SEAHORSE, (u32)GetItemID::GI_BOTTLE_SEAHORSE, ITEMTYPE_ITEM); + itemTable[SEAHORSE] = Item(true, true, &Seahorse, Text{"Seahorse", "Hippocampe", "Caballo de mar", "Seepferdchen", }, SEAHORSE, (u32)GetItemID::GI_BOTTLE_SEAHORSE, ITEMTYPE_REFILL); //Upgrades itemTable[RAZOR_SWORD] = Item(true, false, &RazorSword, Text{"Razor Sword", "Lame Rasoir", "Espada Afilada", "Elfenschwert", }, RAZOR_SWORD, (u32)GetItemID::GI_RAZOR_SWORD, ITEMTYPE_ITEM); @@ -180,7 +180,7 @@ void ItemTable_Init() { //repeatable denotes that an item in a vanilla playth //itemTable[PRE_CLOCK_TOWN_CHEST] = Item(false,0, &noVariable, Text{ "Deku Nuts (10)", "Noix Mojo (10)", "Nueces deku (10)" }, "Pre-Clock Town Chest", Region::BeneathClockTown, PRE_CLOCK_TOWN_CHEST, (u32)GetItemID::GI_NUTS_10, ItemCategory::DekuNuts, LocationCategory::GlitchesRequired); //Generic Items - itemTable[RECOVERY_HEART] = Item(false, false, &noVariable, Text{"Recovery Heart", "Cœur de vie", "Corazón", "Herz", }, RECOVERY_HEART, (u32)GetItemID::GI_RECOVERY_HEART_SINGLE, ITEMTYPE_ITEM); + itemTable[RECOVERY_HEART] = Item(false, false, &noVariable, Text{"Recovery Heart", "Cœur de vie", "Corazón", "Herz", }, RECOVERY_HEART, (u32)GetItemID::GI_RECOVERY_HEART_SINGLE, ITEMTYPE_REFILL); itemTable[GREEN_RUPEE] = Item(false, false, &noVariable, Text{"Green Rupee", "Rubis vert", "Rupia verde", "Grüner Rubin", }, GREEN_RUPEE, (u32)GetItemID::GI_RUPEE_GREEN, ITEMTYPE_ITEM); itemTable[BLUE_RUPEE] = Item(false, false, &noVariable, Text{"Blue Rupee", "Rubis bleu", "Rupia azul", "Blauer Rubin", }, BLUE_RUPEE, (u32)GetItemID::GI_RUPEE_BLUE, ITEMTYPE_ITEM); itemTable[RED_RUPEE] = Item(false, false, &noVariable, Text{"Red Rupee", "Rubis rouge", "Rupia roja", "Roter Rubin", }, RED_RUPEE, (u32)GetItemID::GI_RUPEE_RED, ITEMTYPE_ITEM); @@ -191,7 +191,7 @@ void ItemTable_Init() { //repeatable denotes that an item in a vanilla playth itemTable[HEART_CONTAINER] = Item(true, false, &HeartContainers, Text{"Heart Container", "Réceptacle de cœur", "Contenedor de corazón", "Herzcontainer", }, HEART_CONTAINER, (u32)GetItemID::GI_HEART_CONTAINER, ITEMTYPE_ITEM); itemTable[ICE_TRAP] = Item(false, false, &noVariable, Text{"Ice Trap", "Piège de glace", "Trampa de hielo", "Eis-Falle", }, ICE_TRAP, 0x12, ITEMTYPE_ITEM); itemTable[MILK] = Item(false, false, &HasBottle, Text{"Milk", "Lait", "Leche", "Milch", }, NONE, 0x92, ITEMTYPE_REFILL); - itemTable[CHATEAU_ROMANI_REFILL] = Item(false, false, &HasBottle, Text{"Chateau Romani Refill", "Cuvée Romani", "Reserva Romani", "Chateau Romani", "", "", "" }, NONE, 0x91, ITEMTYPE_REFILL); + itemTable[CHATEAU_ROMANI_REFILL] = Item(false, false, &HasBottle, Text{"Chateau Romani Refill", "Cuvée Romani", "Reserva Romani", "Chateau Romani", }, CHATEAU_ROMANI_REFILL, 0x91, ITEMTYPE_REFILL); //Refills itemTable[BOMBS_5] = Item(false, false, &noVariable, Text{"Bombs (5)", "Bombes (5)", "Bombas (5)", "5 Bomben", }, BOMBS_5, (u32)GetItemID::GI_BOMBS_5, ITEMTYPE_REFILL); @@ -228,7 +228,7 @@ void ItemTable_Init() { //repeatable denotes that an item in a vanilla playth //Progressive Items itemTable[PROGRESSIVE_SWORD] = Item(true, false, &ProgressiveSword, Text{"Progressive Sword", "Lame (prog.)", "Espada progresiva", "Schwert-Upgrade", }, PROGRESSIVE_SWORD, 0x4A, ITEMTYPE_ITEM); itemTable[PROGRESSIVE_BOMB_BAG] = Item(true, false, &ProgressiveBombBag, Text{"Progressive Bomb Bag", "Sac de bombes (prog.)", "Saco de bombas progresivo", "Bombentaschen-Upgrade", }, PROGRESSIVE_BOMB_BAG, 0x46, ITEMTYPE_ITEM); - itemTable[PROGRESSIVE_BOW] = Item(true, false, &ProgressiveBow, Text{"Progressive Bow", "Arc (prog.)", "Arco progresivo", "Köcher-Upgrade", }, PROGRESSIVE_BOW, 0x47, ITEMTYPE_ITEM); + itemTable[PROGRESSIVE_BOW] = Item(true, false, &ProgressiveBow, Text{"Progressive Bow", "Arc (prog.)", "Arco progresivo", "Bogen-Upgrade", }, PROGRESSIVE_BOW, 0x47, ITEMTYPE_ITEM); itemTable[PROGRESSIVE_WALLET] = Item(true, false, &ProgressiveWallet, Text{"Progressive Wallet", "Bourse (prog.)", "Bolsa de rupias progresiva", "Geldbörsen-Upgrade", }, PROGRESSIVE_WALLET, 0x48, ITEMTYPE_ITEM); itemTable[PROGRESSIVE_MAGIC_METER] = Item(true, false, &ProgressiveMagic, Text{"Progressive Magic Meter", "Jauge de magie (prog)", "Poder mágico progresivo", "Magie-Upgrade", "", "Capacité de magie (prog.)", "" }, PROGRESSIVE_MAGIC_METER, 0x49, ITEMTYPE_GFAIRY); itemTable[PROGRESSIVE_LULLABY] = Item(true, false, &ProgressiveLullaby, Text{"Progressive Lullaby", "Berceuse (prog.)", "Canción de cuna progresiva", "Schlummerlied-Upgrade", }, PROGRESSIVE_LULLABY, 0x45, ITEMTYPE_SONG); diff --git a/source/item_pool.cpp b/source/item_pool.cpp index 3e54dff..1cd2007 100644 --- a/source/item_pool.cpp +++ b/source/item_pool.cpp @@ -803,7 +803,7 @@ void GenerateItemPool() { if (ItemPoolValue.Is(ItemPoolSetting::ITEMPOOL_PLENTIFUL)){ AddItemToPool(PendingJunkPool, MAGIC_BEAN_PACK); } - IceTrapModels.push_back(0x75); + IceTrapModels.push_back(0x35); // GI_MAGIC_BEAN } else { PlaceItemInLocation(DEKU_PALACE_BEAN_SELLER, MAGIC_BEAN_PACK); } @@ -975,6 +975,7 @@ void GenerateItemPool() { IceTrapModels.push_back(0x8F); // GI_MASK_KAFEIS IceTrapModels.push_back(0x85); // GI_MASK_COUPLES IceTrapModels.push_back(0xAA); // GI_LETTER_TO_KAFEI + IceTrapModels.push_back(0xAB); // GI_PENDANT_OF_MEMORIES IceTrapModels.push_back(0xA1); // GI_LETTER_TO_MAMA IceTrapModels.push_back(0xA0); // GI_ROOM_KEY } else { @@ -1109,6 +1110,10 @@ void GenerateItemPool() { AddItemToMainPool(SH_STRAY_FAIRY, 15); AddItemToMainPool(GBT_STRAY_FAIRY, 15); AddItemToMainPool(ST_STRAY_FAIRY, 15); + IceTrapModels.push_back(0xBC); // Woodfall Stray + IceTrapModels.push_back(0xBD); // Snowhead Stray + IceTrapModels.push_back(0xBE); // Great Bay Stray + IceTrapModels.push_back(0xBF); // Ikana Stray } //CLOCK TOWN STRAY FAIRY (Separated because it's not in a dungeon) @@ -1117,6 +1122,7 @@ void GenerateItemPool() { } else { AddItemToMainPool(CT_STRAY_FAIRY, 1); + IceTrapModels.push_back(0xBB); // Clock Town Stray } //DungeonRewards diff --git a/source/shops.cpp b/source/shops.cpp index bcf4f2c..d0c385a 100644 --- a/source/shops.cpp +++ b/source/shops.cpp @@ -404,7 +404,7 @@ void InitTrickNames() { Text{"Mask of Troupe", "", "", "", }, Text{"Mask of Tooth", "", "", "", }, }; - trickNameTable[0xBA] = { /*Fishing Pass*/ + trickNameTable[(u32)GetItemID::GI_FISHING_HOLE_PASS] = { Text{"Fishing Voucher", "", "", "", }, Text{"Finishing Pass", "", "", "", }, Text{"Fishing Bass", "", "", "", }, @@ -759,7 +759,7 @@ void InitTrickNames() { Text{"Hurt Container", "", "", "", }, Text{"Heart Contained", "", "", "", }, }; - trickNameTable[0x92] = { /*Milk*/ + trickNameTable[(u32)GetItemID::GI_BOTTLE_MILK_REFILL] = { Text{"Lactose Liquid", "", "", "", }, Text{"Mink", "", "", "", }, Text{"Miik", "", "", "", }, @@ -794,22 +794,22 @@ void InitTrickNames() { Text{"Bombtschüss (20)", "", "", "", }, Text{"Bombshoes (20)", "", "", "", }, }; - trickNameTable[0x1E] = { /*Arrows (10)*/ + trickNameTable[(u32)GetItemID::GI_ARROWS_SMALL] = { // (10) Text{"Bolts (10)", "", "", "", }, Text{"Errors (10)", "", "", "", }, Text{"Arrows (0)", "", "", "", }, }; - trickNameTable[0x1F] = { /*Arrows (30)*/ + trickNameTable[(u32)GetItemID::GI_ARROWS_MEDIUM] = { // (30) Text{"Bolts (30)", "", "", "", }, Text{"Errors (30)", "", "", "", }, Text{"Arrows (Enough)", "", "", "", }, }; - trickNameTable[0x20] = { /*Arrows (40)*/ + trickNameTable[(u32)GetItemID::GI_ARROWS_LARGE] = { // (40) Text{"Bolts (40)", "", "", "", }, Text{"Errors (40)", "", "", "", }, Text{"Arrows (Several)", "", "", "", }, }; - trickNameTable[0x21] = { /*Arrows (50)*/ + trickNameTable[(u32)GetItemID::GI_ARROWS_LARGEST] = { // (50) Text{"Bolts (50)", "", "", "", }, Text{"Errors (50)", "", "", "", }, Text{"Arrows (Plenty)", "", "", "", }, @@ -824,16 +824,6 @@ void InitTrickNames() { Text{"Deku Seeds (10)", "", "", "", }, Text{"Deku Nest (10)", "", "", "", }, }; - trickNameTable[(u32)GetItemID::GI_ARROWS_MEDIUM] = { /*Arrows (10) again?*/ - Text{"Bolts (10)", "", "", "", }, - Text{"Errors (10)", "", "", "", }, - Text{"Arrows (0)", "", "", "", }, - }; - trickNameTable[(u32)GetItemID::GI_ARROWS_LARGE] = { /*Arrows (30)*/ - Text{"Bolts (30)", "", "", "", }, - Text{"Errors (30)", "", "", "", }, - Text{"Arrows (Enough)", "", "", "", }, - }; trickNameTable[(u32)GetItemID::GI_FAIRY] = { Text{"Sprite", "", "", "", }, Text{"Fairy Refill", "", "", "", }, @@ -869,10 +859,10 @@ void InitTrickNames() { Text{"Progressive Lab Ally", "", "", "", }, Text{"Progressive Lullabye", "", "", "", }, }; - trickNameTable[0x92] = { /*Chateau Romani Refill*/ - Text{"Fancy Milk", "", "", "", }, - Text{"Adult Beverage", "", "", "", }, - Text{"Chateau LonLon", "", "", "", }, + trickNameTable[0x91] = { /*Chateau Romani Refill*/ + Text{"Fancy Milk Refill", "", "", "", }, + Text{"Adult Beverage Refill", "", "", "", }, + Text{"Chateau LonLon Refill", "", "", "", }, }; } From c7d921928700fd1cedc6aa9e466758147a7cfedc Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Thu, 17 Sep 2026 15:29:29 -0500 Subject: [PATCH 51/63] Update Z3DR --- Z3DR | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Z3DR b/Z3DR index 4b5b4ca..d96f60c 160000 --- a/Z3DR +++ b/Z3DR @@ -1 +1 @@ -Subproject commit 4b5b4ca4f938784931273bbccb61a93252b16c9d +Subproject commit d96f60cc49a7cb671815570a3d19f965dbc8413c From 5d10cea5342d19763875545ce13a565d6605bcd5 Mon Sep 17 00:00:00 2001 From: pizza1398 <259104093+pizza1398@users.noreply.github.com> Date: Thu, 17 Sep 2026 21:59:37 +0200 Subject: [PATCH 52/63] Rudimentary Gorman milk purchase message --- source/hints.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/source/hints.cpp b/source/hints.cpp index 74c8fcf..66d63f6 100644 --- a/source/hints.cpp +++ b/source/hints.cpp @@ -680,6 +680,13 @@ void CreateShopMessages() { // {}, {}, {}, 0x0, false, false, MESSAGE_END_NORMAL); // For refusing purchase // Milk Road Gorman Bros Milk + u16 gormanMilkPrice = 50; + CustomMessages::CreateMessageFromTextObject(0x3466, 0xFFFF, (0x3FFFFC00 | gormanMilkPrice), 0xff1001, Text{"#"} + std::to_string(gormanMilkPrice) + Text{ + " Rupees# for one #Mystery Item#&" + } + ">2" + Text{ + "#I'll buy it&No thanks#" + }, {QM_MAGENTA, QM_RED, QM_GREEN}, {}, {}, 0x0, false, false, MESSAGE_END_NULL); + }; void CreateBeanDaddyHint() { From 68e7ecbe9bc34b88f55a2bb50f13a9bf47394544 Mon Sep 17 00:00:00 2001 From: Tacoman369 <90735287+Tacoman369@users.noreply.github.com> Date: Thu, 17 Sep 2026 17:01:18 -0500 Subject: [PATCH 53/63] Settings Updates - Adds missing IngameSettings to pre - set options in the Ingame Menu - Adds Descriptions for settings - Update Z3DR Back to dev (Since Shopsanity Branch is now merged) --- Z3DR | 2 +- source/include/setting_descriptions.hpp | 7 ++- source/setting_descriptions.cpp | 11 ++++ source/settings.cpp | 68 ++++++++++++++++--------- 4 files changed, 62 insertions(+), 26 deletions(-) diff --git a/Z3DR b/Z3DR index d96f60c..3ff6427 160000 --- a/Z3DR +++ b/Z3DR @@ -1 +1 @@ -Subproject commit d96f60cc49a7cb671815570a3d19f965dbc8413c +Subproject commit 3ff64279ebaf0300970ecd1670c0febbf15df69a diff --git a/source/include/setting_descriptions.hpp b/source/include/setting_descriptions.hpp index 63e73c4..6f11f4a 100644 --- a/source/include/setting_descriptions.hpp +++ b/source/include/setting_descriptions.hpp @@ -225,6 +225,7 @@ extern string_view skipHMSCutsceneDesc; extern string_view skipDarmaniCutsceneDesc; extern string_view skipMikauCutsceneDesc; extern string_view skipGiantCutsceneDesc; +extern string_view skipPiratesCutsceneDesc; extern string_view skipBombersMinigameDesc; extern string_view NARegionDesc; extern string_view EURegionDesc; @@ -249,4 +250,8 @@ extern string_view ingameFirstPersonCameraDesc; extern string_view ingameFreeCameraDesc; extern string_view ingameMotionControlsDesc; extern string_view ingameSwimmingControlsDesc; -extern string_view ingameAdjustVolumeDesc; \ No newline at end of file +extern string_view ingameAdjustVolumeDesc; +extern string_view ingameMuteSoundDesc; +extern string_view ingameMuteBGMDesc; +extern string_view ingameFastSongsDesc; +extern string_view ingameShuffleSFXDesc; \ No newline at end of file diff --git a/source/setting_descriptions.cpp b/source/setting_descriptions.cpp index 9b5813f..af5df69 100644 --- a/source/setting_descriptions.cpp +++ b/source/setting_descriptions.cpp @@ -603,6 +603,8 @@ string_view skipHMSCutsceneDesc = "Skips the initial Happy Mask Salesman's c string_view skipDarmaniCutsceneDesc = "Skips the Song of Healing Cutscene for Darmani"; // string_view skipMikauCutsceneDesc = "Skips the Song of Healing Cutscene for Mikau"; // string_view skipGiantCutsceneDesc = "Skips the cutscene of the giants catching the moon";// +string_view skipPiratesCutsceneDesc = "Skips the cutscene of the pirates attempting to enter\n"// + "Great Bay Temple after hookshotting onto the turtle";// /*------------------------------ // | REGION OPTIONS | // ------------------------------*/ // @@ -679,3 +681,12 @@ string_view ingameSwimmingControlsDesc = "Sets the Zora swimming control scheme "file. \"Vanilla\" is the game's default."; // string_view ingameAdjustVolumeDesc = "Sets the overall volume on a new file.\n" // "\"Vanilla\" is the game's default."; // +string_view ingameMuteSoundDesc = "Enables or Disables Sound Effects on a new file.";// +string_view ingameMuteBGMDesc = "Enables or Disables Background Music on a new file.";// +string_view ingameFastSongsDesc = "Allows for Adjusting length of playback of songs.\n"// + "Don't Skip = Vanilla,\n" // + "Skip allows for faster movement after playing song\n"// + "With or without song audio playback."; // +string_view ingameShuffleSFXDesc = "Shuffle Sound Effects: \n" // + "Categorical = SFX are shuffled amongst similar sounds\n"// + "Chaos = All SFX shuffled with no restrictions."; // \ No newline at end of file diff --git a/source/settings.cpp b/source/settings.cpp index c84ad78..d208a00 100644 --- a/source/settings.cpp +++ b/source/settings.cpp @@ -378,7 +378,7 @@ namespace Settings { Option Shopsanity = Option::Bool("Shopsanity", {"Off", "On"}, {shopsOff, shopsOn}, OptionCategory::Setting, 0); Option ShopsanityPrices = Option::Bool("Shopsanity Prices", {"Random", "Affordable"}, {shopPricesRandom, shopPricesAffordable}, OptionCategory::Setting, 0); Option Tokensanity = Option::Bool("Tokensanity", {"Off", "On"}, {tokensOff, tokensAllTokens}, OptionCategory::Setting, 0); - Option Scrubsanity = Option::Bool("Shuffle Scrub Purchases",{"Off", "On"}, {scrubsOff, scrubsOn}, OptionCategory::Toggle, 0); + Option Scrubsanity = Option::Bool("Shuffle Scrub Purchases",{"Off", "On"}, {scrubsOff, scrubsOn}, OptionCategory::Setting, 0); Option ShuffleMerchants = Option::Bool("Shuffle Scrub Trades", {"Off", "On"}, {shuffleMerchantsDesc}); Option ShuffleTradeItems = Option::Bool("Shuffle Anju and Kafei",{"Off", "On"}, {shuffleTradeItemsDesc}); Option ShuffleGFRewards = Option::U8 ("Shuffle Fairy Rewards", {"Off", "Great Fairies", "Anywhere" }, {shuffleGFVanilla, shuffleGFSelf, shuffleGFAnywhere}, OptionCategory::Setting, (u8)GreatFairyRewardShuffleSetting::GFREWARDSHUFFLE_VANILLA); @@ -495,16 +495,22 @@ namespace Settings { Option BombchusInLogic = Option::U8("Bombchus In Logic", { "Off", "On" }, { bombchuInLogicDesc }); Option FastMasks = Option::Bool("Fast Mask Transform", {"No", "Yes"}, {fastMaskDesc}); Option NotebookAnimations = Option::Bool("Fast Notebook", {"No", "Yes"}, {disableBotebookAnimation}); + // In-game options written into CommonDataSub1 when a new file is created. Index 0 is // "Vanilla" throughout, which leaves the game's own default in place -- only the Adjust // Volume encoding (0 Lower / 1 Normal / 2 Higher) is confirmed against the save data, so the - // rest are opt-in rather than applied silently. - Option IngameLTargeting = Option::U8("L-Targeting", {"Vanilla", "Switch", "Hold"}, {ingameLTargetingDesc}); - Option IngameFirstPersonCamera = Option::U8("First Person Camera", {"Vanilla", "Normal", "Invert Y Axis", "Invert X Axis", "Invert Both"}, {ingameFirstPersonCameraDesc}); - Option IngameFreeCamera = Option::U8("Free Camera", {"Vanilla", "Normal", "Invert Y Axis", "Invert X Axis", "Invert Both"}, {ingameFreeCameraDesc}); - Option IngameMotionControls = Option::U8("Motion Controls", {"Vanilla", "On", "Off"}, {ingameMotionControlsDesc}); - Option IngameSwimmingControls = Option::U8("Swimming Controls", {"Vanilla", "Normal", "Invert Y Axis"}, {ingameSwimmingControlsDesc}); - Option IngameAdjustVolume = Option::U8("Adjust Volume", {"Vanilla", "Lower", "Normal", "Higher"}, {ingameAdjustVolumeDesc}); + // rest are opt-in rather than applied silently. + Option IngameLTargeting = Option::U8("L-Targeting", {"Vanilla", "Switch", "Hold"}, {ingameLTargetingDesc}); + Option IngameFirstPersonCamera = Option::U8("First Person Camera", {"Vanilla", "Normal", "Invert Y Axis", "Invert X Axis", "Invert Both"}, {ingameFirstPersonCameraDesc}); + Option IngameFreeCamera = Option::U8("Free Camera", {"Vanilla", "Normal", "Invert Y Axis", "Invert X Axis", "Invert Both"}, {ingameFreeCameraDesc}); + Option IngameMotionControls = Option::U8("Motion Controls", {"Vanilla", "On", "Off"}, {ingameMotionControlsDesc}); + Option IngameSwimmingControls = Option::U8("Swimming Controls", {"Vanilla", "Normal", "Invert Y Axis"}, {ingameSwimmingControlsDesc}); + Option IngameAdjustVolume = Option::U8("Adjust Volume", {"Vanilla", "Lower", "Normal", "Higher"}, {ingameAdjustVolumeDesc}); + Option IngameMuteSound = Option::Bool("Mute Sound Effects", {"Off", "On"}, {ingameMuteSoundDesc}); + Option IngameMuteBGM = Option::Bool("Mute Background Music", {"Off", "On"}, {ingameMuteBGMDesc}); + Option IngameFastSongs = Option::U8("Fast Ocarina Songs", {"Don't Skip", "Skip (No Audio)", "Skip (W/ Audio)"}, {ingameFastSongsDesc}); + Option ShuffleMusic = Option::U8("Shuffle Music", {"Off", "Background Music", "Fanfares", "All"}, {musicRandoDesc}); + Option IngameShuffleSFX = Option::U8("Shuffle Sound Effects", {"Off", "Categorical", "Chaos"}, {ingameShuffleSFXDesc}); std::vector ingameOptions = { &IngameLTargeting, @@ -513,6 +519,11 @@ namespace Settings { &IngameMotionControls, &IngameSwimmingControls, &IngameAdjustVolume, + &IngameFastSongs, + &IngameMuteSound, + &IngameMuteBGM, + &ShuffleMusic, + &IngameShuffleSFX, }; std::vector comfortOptions = { @@ -537,7 +548,7 @@ namespace Settings { Option GoodDampeRNG = Option::Bool("Good Dampe RNG", { "No", "Yes" }, { goodDampeRNGDesc }); Option IncreasePushSpeed = Option::Bool("Increased Push Speed", { "No", "Yes" }, { increasePushSpeedDesc }); Option FastArrowSwitch = Option::Bool("Fast Arrow Switching", { "No", "Yes" }, { fastArrowSwitchDesc }); - Option FastElegyStatues = Option::Bool("Fast Elegy Statues", { "No", "Yes" }, { fastElegyStatuesDesc }); + //Option FastElegyStatues = Option::Bool("Fast Elegy Statues", { "No", "Yes" }, { fastElegyStatuesDesc }); Option SkipSongReplays = Option::U8("Skip Song Replays", { "Don't Skip", "Skip (No SFX)", "Skip (Keep SFX)" }, {skipSongReplaysDesc}); Option SkipEponaRace = Option::Bool("Skip Epona Race", { "No", "Yes" }, { skipEponaRaceDesc }); Option OcarinaDive = Option::Bool("Ocarina Dive", { "No", "Yes" }, {ocarinaDiveDesc}); @@ -556,7 +567,7 @@ namespace Settings { //&GoodDampeRNG, //&IncreasePushSpeed, //&FastArrowSwitch, - &FastElegyStatues, + //&FastElegyStatues, &FastZoraSwim, &OcarinaDive, &DpadTransform, @@ -571,11 +582,13 @@ namespace Settings { Option SkipDarmaniCutscenes = Option::Bool("Skip Darmani Cutscenes", {"Don't Skip", "Skip"}, {skipDarmaniCutsceneDesc}); Option SkipMikauCutscenes = Option::Bool("Skip Mikau Cutscenes", {"Don't Skip", "Skip"}, {skipMikauCutsceneDesc}); Option SkipGiantCutscenes = Option::Bool("Skip Giants Cutscene", {"Don't Skip", "Skip"}, {skipGiantCutsceneDesc}); + Option SkipPirateCutscenes = Option::Bool("Skip Pirate Cutscenes", {"Don't Skip", "Skip"}, {skipPirateCutscenesDesc}); std::vector