Skip to content

Commit 7a5d6ea

Browse files
committed
more logic
1 parent b617397 commit 7a5d6ea

File tree

16 files changed

+475
-378
lines changed

16 files changed

+475
-378
lines changed

soh/soh/Enhancements/randomizer/ShuffleSilver.cpp

Lines changed: 163 additions & 165 deletions
Large diffs are not rendered by default.

soh/soh/Enhancements/randomizer/hook_handlers.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,8 @@ void RandomizerOnPlayerUpdateForRCQueueHandler() {
341341
getItemEntry.getItemCategory == ITEM_CATEGORY_LESSER ||
342342
// Treat small keys as junk if Skeleton Key is obtained.
343343
(getItemEntry.getItemCategory == ITEM_CATEGORY_SMALL_KEY &&
344+
!(getItemEntry.getItemId >= RG_SHADOW_SILVER_BLADES &&
345+
getItemEntry.getItemId <= RG_SHADOW_SILVER_BLADES) &&
344346
Flags_GetRandomizerInf(RAND_INF_HAS_SKELETON_KEY))))))) {
345347
Item_DropCollectible(gPlayState, &spawnPos, static_cast<int16_t>(ITEM00_SOH_GIVE_ITEM_ENTRY | 0x8000));
346348
}

soh/soh/Enhancements/randomizer/item.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -423,8 +423,10 @@ bool Item::IsMajorItem() const {
423423
return false;
424424
}
425425

426-
if (type == ITEMTYPE_SMALLKEY && (ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_VANILLA) ||
427-
ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_OWN_DUNGEON))) {
426+
if (type == ITEMTYPE_SMALLKEY &&
427+
!(randomizerGet >= RG_SHADOW_SILVER_BLADES && randomizerGet <= RG_SHADOW_SILVER_BLADES) &&
428+
(ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_VANILLA) ||
429+
ctx->GetOption(RSK_KEYSANITY).Is(RO_DUNGEON_ITEM_LOC_OWN_DUNGEON))) {
428430
return false;
429431
}
430432

soh/soh/Enhancements/randomizer/item_list.cpp

Lines changed: 32 additions & 32 deletions
Large diffs are not rendered by default.

soh/soh/Enhancements/randomizer/location_access/dungeons/bottom_of_the_well.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ void RegionTable_Init_BottomOfTheWell() {
7979
LOCATION(RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3, logic->CanBreakPots()),
8080
}, {
8181
//Exits
82-
Entrance(RR_BOTW_PERIMETER, []{return ctx->GetTrickOption(RT_LENS_BOTW) || logic->CanUse(RG_LENS_OF_TRUTH);}),
82+
Entrance(RR_BOTW_PERIMETER, []{return logic->HasItem(RG_BOTW_SILVER) && (ctx->GetTrickOption(RT_LENS_BOTW) || logic->CanUse(RG_LENS_OF_TRUTH));}),
8383
});
8484

