@@ -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