diff --git a/source/hint_list.cpp b/source/hint_list.cpp index 9a411f8..36e669f 100644 --- a/source/hint_list.cpp +++ b/source/hint_list.cpp @@ -3885,6 +3885,12 @@ void HintTable_Init() { }, //clear Text{"the Stone Tower Temple", "le temple de la forteresse de pierre", "el Templo de la Torre de Piedra", "den Felsenturm-Tempel"} ); + hintTable[GIANTS_OATH_AREA] = HintText::DungeonName({ + //obscure + Text{"an oath", "un serment", "un juramento", "ein Schwur"} + }, //clear + Text{"the Oath to Order", "l'Ode de l'appel", "la oda al orden", "den Gesang des Himmels"} + ); hintTable[PIRATE_FORTRESS] = HintText::DungeonName({ //obscure Text{"the home of pirates", "le foyer des pirates", "el hogar de las piratas", "die Heimat der Piraten"} diff --git a/source/include/keys.hpp b/source/include/keys.hpp index ce21b9e..28f3a23 100644 --- a/source/include/keys.hpp +++ b/source/include/keys.hpp @@ -931,6 +931,7 @@ typedef enum { STONE_TOWER_TEMPLE_INVERTED_THIN_BRIDGE_ROOM, STONE_TOWER_TEMPLE_PRE_BOSS_ROOM, STONE_TOWER_TEMPLE_BOSS_ROOM, + GIANTS_OATH_AREA, PIRATE_FORTRESS_EXTERIOR, PIRATE_FORTRESS_MAZE_ROOM, PIRATE_FORTRESS_CAGE_ROOM, diff --git a/source/item_list.cpp b/source/item_list.cpp index 3953b11..150121b 100644 --- a/source/item_list.cpp +++ b/source/item_list.cpp @@ -212,8 +212,8 @@ void ItemTable_Init() { itemTable[GREEN_POTION_REFILL] = Item(false, &noVariable, Text{"Green Potion Refill", "Potion verte", "Recarga de poción verde", "Grünes Elixir", }, GREEN_POTION_REFILL, (u32)GetItemID::GI_POTION_GREEN, ITEMTYPE_REFILL); itemTable[BLUE_POTION_REFILL] = Item(true, &RedOrBluePotionAccess, Text{"Blue Potion Refill", "Potion bleue", "Recarga de poción azul", "Blaues Elixir", }, BLUE_POTION_REFILL, (u32)GetItemID::GI_POTION_BLUE, ITEMTYPE_REFILL); //Shop Items (&logicVar = Price?) - itemTable[BUY_ARROWS_10] = Item(false, &noVariable, Text{"Buy Arrows (10)", "Acheter: Flèches (10)", "Comprar flechas (10)", "Kaufe 10 Pfeile", }, BUY_ARROWS_10, (u32)GetItemID::GI_ARROWS_MEDIUM, ITEMTYPE_SHOP); - itemTable[BUY_ARROWS_30] = Item(false, &noVariable, Text{"Buy Arrows (30)", "Acheter: Flèches (30)", "Comprar flechas (30)", "Kaufe 30 Pfeile", }, BUY_ARROWS_30, (u32)GetItemID::GI_ARROWS_LARGE, ITEMTYPE_SHOP); + itemTable[BUY_ARROWS_10] = Item(false, &noVariable, Text{"Buy Arrows (10)", "Acheter: Flèches (10)", "Comprar flechas (10)", "Kaufe 10 Pfeile", }, BUY_ARROWS_10, (u32)GetItemID::GI_ARROWS_SMALL, ITEMTYPE_SHOP); + itemTable[BUY_ARROWS_30] = Item(false, &noVariable, Text{"Buy Arrows (30)", "Acheter: Flèches (30)", "Comprar flechas (30)", "Kaufe 30 Pfeile", }, BUY_ARROWS_30, (u32)GetItemID::GI_ARROWS_MEDIUM, ITEMTYPE_SHOP); itemTable[BUY_DEKU_NUT_10] = Item(false, &noVariable, Text{"Buy Deku Nut (10)", "Acheter: Noix Mojos (10)", "Comprar nueces deku (10)", "Kaufe 10 Deku-Nüsse", "", "Acheter: Noix Mojo (10)", "" }, BUY_DEKU_NUT_10, (u32)GetItemID::GI_NUTS_10, ITEMTYPE_SHOP); itemTable[BUY_DEKU_STICK_1] = Item(false, &noVariable, Text{"Buy Deku Stick (1)", "Acheter: Bâton Mojo (1)", "Comprar palos deku (1)", "Kaufe einen Deku-Stab", }, BUY_DEKU_STICK_1, (u32)GetItemID::GI_STICKS_1, ITEMTYPE_SHOP); itemTable[BUY_BOMBS_10] = Item(false, &noVariable, Text{"Buy Bombs (10)", "Acheter: Bombes (10)", "Comprar Bombas (10)", "Kaufe 10 Bomben", }, BUY_BOMBS_10, (u32)GetItemID::GI_BOMBS_10, ITEMTYPE_SHOP); diff --git a/source/item_location.cpp b/source/item_location.cpp index 8923a88..279629e 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -49,9 +49,9 @@ void LocationTable_Init() { locationTable[E_CLOCK_TOWN_CHEST] = ItemLocation::Chest (0x6C, 0x0A, "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 (0x15, 0x91, "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, "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_DAY_1] = ItemLocation::MiniGame (0x11, 0x01, "ECT Honey and Darling Day 1", E_CLOCK_TOWN_HONEY_DARLING_DAY_1, FISHING_PASS, {Category::cEastClockTown, Category::cMinigame, Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); - locationTable[E_CLOCK_TOWN_HONEY_DARLING_DAY_2] = ItemLocation::MiniGame (0x11, 0x02, "ECT Honey and Darling Day 2", E_CLOCK_TOWN_HONEY_DARLING_DAY_2, FISHING_PASS, {Category::cEastClockTown, Category::cMinigame, Category::cDayTwo, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); - locationTable[E_CLOCK_TOWN_POSTBOX] = ItemLocation::Base (0x6C, 0xBA, "ECT Postbox", E_CLOCK_TOWN_POSTBOX, PIECE_OF_HEART, {Category::cEastClockTown, Category::cVanillaHeartPiece,Category::cDayOne, Category::cNoOcarinaStart, Category::cAlternateCheck}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); + locationTable[E_CLOCK_TOWN_HONEY_DARLING_DAY_1] = ItemLocation::MiniGame (0x11, 0x01, "ECT Honey and Darling Day 1", E_CLOCK_TOWN_HONEY_DARLING_DAY_1, FISHING_PASS, {Category::cEastClockTown, Category::cMinigame, Category::cDayOne, Category::cNoOcarinaStart, Category::cExtraMinigames}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); + locationTable[E_CLOCK_TOWN_HONEY_DARLING_DAY_2] = ItemLocation::MiniGame (0x11, 0x02, "ECT Honey and Darling Day 2", E_CLOCK_TOWN_HONEY_DARLING_DAY_2, FISHING_PASS, {Category::cEastClockTown, Category::cMinigame, Category::cDayTwo, Category::cNoOcarinaStart, Category::cExtraMinigames}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); + locationTable[E_CLOCK_TOWN_POSTBOX] = ItemLocation::Base (0x6C, 0xBA, "ECT Postbox", E_CLOCK_TOWN_POSTBOX, PIECE_OF_HEART, {Category::cEastClockTown, Category::cVanillaHeartPiece,Category::cDayOne, Category::cNoOcarinaStart, Category::cAlternateCheck}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_E_CLOCK_TOWN ); //Goron Village locationTable[GORON_VILLAGE_POWDER_KEG_CHALLENGE] = ItemLocation::Base (0x4D, 0x34, "GV Powder Keg Challenge", GORON_VILLAGE_POWDER_KEG_CHALLENGE, POWDER_KEG, {Category::cGoronVillage, Category::cDayOne, Category::cMainInventory, Category::cNoOcarinaStart}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_GORON_VILLAGE ); @@ -283,7 +283,7 @@ void LocationTable_Init() { locationTable[WOODFALL_TEMPLE_COMPASS_CHEST] = ItemLocation::Chest (0x1B, 0x1C, "WT Compass Chest", WOODFALL_TEMPLE_COMPASS_CHEST, WOODFALL_TEMPLE_COMPASS, {Category::cWoodfall, Category::cWoodfallTemple,Category::cVanillaCompass,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); locationTable[WOODFALL_TEMPLE_BOSS_KEY_CHEST] = ItemLocation::Chest (0x1B, 0x1E, "WT Boss Key Chest", WOODFALL_TEMPLE_BOSS_KEY_CHEST, WOODFALL_TEMPLE_BOSS_KEY, {Category::cWoodfall, Category::cWoodfallTemple,Category::cVanillaBossKey,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); locationTable[WOODFALL_TEMPLE_SMALL_KEY_CHEST] = ItemLocation::Chest (0x1B, 0x01, "WT Small Key Chest", WOODFALL_TEMPLE_SMALL_KEY_CHEST, WOODFALL_TEMPLE_SMALL_KEY, {Category::cWoodfall, Category::cWoodfallTemple,Category::cVanillaSmallKey,Category::cDayOne}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); - locationTable[GIANTS_OATH_TO_ORDER] = ItemLocation::Base (0x69, 0x51, "Oath to Order", GIANTS_OATH_TO_ORDER, OATH_TO_ORDER, {Category::cWoodfall, Category::cWoodfallTemple, Category::cSong,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); + locationTable[GIANTS_OATH_TO_ORDER] = ItemLocation::Base (0x69, 0x51, "Oath to Order", GIANTS_OATH_TO_ORDER, OATH_TO_ORDER, {Category::cWoodfall, Category::cWoodfallTemple, Category::cSong,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); locationTable[WOODFALL_TEMPLE_DEKU_PRINCESS] = ItemLocation::Base (0x1B, 0x5F, "Deku Princess", WOODFALL_TEMPLE_DEKU_PRINCESS, DEKU_PRINCESS, {Category::cWoodfall, Category::cWoodfallTemple, Category::cBottleCatch,Category::cDayOne}, SpoilerCollectionCheck::ItemGetInf(0), SpoilerCollectionCheckGroup::GROUP_DUNGEON_WOODFALL_TEMPLE ); //Snowhead Temple @@ -579,9 +579,9 @@ void LocationTable_Init() { locationTable[W_CLOCK_TOWN_BOMB_BAG_BUY] = ItemLocation::Shop (0x68,0x17, "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, "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, "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, "Potion Shop Item 1", POTION_SHOP_ITEM_1, RED_POTION_REFILL, {Category::cSouthernSwamp,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP); locationTable[POTION_SHOP_ITEM_2] = ItemLocation::Shop (0x0A,0x01, "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, "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, "Potion Shop Item 3", POTION_SHOP_ITEM_3, BLUE_POTION_REFILL, {Category::cSouthernSwamp,Category::cShop,Category::cDayOne, Category::cNoOcarinaStart}, SpoilerCollectionCheckGroup::GROUP_SOUTHERN_SWAMP); locationTable[GORON_SHOP_ITEM_1] = ItemLocation::Shop (0x3D,0x1E, "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, "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/item_pool.cpp b/source/item_pool.cpp index d540424..75123bf 100644 --- a/source/item_pool.cpp +++ b/source/item_pool.cpp @@ -637,11 +637,11 @@ static void PlaceVanillaShopItems() { 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_1, BUY_RED_POTION); PlaceItemInLocation(POTION_SHOP_ITEM_2, BUY_GREEN_POTION); - PlaceItemInLocation(POTION_SHOP_ITEM_3, BUY_RED_POTION); + PlaceItemInLocation(POTION_SHOP_ITEM_3, BUY_BLUE_POTION); PlaceItemInLocation(GORON_SHOP_ITEM_1, BUY_BOMBS_10); - PlaceItemInLocation(GORON_SHOP_ITEM_2, BUY_BOMBCHU_10); + PlaceItemInLocation(GORON_SHOP_ITEM_2, BUY_ARROWS_10); PlaceItemInLocation(GORON_SHOP_ITEM_3, BUY_RED_POTION); PlaceItemInLocation(ZORA_SHOP_ITEM_1, BUY_HEROS_SHIELD); PlaceItemInLocation(ZORA_SHOP_ITEM_2, BUY_ARROWS_10); diff --git a/source/location_access.cpp b/source/location_access.cpp index ec72e03..ef92367 100644 --- a/source/location_access.cpp +++ b/source/location_access.cpp @@ -33,7 +33,7 @@ bool LocationAccess::CanBuy() const { return true; } - //Check if current walet is large enough + //Check if current wallet is large enough bool SufficientWallet = true; if (Location(location)->GetPrice() > 500) { SufficientWallet = Logic::ProgressiveWallet >= 3; @@ -48,8 +48,8 @@ bool LocationAccess::CanBuy() const { bool OtherCondition = true; u32 placed = Location(location)->GetPlacedItemKey(); //Need bottle to buy bottle items - if (placed == BUY_BLUE_POTION || placed == BUY_FAIRYS_SPIRIT || placed == BUY_GREEN_POTION) { - OtherCondition = Logic::HasBottle; + if (placed == BUY_BLUE_POTION || placed == BUY_FAIRYS_SPIRIT || placed == BUY_GREEN_POTION || placed == BUY_RED_POTION || placed == CHATEAU_ROMANI_REFILL) { + OtherCondition = Logic::AnyBottle; } //Need Bombbag to buy bombs/bombchus else if (placed == BUY_BOMBS_10 || placed == BUY_BOMBCHU_10) { @@ -227,7 +227,7 @@ void AreaTable_Init() { areaTable[N_CLOCK_TOWN] = Area("North Clock Town", "North Clock Town", N_CLOCK_TOWN, { //Events - EventAccess(&OldLadySaved, {[]{return Fighting || Bow;}}), + EventAccess(&OldLadySaved, {[]{return Fighting;}}), EventAccess(&WinnerPicture, {[]{return false;}}),//Trick for picture of Tingle instead of Deku King? EventAccess(&PostedKafeiLetter, {[]{return LetterKafei;}}), }, @@ -384,10 +384,10 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(E_CLOCK_TOWN_GORMAN, {[] {return DekuMask && GoronMask && ZoraMask && RomanisMask && Ocarina;}}), + LocationAccess(E_CLOCK_TOWN_GORMAN, {[] {return DekuMask && GoronMask && ZoraMask && RomanisMask;}}), 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;}}), + LocationAccess(E_CLOCK_TOWN_MILK_BAR_MILK, {[] {return AnyBottle;}}), + LocationAccess(E_CLOCK_TOWN_MILK_BAR_CHATEAU, {[] {return AnyBottle;}}), }, { @@ -547,7 +547,7 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(W_CLOCK_TOWN_ALL_NIGHT_MASK_BUY, {[] {return (ProgressiveWallet >= 2);}}), + LocationAccess(W_CLOCK_TOWN_ALL_NIGHT_MASK_BUY, {[] {return (ProgressiveWallet >= 2) && Fighting;}}), LocationAccess(W_CLOCK_TOWN_CURIOSITY_BOMB_BAG, {[] {return AnyWallet;}}), }, { @@ -609,8 +609,8 @@ void AreaTable_Init() { }, { //Exits - Entrance(S_CLOCK_TOWN, {[]{return SongOfTime;}}), - Entrance(THE_MOON_TREE_ROOM, {[]{return CanGoToMoon && SongOfTime;}}), + Entrance(S_CLOCK_TOWN, {[]{return CanPlay(SongOfTime);}}), + Entrance(THE_MOON_TREE_ROOM, {[]{return CanGoToMoon && CanPlay(SongOfTime);}}), }); areaTable[LAUNDRY_POOL] = Area("Laundry Pool", "Laundry Pool", LAUNDRY_POOL, { @@ -806,7 +806,7 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(TERMINA_FIELD_GOSSIP_STONES, {[] {return (GoronMask && (ProgressiveLullaby >= 2)) || + LocationAccess(TERMINA_FIELD_GOSSIP_STONES, {[] {return (GoronMask && CanPlay(ProgressiveLullaby >= 2)) || (DekuMask && CanPlay(SonataOfAwakening)) || (ZoraMask && CanPlay(NewWaveBossaNova));}}), LocationAccess(TF_FOUR_STONE_GROTTO_1, {[] {return true;}}), @@ -1014,7 +1014,7 @@ void AreaTable_Init() { //SOUTHERN_SWAMP_TOP might not be needed but theres two entrances/exits from deku palace that lead to southern swamp //BUT only the top route can reach woodfall Entrance(SOUTHERN_SWAMP_TOP, {[]{return DekuMask;}}), - Entrance(DEKU_PALACE_INTERIOR, {[]{return DekuMask && BeansAndWater;}}), + Entrance(DEKU_PALACE_INTERIOR, {[]{return DekuMask;}}), Entrance(DEKU_PALACE_BEAN_GROTTO, {[]{return DekuMask || WoodfallClear;}}), Entrance(DEKU_SHRINE, {[]{return WoodfallClear;}}), }); @@ -1026,7 +1026,7 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(DEKU_PALACE_IMPRISONED_MONKEY, {[] {return DekuMask && Ocarina;}}), + LocationAccess(DEKU_PALACE_IMPRISONED_MONKEY, {[] {return DekuMask && Ocarina && BeansAndWater;}}), }, { //Exits @@ -1264,7 +1264,7 @@ void AreaTable_Init() { { //Exits Entrance(GORON_VILLAGE_LENS_CAVE, {[]{return true;}}), - Entrance(GORON_VILLAGE_INTERIOR, {[]{return GoronMask || CanUse(FIRE_ARROWS);}}),//Ensure entry is available all days. Explosives do not work here + Entrance(GORON_VILLAGE_INTERIOR, {[]{return GoronMask;}}), //Ensure entry is available all days. Explosives do not work here Entrance(TWIN_ISLANDS, {[]{return true;}}), }); @@ -1286,11 +1286,11 @@ void AreaTable_Init() { areaTable[GORON_VILLAGE_INTERIOR] = Area("Goron Village Interior", "Goron Village Interior", GORON_VILLAGE, { //Events EventAccess(&SpokeToBabyGoron, {[]{return true;}}), - EventAccess(&RockSirloin, {[]{return GoronMask && MagicMeter && (CanUse(FIRE_ARROWS) || ((ProgressiveLullaby >= 1) && HasFireSourceWithTorch));}}), + EventAccess(&RockSirloin, {[]{return GoronMask && MagicMeter && (CanUse(FIRE_ARROWS) || (CanPlay(ProgressiveLullaby >= 1) && HasFireSourceWithTorch));}}), }, { //Locations - LocationAccess(GORON_VILLAGE_GORON_LULLABY, {[]{return GoronMask && (ProgressiveLullaby >= 1);}}), + LocationAccess(GORON_VILLAGE_GORON_LULLABY, {[]{return GoronMask && CanPlay(ProgressiveLullaby >= 1);}}), }, { //Exits @@ -1353,8 +1353,8 @@ void AreaTable_Init() { }, { //Exits - Entrance(SNOWHEAD_TEMPLE_ENTRANCE, {[]{return GoronMask && MagicMeter && (ProgressiveLullaby >= 2);}}), - Entrance(SNOWHEAD_FAIRY_FOUNTAIN, {[]{return GoronMask && MagicMeter && (ProgressiveLullaby >= 2);}}), + Entrance(SNOWHEAD_TEMPLE_ENTRANCE, {[]{return GoronMask && MagicMeter && CanPlay(ProgressiveLullaby >= 2);}}), + Entrance(SNOWHEAD_FAIRY_FOUNTAIN, {[]{return GoronMask && MagicMeter && CanPlay(ProgressiveLullaby >= 2);}}), Entrance(ROAD_TO_SNOWHEAD, {[]{return true;}}), }); @@ -1492,8 +1492,8 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(GBC_FISHERMAN_GAME, {[] {return GreatBayClear && Hookshot;}}), - LocationAccess(GBC_LEDGE, {[] {return Hookshot && BeansAndWater && AnyBottle;}}), + LocationAccess(GBC_FISHERMAN_GAME, {[] {return GreatBayClear && Hookshot && CanPlay(SongOfHealing);}}), + LocationAccess(GBC_LEDGE, {[] {return Hookshot && BeansAndWater;}}), LocationAccess(GBC_MIKAU, {[] {return CanPlay(SongOfHealing);}}), LocationAccess(TINGLE_GBC_GB, {[]{ return CanUseProjectile;}}), LocationAccess(TINGLE_GBC_ST, {[]{ return CanUseProjectile;}}), @@ -1520,7 +1520,7 @@ void AreaTable_Init() { { //Locations LocationAccess(GBC_LAB_FISH, {[] {return Fish;}}), - LocationAccess(GBC_BABY_ZORAS, {[] {return ZoraEggCount(ZoraEgg, 7);}}), //ZoraMask && Hookshot && Seahorse && MagicMeter && GoronMask + LocationAccess(GBC_BABY_ZORAS, {[] {return ZoraEggCount(ZoraEgg, 7) && ZoraMask;}}), //ZoraMask && Hookshot && Seahorse && MagicMeter && GoronMask }, { //Exits @@ -1697,8 +1697,8 @@ void AreaTable_Init() { //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 && MountainTitle;}}), + LocationAccess(ZORA_HALL_SCRUB_PURCHASE, {[] {return AnyBottle && ZoraMask;}}), + LocationAccess(ZORA_HALL_IKANA_SCRUB_PURCHASE, {[] {return AnyBottle && CanTradeOceanDeed && MountainTitle;}}), }, { //Exits @@ -1906,7 +1906,7 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(IKANA_GRAVEYARD_DAMPE_DIGGING, {[] {return true;}}), + LocationAccess(IKANA_GRAVEYARD_DAMPE_DIGGING, {[] {return Bow || ZoraMask || (DekuMask && MagicMeter);}}), }, { //Exits @@ -2270,11 +2270,11 @@ void AreaTable_Init() { //Locations LocationAccess(ODOLWA, {[]{return DekuMask && Bow && Fighting;}}),//Trick for beating without Deku/Bow? LocationAccess(ODOLWA_HEART_CONTAINER, {[]{return DekuMask && Bow && Fighting;}}),//Trick for beating without Deku/Bow? - LocationAccess(GIANTS_OATH_TO_ORDER, {[]{return DekuMask && Bow && Fighting;}}),//Trick for beating without Deku/Bow? }, { //Exits Entrance(WOODFALL_TEMPLE_PRE_BOSS_ROOM, {[]{return false;}}),//One-way door + Entrance(GIANTS_OATH_AREA, {[]{return WoodfallClear;}}), Entrance(WOODFALL_TEMPLE_PRINCESS_ROOM, {[]{return DekuMask && Bow && Fighting;}}),//Trick for beating without Deku/Bow? }); @@ -2463,7 +2463,7 @@ void AreaTable_Init() { }, { //Exits - Entrance(SNOWHEAD_TEMPLE_ICICLE_ROOM, {[]{return true;}}), + Entrance(SNOWHEAD_TEMPLE_ICICLE_ROOM, {[]{return SmallKeys(SnowheadTempleKeys, 2);}}), Entrance(SNOWHEAD_TEMPLE_MAIN_ROOM_2F, {[]{return GoronMask || CanUse(FIRE_ARROWS);}}), }); @@ -2509,7 +2509,7 @@ void AreaTable_Init() { areaTable[SNOWHEAD_TEMPLE_PILLAR_SWITCH_ROOM] = Area("Snowhead Temple Pillar Switch Room", "Snowhead Temple Pillar Switch Room", SNOWHEAD_TEMPLE, { //Events - EventAccess(&SHSwitchPress, {[]{return SHSwitchPress;}}),//Raise Pillar + EventAccess(&SHSwitchPress, {[]{return true;}}),//Raise Pillar }, { //Locations @@ -2610,6 +2610,7 @@ void AreaTable_Init() { { //Exits Entrance(SNOWHEAD_TEMPLE_MAIN_ROOM_4F, {[]{return false;}}), + Entrance(GIANTS_OATH_AREA, {[]{return SnowheadClear;}}), Entrance(SNOWHEAD, {[]{return GoronMask && CanUse(FIRE_ARROWS);}}), }); @@ -2851,6 +2852,7 @@ void AreaTable_Init() { { //Exits Entrance(GREAT_BAY_TEMPLE_PRE_BOSS_ROOM, {[]{return true;}}), + Entrance(GIANTS_OATH_AREA, {[]{return GreatBayClear;}}), Entrance(ZORA_CAPE, {[]{return ZoraMask && MagicMeter && CanUseProjectile;}}), }); @@ -2879,7 +2881,7 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(STONE_TOWER_TEMPLE_UPRIGHT_DEATH_ARMOS_ROOM_CHEST, {[] {return GoronMask && Pictobox && Bow;}}), + LocationAccess(STONE_TOWER_TEMPLE_UPRIGHT_DEATH_ARMOS_ROOM_CHEST, {[] {return false;}}),//Only reachable in inverted }, { //Exits @@ -2893,7 +2895,7 @@ void AreaTable_Init() { }, { //Locations - LocationAccess(STONE_TOWER_TEMPLE_MAP_CHEST, {[] {return true;}}), + LocationAccess(STONE_TOWER_TEMPLE_MAP_CHEST, {[] {return (ArmosRoomLightHole && MirrorShield) || CanUse(LIGHT_ARROWS);}}), LocationAccess(STONE_TOWER_TEMPLE_ARMOS_ROOM_CHEST, {[] {return (ArmosRoomLightHole && MirrorShield) || CanUse(LIGHT_ARROWS);}}), LocationAccess(ST_SF_BASEMENT_LEDGE, {[] {return Hookshot;}}), }, @@ -3175,9 +3177,22 @@ void AreaTable_Init() { }, { //Exits + Entrance(GIANTS_OATH_AREA, {[]{return StoneTowerClear;}}), Entrance(STONE_TOWER_TEMPLE, {[]{return CanUse(LIGHT_ARROWS) && CanUse(GIANTS_MASK);}}), }); + areaTable[GIANTS_OATH_AREA] = Area("Oath to Order", "Oath to Order", GIANTS_OATH_AREA, { + //Events + }, + { + //Locations + LocationAccess(GIANTS_OATH_TO_ORDER, {[] {return true;}}), + }, + { + //Exits + //GIANTS_OATH_AREA should have no exits ever. + }); + areaTable[PIRATE_FORTRESS_EXTERIOR] = Area("Pirates Fortress Exterior", "Pirates Fortress Exterior", PIRATE_FORTRESS, { //Events EventAccess(&PiratePicture, {[]{return Pictobox && StoneMask;}}),//Trick for no Stone Mask? @@ -3192,6 +3207,7 @@ void AreaTable_Init() { //Exits Entrance(ZORA_CAPE, {[]{return ZoraMask;}}), Entrance(PIRATE_FORTRESS_MAZE_ROOM, {[]{return ZoraMask && MagicMeter && GoronMask;}}),//Trick to avoid Skullfish without shield? + Entrance(PIRATE_FORTRESS_INTERIOR, {[]{return Hookshot;}}), }); areaTable[PIRATE_FORTRESS_MAZE_ROOM] = Area("Pirates Fortress Maze Room", "Pirates Fortress Maze Room", PIRATE_FORTRESS, { @@ -3334,7 +3350,7 @@ void AreaTable_Init() { //Exits Entrance(IKANA_CANYON_UPPER, {[]{return true;}}), Entrance(BENEATH_THE_WELL_LEFT_PATH_ROOM, {[]{return GibdosMask && (AnyRedPotion || AnyBluePotion);}}), - Entrance(BENEATH_THE_WELL_RIGHT_PATH_ROOM, {[]{return GibdosMask && MagicBean;}}), + Entrance(BENEATH_THE_WELL_RIGHT_PATH_ROOM, {[]{return GibdosMask && AnyMagicBean;}}), }); areaTable[BENEATH_THE_WELL_LEFT_PATH_ROOM] = Area("Beneath The Well Left Path", "Beneath The Well Left Path", BENEATH_THE_WELL, { @@ -4220,7 +4236,7 @@ void AreaTable_Init() { LocationAccess(OSH_COLORED_SKULLS_CHANDELIER_3, {[] {return Fighting || CanUseProjectile;}}), LocationAccess(OSH_COLORED_SKULLS_BEHIND_PICTURE, {[] {return Hookshot || ZoraMask;}}), LocationAccess(OSH_COLORED_SKULLS_POT, {[] {return Fighting || CanUseProjectile;}}), - LocationAccess(GBC_OCEAN_SPIDER_CHEST, {[] {return CaptainsHat && Bow;}}),//Trick for without Captain's Hat? + LocationAccess(GBC_OCEAN_SPIDER_CHEST, {[] {return CaptainsHat && Bow && (CanUse(FIRE_ARROWS) || HasFireSourceWithTorch);}}),//Trick for without Captain's Hat? }, { //Exits @@ -4257,7 +4273,7 @@ void AreaTable_Init() { } namespace Areas { - static std::array < const AreaKey, 270> allAreas = { + static std::array < const AreaKey, 271> allAreas = { ROOT, ROOT_EXITS, N_CLOCK_TOWN, @@ -4454,6 +4470,7 @@ namespace Areas { STONE_TOWER_TEMPLE_INVERTED_THIN_BRIDGE_ROOM, STONE_TOWER_TEMPLE_PRE_BOSS_ROOM, STONE_TOWER_TEMPLE_BOSS_ROOM, + GIANTS_OATH_AREA, PIRATE_FORTRESS_EXTERIOR, PIRATE_FORTRESS_MAZE_ROOM, PIRATE_FORTRESS_CAGE_ROOM, diff --git a/source/logic.cpp b/source/logic.cpp index c2ebfa1..7dd243d 100644 --- a/source/logic.cpp +++ b/source/logic.cpp @@ -485,6 +485,28 @@ namespace Logic { } void UpdateHelpers() { + //Item Helpers + AnyBSword = KokiriSword || RazorSword || GildedSword || (ProgressiveSword >= 1); + AnySword = GreatFairySword || AnyBSword; + AnyShield = HerosShield || MirrorShield; + 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; + AnyMagicBean = (MagicBean && CanBuyBeans) || LimitlessBeans; + + //Bombs & Bombchus + AnyBombBag = (ProgressiveBombBag >= 1) || BombBag20 || TownBombBag || MountainBombBag; + Explosives = BlastMask || AnyBombBag; + HasExplosives = AnyBombBag || (BlastMask && AnyShield);//Shield required to use Blast Mask without killing the player + HasBombchus = (BuyBombchus5 || BuyBombchus10 || BuyBombchus20) && AnyBombBag; + FoundBombchus = Bombchus; + + //Bow & Arrows + Bow = (ProgressiveBow >= 1) || HerosBow; + //Drop Access DekuStickDrop = StickPot || DekuBabaSticks; DekuNutDrop = NutPot || NutCrate || DekuBabaNuts; @@ -492,14 +514,11 @@ namespace Logic { FishAccess = LoneFish || FishGroup; WaterAccess = (SpringWater && AnyBottle) || CanPlay(SongOfStorms); HotSpringWaterAccess = HotSpringWater && AnyBottle; - BeansAndWater = AnyMagicBean && (SpringWater || SongOfStorms); - AnyMagicBean = (MagicBean || MagicBeanPack || LimitlessBeans); + BeansAndWater = AnyMagicBean && (SpringWater || CanPlay(SongOfStorms)); //refills Bombs = AnyBombBag; Nuts = DekuNutDrop; Sticks = DekuStickDrop || DekuStick; - Bugs = AnyBottle && BugsAccess; - Fish = AnyBottle && FishAccess; //Other Helpers CanBlastOrSmash = HasExplosives || GoronMask; @@ -512,37 +531,15 @@ namespace Logic { DekuStickFighting = Sticks; HasFireSource = CanUse(FIRE_ARROWS); HasFireSourceWithTorch = Sticks; - AnySword = GreatFairySword || AnyBSword; - AnyBSword = KokiriSword || RazorSword || GildedSword || (ProgressiveSword >= 1); NightInnAccess = DekuMask || RoomKey; Fighting = GoronMask || ZoraMask || AnySword /*|| DekuStickFighting || HasExplosives*/;//Trick for bombs, arrows and sticks? - AnyShield = HerosShield|| MirrorShield; CanUseProjectile = Hookshot || HerosBow || (ProgressiveBow >= 1) || (DekuMask && MagicMeter) || ZoraMask; - HasExplosives = AnyBombBag || (BlastMask && AnyShield);//Shield required to use Blast Mask without killing the player - - //Item Helpers - 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; - Explosives = BlastMask || AnyBombBag; - HasBombchus = (BuyBombchus5 || BuyBombchus10 || BuyBombchus20) && AnyBombBag; - FoundBombchus = Bombchus; - - //Bow & Arrows - Bow = (ProgressiveBow >= 1) || HerosBow; //Bottle Items - AnyHealingPotion = AnyRedPotion || AnyBluePotion; AnyRedPotion = AnyBottle; AnyBluePotion = AnyBottle; + AnyHealingPotion = AnyRedPotion || AnyBluePotion; TwoBottles = { (WitchBottle && AlienBottle) || (WitchBottle && BeaverRaceBottle) || (WitchBottle && ArcheryBottle) || (WitchBottle && GoronRaceBottle) || (WitchBottle && ChateauBottle) || (AlienBottle && GoronRaceBottle) || (AlienBottle && BeaverRaceBottle) || (AlienBottle && ArcheryBottle) || (AlienBottle && ChateauBottle) ||