8585
areaTable[RR_BOTW_CORNER_CRAWLSPACE] = Region("Bottom of the Well Corner Crawlspace", SCENE_BOTTOM_OF_THE_WELL, {}, {}, {
@@ -185,7 +185,9 @@ void RegionTable_Init_BottomOfTheWell() {
185185
Entrance(RR_BOTW_NEAR_BOSS_UPPER, []{return logic->CanKillEnemy(RE_DEAD_HAND);}),
186186
});
187187

188-
areaTable[RR_BOTW_B3_OOZE] = Region("Bottom of the Well B3 Ooze", SCENE_BOTTOM_OF_THE_WELL, {}, {
188+
areaTable[RR_BOTW_B3_OOZE] = Region("Bottom of the Well B3 Ooze", SCENE_BOTTOM_OF_THE_WELL, {
189+
EventAccess(LOGIC_BOTW_SILVER, []{return true;}),
190+
}, {
189191
//Locations
190192
LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_1, logic->CanBreakPots()),
191193
LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_2, logic->CanBreakPots()),
@@ -203,14 +205,14 @@ void RegionTable_Init_BottomOfTheWell() {
203205
LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1, logic->CanCutShrubs()),
204206
LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2, logic->CanCutShrubs()),
205207
LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3, logic->CanCutShrubs()),
206-
LOCATION(RC_BOTW_SILVER_1, true),
207-
LOCATION(RC_BOTW_SILVER_2, true),
208+
LOCATION(RC_BOTW_SILVER_1, true /*CanClimbHigh()*/),
209+
LOCATION(RC_BOTW_SILVER_2, true /*CanClimb()*/),
208210
LOCATION(RC_BOTW_SILVER_3, true),
209211
LOCATION(RC_BOTW_SILVER_4, true),
210212
LOCATION(RC_BOTW_SILVER_5, true),
211213
}, {
212214
//Exits
213-
Entrance(RR_BOTW_HIDDEN_POTS, []{return true/*CanClimbHigh()*/;}),
215+
Entrance(RR_BOTW_HIDDEN_POTS, []{return logic->HasItem(RG_BOTW_SILVER) /*&& CanClimbHigh()*/;}),
214216
//It's possible to abuse boulder's limited range of collision detection to detonate the flowers through the boulder with bow, but this is a glitch
215217
//the exact range is just past the furthest away plank in the green goo section
216218
Entrance(RR_BOTW_B3_BOMB_FLOWERS, []{return Here(RR_BOTW_B3_OOZE, []{return logic->BlastOrSmash() || logic->CanUse(RG_DINS_FIRE) || (logic->CanUse(RG_STICKS) && ctx->GetTrickOption(RT_BOTW_BASEMENT));});}),

soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -335,11 +335,8 @@ void RegionTable_Init_DodongosCavern() {
335335
LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4, logic->CanBreakPots()),
336336
LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1, logic->CanBreakCrates()),
337337
LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2, logic->CanBreakCrates()),
338-
LOCATION(RC_DODONGOS_CAVERN_MQ_SILVER_1, true),
339-
LOCATION(RC_DODONGOS_CAVERN_MQ_SILVER_2, true),
340-
LOCATION(RC_DODONGOS_CAVERN_MQ_SILVER_3, true),
341-
LOCATION(RC_DODONGOS_CAVERN_MQ_SILVER_4, true),
342-
LOCATION(RC_DODONGOS_CAVERN_MQ_SILVER_5, true),
338+
LOCATION(RC_DODONGOS_CAVERN_MQ_SILVER_1, true),
339+
LOCATION(RC_DODONGOS_CAVERN_MQ_SILVER_2, logic->CanBreakCrates()),
343340
}, {
344341
//Exits
345342
Entrance(RR_DODONGOS_CAVERN_MQ_LOBBY, []{return true;}),
@@ -368,20 +365,25 @@ void RegionTable_Init_DodongosCavern() {
368365
LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2, logic->CanBreakCrates()),
369366
LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3, logic->CanBreakCrates()),
370367
LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4, logic->CanBreakCrates()),
368+
LOCATION(RC_DODONGOS_CAVERN_MQ_SILVER_3, logic->CanBreakCrates()),
369+
LOCATION(RC_DODONGOS_CAVERN_MQ_SILVER_5, logic->CanBreakCrates()),
371370
}, {
372371
//Exits
373372
Entrance(RR_DODONGOS_CAVERN_MQ_STAIRS_LOWER, []{return true;}),
374373
Entrance(RR_DODONGOS_CAVERN_MQ_STAIRS_PAST_BIG_SKULLTULAS, []{return logic->CanPassEnemy(RE_BIG_SKULLTULA) || logic->CanUse(RG_HOVER_BOOTS);}),
375374
});
376375

377-
areaTable[RR_DODONGOS_CAVERN_MQ_STAIRS_PAST_BIG_SKULLTULAS] = Region("Dodongos Cavern MQ Past Big Skulltulas", SCENE_DODONGOS_CAVERN, {}, {}, {
376+
areaTable[RR_DODONGOS_CAVERN_MQ_STAIRS_PAST_BIG_SKULLTULAS] = Region("Dodongos Cavern MQ Past Big Skulltulas", SCENE_DODONGOS_CAVERN, {
377+
//Events
378+
EventAccess(LOGIC_DODONGOS_CAVERN_MQ_SILVER, []{return logic->CanPassEnemy(RE_BIG_SKULLTULA) || logic->CanUse(RG_HOVER_BOOTS) /*&& CanClimb()*/;}),
379+
}, {
380+
//Locations
381+
LOCATION(RC_DODONGOS_CAVERN_MQ_SILVER_4, true /*CanClimb()*/),
382+
}, {
378383
//Exits
379384
Entrance(RR_DODONGOS_CAVERN_MQ_STAIRS_UPPER, []{return logic->CanPassEnemy(RE_BIG_SKULLTULA) || logic->CanUse(RG_HOVER_BOOTS);}),
380385
Entrance(RR_DODONGOS_CAVERN_MQ_STAIRS_LOWER, []{return logic->TakeDamage();}),
381-
//If some case comes up where you can directly (void?)warp here without going through Dodongo room or climbing up from below,
382-
//the commented out logic is to handle going down and reclimbing to get silver rupees. A new eventVar will need decalring to handle this.
383-
/*(logic->CanPassEnemy(RE_BIG_SKULLTULA) || CanUse(RG_HOVER_BOOTS)) && logic->Get(LOGIC_DC_CAN_CLIMB_STAIRS);*/
384-
Entrance(RR_DODONGOS_CAVERN_MQ_DODONGO_ROOM, []{return true;}),//if we add BONKO or other crate logic, logic for silver rupees goes here
386+
Entrance(RR_DODONGOS_CAVERN_MQ_DODONGO_ROOM, []{return logic->HasItem(RG_DODONGOS_CAVERN_MQ_SILVER);}),
385387
});
386388

387389
areaTable[RR_DODONGOS_CAVERN_MQ_DODONGO_ROOM] = Region("Dodongos Cavern MQ Dodongo Room", SCENE_DODONGOS_CAVERN, {}, {

soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ void RegionTable_Init_GanonsCastle() {
5555
areaTable[RR_GANONS_CASTLE_FOREST_TRIAL] = Region("Ganon's Castle Forest Trial", SCENE_INSIDE_GANONS_CASTLE, {
5656
//Events
5757
EventAccess(LOGIC_FOREST_TRIAL_CLEAR, []{return logic->CanUse(RG_LIGHT_ARROWS) && (logic->CanUse(RG_FIRE_ARROWS) || logic->CanUse(RG_DINS_FIRE));}),
58+
EventAccess(LOGIC_GANONS_CASTLE_SILVER_FOREST, []{return true;}),
5859
}, {
5960
//Locations
6061
LOCATION(RC_GANONS_CASTLE_FOREST_TRIAL_CHEST, logic->CanKillEnemy(RE_WOLFOS)),
@@ -70,6 +71,7 @@ void RegionTable_Init_GanonsCastle() {
7071
areaTable[RR_GANONS_CASTLE_FIRE_TRIAL] = Region("Ganon's Castle Fire Trial", SCENE_INSIDE_GANONS_CASTLE, {
7172
//Events
7273
EventAccess(LOGIC_FIRE_TRIAL_CLEAR, []{return logic->CanUse(RG_GORON_TUNIC) && logic->CanUse(RG_GOLDEN_GAUNTLETS) && logic->CanUse(RG_LIGHT_ARROWS) && logic->CanUse(RG_LONGSHOT);}),
74+
EventAccess(LOGIC_GANONS_CASTLE_SILVER_FIRE, []{return true;}),
7375
}, {
7476
//Locations
7577
LOCATION(RC_GANONS_CASTLE_FIRE_TRIAL_POT_1, logic->CanBreakPots() && logic->CanUse(RG_GORON_TUNIC) && logic->CanUse(RG_GOLDEN_GAUNTLETS) && logic->CanUse(RG_LONGSHOT)),
@@ -116,6 +118,7 @@ void RegionTable_Init_GanonsCastle() {
116118
//Events
117119
EventAccess(LOGIC_NUT_POT, []{return ((ctx->GetTrickOption(RT_GANON_SPIRIT_TRIAL_HOOKSHOT) && logic->CanJumpslashExceptHammer()) || logic->CanUse(RG_HOOKSHOT)) && (logic->CanUse(RG_BOMBCHU_5) || (ctx->GetTrickOption(RT_HOOKSHOT_EXTENSION) && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT)))) && logic->CanUse(RG_FAIRY_BOW) && (logic->CanUse(RG_MIRROR_SHIELD) || (ctx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS)));}),
118120
EventAccess(LOGIC_SPIRIT_TRIAL_CLEAR, []{return logic->CanUse(RG_LIGHT_ARROWS) && (logic->CanUse(RG_MIRROR_SHIELD) || ctx->GetOption(RSK_SUNLIGHT_ARROWS)) && (logic->CanUse(RG_BOMBCHU_5) || (ctx->GetTrickOption(RT_HOOKSHOT_EXTENSION) && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT)))) && ((ctx->GetTrickOption(RT_GANON_SPIRIT_TRIAL_HOOKSHOT) && logic->CanJumpslashExceptHammer()) || logic->CanUse(RG_HOOKSHOT));}),
121+
EventAccess(LOGIC_GANONS_CASTLE_SILVER_SPIRIT, []{return true;}),
119122
}, {
120123
//Locations
121124
LOCATION(RC_GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST, (ctx->GetTrickOption(RT_GANON_SPIRIT_TRIAL_HOOKSHOT) || logic->CanUse(RG_HOOKSHOT)) && (logic->CanJumpslashExceptHammer() || (logic->CanUse(RG_BOMBCHU_5) || (ctx->GetTrickOption(RT_HOOKSHOT_EXTENSION) && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT)))))),
@@ -134,6 +137,7 @@ void RegionTable_Init_GanonsCastle() {
134137
areaTable[RR_GANONS_CASTLE_LIGHT_TRIAL] = Region("Ganon's Castle Light Trial", SCENE_INSIDE_GANONS_CASTLE, {
135138
//Events
136139
EventAccess(LOGIC_LIGHT_TRIAL_CLEAR, []{return logic->CanUse(RG_LIGHT_ARROWS) && (logic->CanUse(RG_HOOKSHOT) || (logic->IsAdult && logic->CanGroundJump())) && logic->SmallKeys(SCENE_INSIDE_GANONS_CASTLE, 2) && (ctx->GetTrickOption(RT_LENS_GANON) || logic->CanUse(RG_LENS_OF_TRUTH));}),
140+
EventAccess(LOGIC_GANONS_CASTLE_SILVER_LIGHT, []{return true;}),
137141
}, {
138142
//Locations
139143
LOCATION(RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST, true),
@@ -236,7 +240,10 @@ void RegionTable_Init_GanonsCastle() {
236240
Entrance(RR_GANONS_CASTLE_MQ_FOREST_TRIAL_BEAMOS_ROOM, []{return true;}),
237241
});
238242

239-
areaTable[RR_GANONS_CASTLE_MQ_FIRE_TRIAL_MAIN_ROOM] = Region("Ganon's Castle MQ Fire Trial Main Room", SCENE_INSIDE_GANONS_CASTLE, {}, {
243+
areaTable[RR_GANONS_CASTLE_MQ_FIRE_TRIAL_MAIN_ROOM] = Region("Ganon's Castle MQ Fire Trial Main Room", SCENE_INSIDE_GANONS_CASTLE, {
244+
//Events
245+
EventAccess(LOGIC_GANONS_CASTLE_MQ_SILVER_FIRE, []{return logic->CanUse(RG_GORON_TUNIC) && logic->CanUse(RG_GOLDEN_GAUNTLETS);}),
246+
}, {
240247
//Locations
241248
LOCATION(RC_GANONS_CASTLE_MQ_SILVER_FIRE_1, true),
242249
LOCATION(RC_GANONS_CASTLE_MQ_SILVER_FIRE_2, true),
@@ -246,8 +253,7 @@ void RegionTable_Init_GanonsCastle() {
246253
}, {
247254
//Exits
248255
Entrance(RR_GANONS_CASTLE_MQ_MAIN, []{return true;}),
249-
//2 checks, 1 for the rupees, 1 for actually making it, as the rupees are permanent but throwing a pillar is not
250-
Entrance(RR_GANONS_CASTLE_MQ_FIRE_TRIAL_FINAL_ROOM, []{return Here(RR_GANONS_CASTLE_MQ_FIRE_TRIAL_MAIN_ROOM, []{return logic->CanUse(RG_GORON_TUNIC) && logic->CanUse(RG_GOLDEN_GAUNTLETS);}) && logic->CanUse(RG_GORON_TUNIC) && (logic->CanUse(RG_LONGSHOT) || (logic->CanUse(RG_GOLDEN_GAUNTLETS) && (logic->CanUse(RG_HOVER_BOOTS) || (ctx->GetTrickOption(RT_GANON_MQ_FIRE_TRIAL) && logic->IsAdult && logic->CanUse(RG_HOOKSHOT)))));}),
256+
Entrance(RR_GANONS_CASTLE_MQ_FIRE_TRIAL_FINAL_ROOM, []{return logic->HasItem(RG_GANONS_CASTLE_MQ_SILVER_FIRE) && logic->CanUse(RG_GORON_TUNIC) && (logic->CanUse(RG_LONGSHOT) || (logic->CanUse(RG_GOLDEN_GAUNTLETS) && (logic->CanUse(RG_HOVER_BOOTS) || (ctx->GetTrickOption(RT_GANON_MQ_FIRE_TRIAL) && logic->IsAdult && logic->CanUse(RG_HOOKSHOT)))));}),
251257
});
252258

253259
areaTable[RR_GANONS_CASTLE_MQ_FIRE_TRIAL_FINAL_ROOM] = Region("Ganon's Castle MQ Fire Trial Final Room", SCENE_INSIDE_GANONS_CASTLE, {
@@ -273,7 +279,11 @@ void RegionTable_Init_GanonsCastle() {
273279
Entrance(RR_GANONS_CASTLE_MQ_WATER_TRIAL_BLOCK_ROOM, []{return logic->SmallKeys(SCENE_INSIDE_GANONS_CASTLE, 3) && Here(RR_GANONS_CASTLE_MQ_WATER_TRIAL_GEYSER_ROOM, []{return logic->BlueFire();});}),
274280
});
275281

276-
areaTable[RR_GANONS_CASTLE_MQ_WATER_TRIAL_BLOCK_ROOM] = Region("Ganon's Castle MQ Water Trial Block Room", SCENE_INSIDE_GANONS_CASTLE, {}, {
282+
areaTable[RR_GANONS_CASTLE_MQ_WATER_TRIAL_BLOCK_ROOM] = Region("Ganon's Castle MQ Water Trial Block Room", SCENE_INSIDE_GANONS_CASTLE, {
283+
//Events
284+
//This assumes there's no way for child to have blue fire and not adult.
285+
EventAccess(LOGIC_GANONS_CASTLE_MQ_SILVER_WATER, []{return logic->IsAdult && logic->BlueFire();}),
286+
}, {
277287
//Locations
278288
LOCATION(RC_GANONS_CASTLE_MQ_SILVER_WATER_1, true),
279289
LOCATION(RC_GANONS_CASTLE_MQ_SILVER_WATER_2, true),
@@ -283,8 +293,7 @@ void RegionTable_Init_GanonsCastle() {
283293
}, {
284294
//Exits
285295
Entrance(RR_GANONS_CASTLE_MQ_WATER_TRIAL_GEYSER_ROOM, []{return logic->SmallKeys(SCENE_INSIDE_GANONS_CASTLE, 3);}),
286-
//This assumes there's no way for child to have blue fire and not adult.
287-
Entrance(RR_GANONS_CASTLE_MQ_WATER_TRIAL_FINAL_ROOM, []{return logic->IsAdult && logic->BlueFire();}),
296+
Entrance(RR_GANONS_CASTLE_MQ_WATER_TRIAL_FINAL_ROOM, []{return logic->IsAdult && logic->BlueFire() && logic->HasItem(RG_GANONS_CASTLE_MQ_SILVER_WATER);}),
288297
});
289298

290299
areaTable[RR_GANONS_CASTLE_MQ_WATER_TRIAL_FINAL_ROOM] = Region("Ganon's Castle MQ Water Trial Final Room", SCENE_INSIDE_GANONS_CASTLE, {
@@ -341,7 +350,15 @@ void RegionTable_Init_GanonsCastle() {
341350
Entrance(RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_FAR_SIDE, []{return logic->HasFireSource() || logic->CanUse(RG_HOVER_BOOTS) || (logic->IsAdult && ctx->GetTrickOption(RT_GANON_MQ_SHADOW_TRIAL) && logic->CanUse(RG_FAIRY_BOW));}),
342351
});
343352

344-
areaTable[RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_FAR_SIDE] = Region("Ganon's Castle MQ Shadow Trial Far Side", SCENE_INSIDE_GANONS_CASTLE, {}, {
353+
areaTable[RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_FAR_SIDE] = Region("Ganon's Castle MQ Shadow Trial Far Side", SCENE_INSIDE_GANONS_CASTLE, {
354+
//Events
355+
//Modelling the silver rupees properly will require a way to check temp flags in different regions.
356+
//It may be tempting to use a Here-like command for this but it could cause sphere skipping in playthroughs
357+
//So a system like event access which sets based on TimeAge would be preferable, as the application of these can be tracked and accounted for, unlike Here-like commands
358+
//For now I am assuming the player has made it all the way from RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_STARTING_LEDGE, which logically means every rupee is available
359+
//with no extra requirements except the lens logic needed to reach the door, which also enables the beamos-platform rupee
360+
EventAccess(LOGIC_GANONS_CASTLE_MQ_SILVER_SHADOW, []{return true;}),
361+
}, {
345362
//Locations
346363
LOCATION(RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST, logic->CanHitEyeTargets()),
347364
// TODO move these to their proper region
@@ -353,12 +370,7 @@ void RegionTable_Init_GanonsCastle() {
353370
}, {
354371
//Exits
355372
Entrance(RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_BEAMOS_TORCH, []{return logic->CanUse(RG_FIRE_ARROWS) || logic->CanUse(RG_HOVER_BOOTS);}),
356-
//Modelling the silver rupees properly will require a way to check temp flags in different regions.
357-
//It may be tempting to use a Here-like command for this but it could cause sphere skipping in playthroughs
358-
//So a system like event access which sets based on TimeAge would be preferable, as the application of these can be tracked and accounted for, unlike Here-like commands
359-
//For Now I am assuming the player has made it all the way from RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_STARTING_LEDGE, which logically means every rupee is available
360-
//with no extra requirements except the lens logic needed to reach the door, which also enables the beamos-platform rupee
361-
Entrance(RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_FINAL_ROOM, []{return (ctx->GetTrickOption(RT_LENS_GANON_MQ) || logic->CanUse(RG_LENS_OF_TRUTH));}),
373+
Entrance(RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_FINAL_ROOM, []{return logic->HasItem(RG_GANONS_CASTLE_MQ_SILVER_SHADOW) && (ctx->GetTrickOption(RT_LENS_GANON_MQ) || logic->CanUse(RG_LENS_OF_TRUTH));}),
362374
});
363375

364376
areaTable[RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_FINAL_ROOM] = Region("Ganon's Castle MQ Shadow Trial Final Room", SCENE_INSIDE_GANONS_CASTLE, {

0 commit comments

Comments
 (0)