mirror of
https://github.com/HarbourMasters/Shipwright.git
synced 2025-08-20 21:33:40 -07:00
clear forwards vanilla testing
This commit is contained in:
parent
8f992d6dd3
commit
458722d15d
7 changed files with 54 additions and 48 deletions
|
@ -600,30 +600,24 @@ bool Here(const RandomizerRegion region, ConditionFn condition) {
|
|||
* the second condition is the same for adult 1F lock, and the third is the access from the boss door.
|
||||
*/
|
||||
|
||||
bool SpiritExplosiveKeyLogic() {
|
||||
return logic->SmallKeys(RR_SPIRIT_TEMPLE, logic->SpiritBrokenWallToStatue() ? 1
|
||||
: ctx->GetOption(RSK_BOMBCHU_BAG) && logic->BombchuRefill() ? 2
|
||||
: 3);
|
||||
}
|
||||
|
||||
// clang-format off
|
||||
std::map<RandomizerRegion, SpiritLogicData> Region::spiritLogicData = {
|
||||
//Vanilla
|
||||
{RR_SPIRIT_TEMPLE_WEST_CLIMB_BASE, {5, 5, 5, []{return true;}, []{return SpiritExplosiveKeyLogic()/* && logic->CanClimbHigh() && str0*/;}, []{return true/*logic->CanClimb() || logic->CanUse(RG_HOVER_BOOTS)*/;}}},
|
||||
{RR_SPIRIT_TEMPLE_BROKEN_WALL, {5, 5, 5, []{return true /*logic->CanClimbHigh()*/;}, []{return SpiritExplosiveKeyLogic()/* && logic->CanClimbHigh() && str0*/;}, []{return true/*logic->CanClimb() || logic->CanUse(RG_HOVER_BOOTS)*/;}}},
|
||||
{RR_SPIRIT_TEMPLE_2F_MIRROR, {5, 5, 3, []{return logic->CanUse(RG_HOOKSHOT) && logic->SpiritBrokenWallToStatue();}, []{return true/*logic->CanClimbHigh()*/;}, []{return logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS);}}},
|
||||
{RR_SPIRIT_TEMPLE_STATUE_ROOM_WEST, {5, 5, 3, []{return SpiritExplosiveKeyLogic()/* && logic->CanClimbHigh()*/;}, []{return true/*logic->CanClimbHigh() && str0*/;}, []{return true/*logic->CanClimb() || logic->CanUse(RG_HOVER_BOOTS)*/;}}},
|
||||
{RR_SPIRIT_TEMPLE_INNER_WEST_HAND, {5, 5, 3, []{return SpiritExplosiveKeyLogic()/* && logic->CanClimbHigh()*/;}, []{return true/*logic->CanClimbHigh() && str0*/;}, []{return true/*logic->CanClimb() || logic->CanUse(RG_HOVER_BOOTS)*/;}}},
|
||||
{RR_SPIRIT_TEMPLE_GS_LEDGE, {5, 5, 3, []{return SpiritExplosiveKeyLogic() && logic->SpiritWestToSkull()/* && logic->CanClimbHigh()*/;}, []{return logic->SpiritWestToSkull()/* && logic->CanClimbHigh() && str0*/;}, []{return logic->SpiritWestToSkull()/* && (logic->CanClimb() || logic->CanUse(RG_HOVER_BOOTS))*/;}}},
|
||||
{RR_SPIRIT_TEMPLE_STATUE_ROOM, {5, 5, 3, []{return SpiritExplosiveKeyLogic();}, []{return true/*logic->CanClimbHigh() && str0*/;}, []{return true;}}},
|
||||
{RR_SPIRIT_TEMPLE_WEST_CLIMB_BASE, {5, 5, 9, []{return true;}, []{return true/* && logic->CanClimbHigh() && str0*/;}, []{return true/*logic->CanClimb() || logic->CanUse(RG_HOVER_BOOTS)*/;}}},
|
||||
{RR_SPIRIT_TEMPLE_BROKEN_WALL, {5, 5, 9, []{return true /*logic->CanClimbHigh()*/;}, []{return true/* && logic->CanClimbHigh() && str0*/;}, []{return true/*logic->CanClimb() || logic->CanUse(RG_HOVER_BOOTS)*/;}}},
|
||||
{RR_SPIRIT_TEMPLE_2F_MIRROR, {5, 5, 9, []{return logic->CanUse(RG_HOOKSHOT) && logic->SpiritBrokenWallToStatue();}, []{return true/*logic->CanClimbHigh()*/;}, []{return logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS);}}},
|
||||
{RR_SPIRIT_TEMPLE_STATUE_ROOM_WEST, {5, 5, 9, []{return true/*logic->CanClimbHigh()*/;}, []{return true/*logic->CanClimbHigh() && str0*/;}, []{return true/*logic->CanClimb() || logic->CanUse(RG_HOVER_BOOTS)*/;}}},
|
||||
{RR_SPIRIT_TEMPLE_INNER_WEST_HAND, {5, 5, 9, []{return true/*logic->CanClimbHigh()*/;}, []{return true/*logic->CanClimbHigh() && str0*/;}, []{return true/*logic->CanClimb() || logic->CanUse(RG_HOVER_BOOTS)*/;}}},
|
||||
{RR_SPIRIT_TEMPLE_GS_LEDGE, {5, 5, 9, []{return true && logic->SpiritWestToSkull()/* && logic->CanClimbHigh()*/;}, []{return logic->SpiritWestToSkull()/* && logic->CanClimbHigh() && str0*/;}, []{return logic->SpiritWestToSkull()/* && (logic->CanClimb() || logic->CanUse(RG_HOVER_BOOTS))*/;}}},
|
||||
{RR_SPIRIT_TEMPLE_STATUE_ROOM, {5, 5, 9, []{return true;}, []{return true/*logic->CanClimbHigh() && str0*/;}, []{return true;}}},
|
||||
//Assumes SpiritSunBlockSouthLedge() for all access
|
||||
{RR_SPIRIT_TEMPLE_SUN_BLOCK_SOUTH_LEDGE, {5, 5, 3, []{return SpiritExplosiveKeyLogic()/* && logic->CanClimbHigh() && str0*/;}, []{return true/*logic->CanClimbHigh() && str0*/;}, []{return true/*((logic->CanClimb() || logic->CanUse(RG_HOVER_BOOTS)) && str0) || (logic->CanKillEnemy(RE_BEAMOS) && logic->CanUse(RG_LONGSHOT))*/;}}},
|
||||
{RR_SPIRIT_TEMPLE_SKULLTULA_STAIRS, {5, 5, 3, []{return SpiritExplosiveKeyLogic()/* && logic->CanClimbHigh() && str0*/;}, []{return true/*logic->CanClimbHigh() && str0*/;}, []{return true/*((logic->CanClimb() || logic->CanUse(RG_HOVER_BOOTS)) && str0) || (logic->CanKillEnemy(RE_BEAMOS) && logic->CanUse(RG_LONGSHOT))*/;}}},
|
||||
{RR_SPIRIT_TEMPLE_OUTER_WEST_HAND, {5, 5, 3, []{return SpiritExplosiveKeyLogic() && logic->CanKillEnemy(RE_IRON_KNUCKLE) //For the purpose of shared, adult needs to get to west side via BOTH possible routes for it to count //Only using HasItem here is intended so this check can pass as child if adult can do their part. This works because this edge case assumes that you can only waste keys on adult side with adult
|
||||
/*&& logic->CanClimbHigh() && str0*/;}, []{return logic->CanKillEnemy(RE_BEAMOS) && logic->CanUse(RG_LONGSHOT)/* && logic->CanClimbHigh() && str0*/;}, []{return logic->CanKillEnemy(RE_BEAMOS) && logic->HasItem(RG_LONGSHOT)/* && logic->CanClimb() && str0*/;}}},
|
||||
{RR_SPIRIT_TEMPLE_STATUE_ROOM_EAST, {5, 5, 3, []{return logic->CanUse(RG_HOOKSHOT) && SpiritExplosiveKeyLogic()/* && logic->CanClimbHigh()*/;}, []{return true/*logic->CanClimbHigh() && str0*/;}, []{return logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS);}}},
|
||||
{RR_SPIRIT_TEMPLE_INNER_EAST_HAND, {5, 5, 3, []{return logic->CanUse(RG_HOOKSHOT) && SpiritExplosiveKeyLogic()/* && logic->CanClimbHigh()*/;}, []{return true/*logic->CanClimbHigh() && str0*/;}, []{return logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS);}}},
|
||||
{RR_SPIRIT_TEMPLE_SHORTCUT_SWITCH, {5, 5, 3, []{return logic->CanUse(RG_HOOKSHOT) && SpiritExplosiveKeyLogic() && logic->SpiritEastToSwitch();}, []{return logic->SpiritEastToSwitch()/* && logic->CanClimbHigh() && str0*/;}, []{return logic->SpiritEastToSwitch() && (logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS));}}},
|
||||
{RR_SPIRIT_TEMPLE_SUN_BLOCK_SOUTH_LEDGE, {5, 5, 9, []{return true/*logic->CanClimbHigh() && str0*/;}, []{return true/*logic->CanClimbHigh() && str0*/;}, []{return true/*((logic->CanClimb() || logic->CanUse(RG_HOVER_BOOTS)) && str0) || (logic->CanKillEnemy(RE_BEAMOS) && logic->CanUse(RG_LONGSHOT))*/;}}},
|
||||
{RR_SPIRIT_TEMPLE_SKULLTULA_STAIRS, {5, 5, 9, []{return true/*logic->CanClimbHigh() && str0*/;}, []{return true/*logic->CanClimbHigh() && str0*/;}, []{return true/*((logic->CanClimb() || logic->CanUse(RG_HOVER_BOOTS)) && str0) || (logic->CanKillEnemy(RE_BEAMOS) && logic->CanUse(RG_LONGSHOT))*/;}}},
|
||||
{RR_SPIRIT_TEMPLE_OUTER_WEST_HAND, {5, 5, 3, []{return logic->CanKillEnemy(RE_IRON_KNUCKLE)/*&& logic->CanClimbHigh() && str0*/;}, //For the purpose of shared, adult needs to get to west side via BOTH possible routes for it to count //Only using HasItem here is intended so this check can pass as child if adult can do their part. This works because this edge case assumes that you can only waste keys on adult side with adult
|
||||
[]{return logic->CanKillEnemy(RE_BEAMOS) && logic->CanUse(RG_LONGSHOT)/* && logic->CanClimbHigh() && str0*/;}, []{return logic->CanKillEnemy(RE_BEAMOS) && logic->HasItem(RG_LONGSHOT)/* && logic->CanClimb() && str0*/;}}},
|
||||
{RR_SPIRIT_TEMPLE_STATUE_ROOM_EAST, {5, 5, 9, []{return logic->CanUse(RG_HOOKSHOT)/* && logic->CanClimbHigh()*/;}, []{return true/*logic->CanClimbHigh() && str0*/;}, []{return logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS);}}},
|
||||
{RR_SPIRIT_TEMPLE_INNER_EAST_HAND, {5, 5, 9, []{return logic->CanUse(RG_HOOKSHOT)/* && logic->CanClimbHigh()*/;}, []{return true/*logic->CanClimbHigh() && str0*/;}, []{return logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS);}}},
|
||||
{RR_SPIRIT_TEMPLE_SHORTCUT_SWITCH, {5, 5, 9, []{return logic->CanUse(RG_HOOKSHOT) && logic->SpiritEastToSwitch();}, []{return logic->SpiritEastToSwitch()/* && logic->CanClimbHigh() && str0*/;}, []{return logic->SpiritEastToSwitch() && (logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS));}}},
|
||||
//MQ /*&& logic->CanClimbHigh()*/
|
||||
{RR_SPIRIT_TEMPLE_MQ_UNDER_LIKE_LIKE, {7, 6, 7, []{return true;}, []{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 6) && logic->CanHitSwitch()/* && logic->Climb*/;}, []{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 6) && logic->CanHitSwitch()/* && (logic->CanClimb() || logic->CanUse(RG_HOVER_BOOTS))*/;}}},
|
||||
{RR_SPIRIT_TEMPLE_MQ_BROKEN_WALL_ROOM, {7, 6, 7, []{return logic->CanHitSwitch()/* && logic->CanClimbHigh()*/;}, []{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 6)/* && logic->Climb*/;}, []{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 6)/* && (logic->CanClimb() || logic->CanUse(RG_HOVER_BOOTS))*/;}}},
|
||||
|
@ -643,7 +637,7 @@ std::map<RandomizerRegion, SpiritLogicData> Region::spiritLogicData = {
|
|||
bool SpiritCertainAccess(RandomizerRegion region) {
|
||||
SpiritLogicData& curRegionData = Region::spiritLogicData[region];
|
||||
uint8_t keys = curRegionData.adultKeys;
|
||||
bool reverseAccess = logic->ReverseSpiritAdult;
|
||||
bool canReach = false;
|
||||
if (logic->IsChild) {
|
||||
// If child enters in reverse, then they have access to Certain Access to Broken Wall room in 6 keys,
|
||||
// the ability to hit switches and the ability to climb because only child can reach the initial child lock
|
||||
|
@ -651,18 +645,25 @@ bool SpiritCertainAccess(RandomizerRegion region) {
|
|||
keys = (logic->ReverseSpiritChild && logic->CanHitSwitch() /* && CanClimbHigh()*/)
|
||||
? curRegionData.childReverseKeys
|
||||
: curRegionData.childKeys;
|
||||
reverseAccess = logic->ReverseSpiritChild;
|
||||
canReach = (areaTable[region].Child() || curRegionData.childAccess()) && (!logic->IsReverseAccessPossible() || curRegionData.reverseAccess());
|
||||
} else {
|
||||
canReach = (areaTable[region].Adult() || curRegionData.adultAccess()) && (!logic->IsReverseAccessPossible() || curRegionData.reverseAccess());
|
||||
}
|
||||
//keys set to 9 means it's the bombchu edge case.
|
||||
if (keys == 9){
|
||||
keys = ctx->GetOption(RSK_BOMBCHU_BAG) && logic->BombchuRefill() ? 2 : 3;
|
||||
}
|
||||
|
||||
// If we have enough keys that an age cannot be kept out, we have Certain Access
|
||||
// otherwise if we have entered in reverse and can reach from the face, we have Certain Access
|
||||
return logic->SmallKeys(RR_SPIRIT_TEMPLE, keys) || (reverseAccess && curRegionData.reverseAccess());
|
||||
return canReach && logic->SmallKeys(RR_SPIRIT_TEMPLE, keys);
|
||||
}
|
||||
|
||||
/*
|
||||
* Spirit Shared can take up to 3 regions, this is because checks can exist in many regions at the same time
|
||||
Spirit Shared can take up to 3 regions, this is because checks can exist in many regions at the same time
|
||||
and the logic needs to be able to check the access logic from those regions to check the other universes properly.
|
||||
|
||||
*anyAge is equivalent to a self referencing Here, used for events and any check where that is relevent.
|
||||
anyAge is equivalent to a self referencing Here, used for events and any check where that is relevent.
|
||||
*/
|
||||
|
||||
bool SpiritShared(RandomizerRegion region, ConditionFn condition, bool anyAge, RandomizerRegion otherRegion,
|
||||
|
@ -684,7 +685,7 @@ bool SpiritShared(RandomizerRegion region, ConditionFn condition, bool anyAge, R
|
|||
logic->IsAdult = true;
|
||||
|
||||
bool AdultCertainAccess = SpiritCertainAccess(region);
|
||||
// If we are AnyAge and have any CeratinAccess, then we can check those ages
|
||||
// If we are AnyAge and have any CertainAccess, then we can check those ages
|
||||
// we don't need to check ambiguity here as if this fails, then 1 of the ages has failed
|
||||
if (anyAge && (ChildCertainAccess || AdultCertainAccess)) {
|
||||
// set age access to the Certain Access
|
||||
|
|
|
@ -121,7 +121,9 @@ struct SpiritLogicData {
|
|||
// This changes for MQ broken wall room as the first child lock can only be opened by Child
|
||||
// guaranteeing access with 6 keys
|
||||
uint8_t childReverseKeys;
|
||||
uint8_t adultKeys; // the number of keys that guarantees Adult can reach this region
|
||||
// the number of keys that guarantees Adult can reach this region
|
||||
// if it is 9, that means the bombchu edge case is to be checked.
|
||||
uint8_t adultKeys;
|
||||
// The area access condition to reach this region as Child, from the first lock,
|
||||
// including the minimum number of keys for ambiguous access
|
||||
// 1 key is always assumed to be required
|
||||
|
|
|
@ -34,8 +34,9 @@ void RegionTable_Init_SpiritTemple() {
|
|||
//Exits
|
||||
Entrance(RR_SPIRIT_TEMPLE_LOBBY, []{return logic->IsChild/*CanUse(RG_CRAWL)*/;}),
|
||||
Entrance(RR_SPIRIT_TEMPLE_1F_BOXES, []{return logic->IsChild/*CanUse(RG_CRAWL)*/;}),
|
||||
Entrance(RR_SPIRIT_TEMPLE_SWITCH_BRIDGE_SOUTH, []{return Here(RR_SPIRIT_TEMPLE_1F_WEST, []{return logic->CanKillEnemy(RE_ARMOS) && logic->CanKillEnemy(RE_KEESE);});}),
|
||||
Entrance(RR_SPIRIT_TEMPLE_RUPEE_BRIDGE_SOUTH, []{return Here(RR_SPIRIT_TEMPLE_1F_WEST, []{return logic->CanKillEnemy(RE_ARMOS) && logic->CanKillEnemy(RE_KEESE);});}),
|
||||
//Implies logic->CanKillEnemy(RE_KEESE)
|
||||
Entrance(RR_SPIRIT_TEMPLE_SWITCH_BRIDGE_SOUTH, []{return Here(RR_SPIRIT_TEMPLE_1F_WEST, []{return logic->CanKillEnemy(RE_ARMOS);});}),
|
||||
Entrance(RR_SPIRIT_TEMPLE_RUPEE_BRIDGE_SOUTH, []{return Here(RR_SPIRIT_TEMPLE_1F_WEST, []{return logic->CanKillEnemy(RE_ARMOS);});}),
|
||||
});
|
||||
|
||||
areaTable[RR_SPIRIT_TEMPLE_SWITCH_BRIDGE_SOUTH] = Region("Spirit Temple Switch Bridge South", SCENE_SPIRIT_TEMPLE, {
|
||||
|
@ -129,7 +130,7 @@ void RegionTable_Init_SpiritTemple() {
|
|||
Entrance(RR_SPIRIT_TEMPLE_STATUE_ROOM, []{return logic->SpiritBrokenWallToStatue();}),
|
||||
});
|
||||
|
||||
areaTable[RR_SPIRIT_TEMPLE_1F_EAST] = Region("Adult Spirit Temple Lobby", SCENE_SPIRIT_TEMPLE, {}, {}, {
|
||||
areaTable[RR_SPIRIT_TEMPLE_1F_EAST] = Region("Spirit Temple 1F East", SCENE_SPIRIT_TEMPLE, {}, {}, {
|
||||
//Exits
|
||||
Entrance(RR_SPIRIT_TEMPLE_LOBBY, []{return true;}),
|
||||
Entrance(RR_SPIRIT_TEMPLE_SAND_PIT, []{return Here(RR_SPIRIT_TEMPLE_1F_EAST, []{return logic->CanHitSwitch(logic->IsAdult && ctx->GetTrickOption(RT_SPIRIT_LOWER_ADULT_SWITCH) ? ED_BOMB_THROW : ED_BOOMERANG);});}),
|
||||
|
@ -265,7 +266,6 @@ void RegionTable_Init_SpiritTemple() {
|
|||
Entrance(RR_SPIRIT_TEMPLE_SUN_BLOCK_ROOM, []{return true;}),
|
||||
});
|
||||
|
||||
|
||||
areaTable[RR_SPIRIT_TEMPLE_SUN_BLOCK_ROOM] = Region("Spirit Temple Sun Block Room", SCENE_SPIRIT_TEMPLE, {}, {}, {
|
||||
//Exits
|
||||
Entrance(RR_SPIRIT_TEMPLE_EMPTY_STAIRS, []{return true/*str0 || SunlightArrows*/;}),
|
||||
|
@ -329,7 +329,7 @@ void RegionTable_Init_SpiritTemple() {
|
|||
Entrance(RR_SPIRIT_TEMPLE_2F_MIRROR, []{return true;}),
|
||||
Entrance(RR_SPIRIT_TEMPLE_STATUE_ROOM, []{return true;}),
|
||||
Entrance(RR_SPIRIT_TEMPLE_INNER_EAST_HAND, []{return true;}),
|
||||
//(IsAdult && ctx->GetTrickOption(RT_SPIRIT_LOBBY_JUMP)) || CanUse(RG_HOVER_BOOTS) || (CanUse(RG_ZELDAS_LULLABY) && CanUse(RG_HOOKSHOT));
|
||||
//(IsAdult && ctx->GetTrickOption(RT_SPIRIT_STATUE_JUMP)) || CanUse(RG_HOVER_BOOTS) || (CanUse(RG_ZELDAS_LULLABY) && CanUse(RG_HOOKSHOT));
|
||||
Entrance(RR_SPIRIT_TEMPLE_SHORTCUT_SWITCH, []{return logic->SpiritEastToSwitch();}),
|
||||
Entrance(RR_SPIRIT_TEMPLE_POT_STAIRS, []{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 4);}),
|
||||
//!QUANTUM LOGIC!
|
||||
|
@ -339,6 +339,11 @@ void RegionTable_Init_SpiritTemple() {
|
|||
//Implies CanKillEnemy(RE_IRON_KNUCKLE)
|
||||
Entrance(RR_DESERT_COLOSSUS, []{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) && logic->CanKillEnemy(RE_BEAMOS)/* && CanClimb() && str0*/;}),
|
||||
//!QUANTUM LOGIC!
|
||||
//Continuing from above, if we have the longshot, we can guarantee access to the outer west hand as you can longshot from the east hand to the west
|
||||
//Implies CanKillEnemy(RE_IRON_KNUCKLE)
|
||||
Entrance(RR_SPIRIT_TEMPLE_OUTER_WEST_HAND, []{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) && logic->CanKillEnemy(RE_BEAMOS) && /*CanClimb() && str0 &&*/
|
||||
logic->CanUse(RG_LONGSHOT);}),
|
||||
//!QUANTUM LOGIC!
|
||||
//A variant of the above, if dungeon entrance randomiser is off, Adult entered spirit in reverse, and they have str 2 to get there from the front,
|
||||
//it is always possible for them to reach 1F_EAST with only 2 keys. This is because you can only waste 1 key (on the first child side lock)
|
||||
//before you either allow you to climb down through 2F mirror room, or give yourself access to a hand to jump down from.
|
||||
|
@ -362,7 +367,7 @@ void RegionTable_Init_SpiritTemple() {
|
|||
Entrance(RR_SPIRIT_TEMPLE_STATUE_ROOM, []{return true;}),
|
||||
Entrance(RR_SPIRIT_TEMPLE_STATUE_ROOM_EAST, []{return logic->CanUse(RG_HOVER_BOOTS)/* || CanBunnyJump()*/;}),
|
||||
//Assumes RR_SPIRIT_TEMPLE_STATUE_ROOM_EAST access via RR_SPIRIT_TEMPLE_STATUE_ROOM
|
||||
Entrance(RR_SPIRIT_TEMPLE_SHORTCUT_SWITCH, []{return (logic->IsAdult && ctx->GetTrickOption(RT_SPIRIT_LOBBY_JUMP)) ||
|
||||
Entrance(RR_SPIRIT_TEMPLE_SHORTCUT_SWITCH, []{return (logic->IsAdult && ctx->GetTrickOption(RT_SPIRIT_STATUE_JUMP)) ||
|
||||
(logic->CanUse(RG_ZELDAS_LULLABY) && logic->CanUse(RG_HOOKSHOT));}),
|
||||
});
|
||||
|
||||
|
@ -522,14 +527,13 @@ void RegionTable_Init_SpiritTemple() {
|
|||
Entrance(RR_SPIRIT_TEMPLE_INNER_WEST_HAND, []{return true;}),
|
||||
Entrance(RR_SPIRIT_TEMPLE_STATUE_ROOM_EAST, []{return true;}),
|
||||
Entrance(RR_SPIRIT_TEMPLE_INNER_EAST_HAND, []{return true;}),
|
||||
Entrance(RR_SPIRIT_TEMPLE_STATUE_HEAD, []{return logic->SpiritPushed4FMirrors && logic->CanUse(RG_HOOKSHOT);}),
|
||||
Entrance(RR_SPIRIT_TEMPLE_STATUE_HEAD, []{return logic->SpiritPushed4FMirrors && logic->CanUse(RG_MIRROR_SHIELD) && logic->CanUse(RG_HOOKSHOT);}),
|
||||
});
|
||||
|
||||
areaTable[RR_SPIRIT_TEMPLE_STATUE_HEAD] = Region("Spirit Temple Statue Head", SCENE_SPIRIT_TEMPLE, {
|
||||
//Events
|
||||
//WARNING these events are not glitchproofed and assume you need all keys to reach from the front
|
||||
EventAccess(&logic->ReverseSpiritChild, []{return logic->IsChild;}),
|
||||
EventAccess(&logic->ReverseSpiritAdult, []{return logic->IsAdult;}),
|
||||
}, {}, {
|
||||
// Exits
|
||||
Entrance(RR_SPIRIT_TEMPLE_STATUE_ROOM, []{return true;}),
|
||||
|
@ -738,7 +742,7 @@ void RegionTable_Init_SpiritTemple() {
|
|||
//Land on the SoT block
|
||||
Entrance(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM_WEST, []{return true;}),
|
||||
Entrance(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM, []{return true;}),
|
||||
Entrance(RR_SPIRIT_TEMPLE_MQ_POT_LEDGE, []{return logic->IsAdult && ctx->GetTrickOption(RT_SPIRIT_LOBBY_JUMP);}),
|
||||
Entrance(RR_SPIRIT_TEMPLE_MQ_POT_LEDGE, []{return logic->IsAdult && ctx->GetTrickOption(RT_SPIRIT_STATUE_JUMP);}),
|
||||
// RT_SPIRIT_PLATFORM_HOOKSHOT is currently disabled
|
||||
Entrance(RR_SPIRIT_TEMPLE_MQ_PLATFORM, []{return logic->SpiritPlatformLowered &&
|
||||
(logic->CanUse(RG_LONGSHOT) || (ctx->GetTrickOption(RT_SPIRIT_PLATFORM_HOOKSHOT) && logic->CanUse(RG_HOOKSHOT)));}),
|
||||
|
@ -880,7 +884,7 @@ void RegionTable_Init_SpiritTemple() {
|
|||
Entrance(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM, []{return true;}),
|
||||
Entrance(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM_EAST, []{return logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_HOOKSHOT);}),
|
||||
Entrance(RR_SPIRIT_TEMPLE_MQ_CHEST_LEDGE, []{return ((logic->IsAdult || ctx->GetTrickOption(RT_SPIRIT_WEST_LEDGE)) && (ctx->GetTrickOption(RT_LENS_SPIRIT_MQ) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->CanUse(RG_HOOKSHOT))
|
||||
|| (logic->IsAdult && ctx->GetTrickOption(RT_SPIRIT_LOBBY_JUMP));}),
|
||||
|| (logic->IsAdult && ctx->GetTrickOption(RT_SPIRIT_STATUE_JUMP));}),
|
||||
});
|
||||
|
||||
areaTable[RR_SPIRIT_TEMPLE_MQ_CHEST_LEDGE] = Region("Spirit Temple MQ Chest Ledge", SCENE_SPIRIT_TEMPLE, {}, {
|
||||
|
@ -1121,7 +1125,6 @@ void RegionTable_Init_SpiritTemple() {
|
|||
//Events
|
||||
//WARNING these events are not glitchproofed and assume you need all keys to reach from the front
|
||||
EventAccess(&logic->ReverseSpiritChild, []{return logic->IsChild;}),
|
||||
EventAccess(&logic->ReverseSpiritAdult, []{return logic->IsAdult;}),
|
||||
}, {}, {
|
||||
// Exits
|
||||
Entrance(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM, []{return true;}),
|
||||
|
|
|
@ -926,7 +926,7 @@ bool Logic::CanAvoidEnemy(RandomizerEnemy enemy, bool grounded, uint8_t quantity
|
|||
case RE_TORCH_SLUG:
|
||||
return !grounded || CanUse(RG_NUTS) || CanUse(RG_HOOKSHOT) || CanUse(RG_DINS_FIRE);
|
||||
default:
|
||||
SPDLOG_ERROR("CanPassEnemy reached `default`.");
|
||||
SPDLOG_ERROR("CanAvoidEnemy reached `default`.");
|
||||
assert(false);
|
||||
return false;
|
||||
}
|
||||
|
@ -2364,8 +2364,10 @@ void Logic::SetInLogic(LogicVal logicVal, bool value) {
|
|||
}
|
||||
|
||||
bool Logic::IsReverseAccessPossible() {
|
||||
//If we ever allow dungeon entrances to connect to boss rooms directly in dungeon chains, or for 1 boss door to lead to another dungeons boss door, add RSK_MIX_DUNGEON_ENTRANCES to the final condition
|
||||
return ctx->GetOption(RSK_SHUFFLE_BOSS_ENTRANCES) &&
|
||||
(ctx->GetOption(RSK_DECOUPLED_ENTRANCES) || ctx->GetOption(RSK_MIX_BOSS_ENTRANCES));
|
||||
(ctx->GetOption(RSK_DECOUPLED_ENTRANCES) ||
|
||||
(ctx->GetOption(RSK_MIX_BOSS_ENTRANCES) && (ctx->GetOption(RSK_MIX_OVERWORLD_ENTRANCES) || ctx->GetOption(RSK_MIX_INTERIOR_ENTRANCES))));
|
||||
}
|
||||
|
||||
bool Logic::SpiritBrokenWallToStatue() {
|
||||
|
@ -2373,12 +2375,12 @@ bool Logic::SpiritBrokenWallToStatue() {
|
|||
}
|
||||
|
||||
bool Logic::SpiritEastToSwitch() {
|
||||
return (IsAdult && ctx->GetTrickOption(RT_SPIRIT_LOBBY_JUMP)) || CanUse(RG_HOVER_BOOTS) ||
|
||||
return (IsAdult && ctx->GetTrickOption(RT_SPIRIT_STATUE_JUMP)) || CanUse(RG_HOVER_BOOTS) ||
|
||||
(CanUse(RG_ZELDAS_LULLABY) && CanUse(RG_HOOKSHOT));
|
||||
}
|
||||
|
||||
bool Logic::SpiritWestToSkull() {
|
||||
return (IsAdult && ctx->GetTrickOption(RT_SPIRIT_LOBBY_JUMP)) || CanUse(RG_HOVER_BOOTS) || CanUse(RG_SCARECROW);
|
||||
return (IsAdult && ctx->GetTrickOption(RT_SPIRIT_STATUE_JUMP)) || CanUse(RG_HOVER_BOOTS) || CanUse(RG_SCARECROW);
|
||||
}
|
||||
|
||||
bool Logic::SpiritSunBlockSouthLedge() {
|
||||
|
@ -2393,7 +2395,7 @@ bool Logic::SpiritSunBlockSouthLedge() {
|
|||
|
||||
// Combines crossing the ledge directly and the jump from the hand
|
||||
bool Logic::MQSpiritWestToPots() {
|
||||
return (IsAdult && ctx->GetTrickOption(RT_SPIRIT_LOBBY_JUMP)) || CanUse(RG_HOVER_BOOTS) || CanUse(RG_SONG_OF_TIME);
|
||||
return (IsAdult && ctx->GetTrickOption(RT_SPIRIT_STATUE_JUMP)) || CanUse(RG_HOVER_BOOTS) || CanUse(RG_SONG_OF_TIME);
|
||||
}
|
||||
|
||||
bool Logic::MQSpiritStatueToSunBlock() {
|
||||
|
@ -2628,7 +2630,6 @@ void Logic::Reset(bool resetSaveContext /*= true*/) {
|
|||
Spirit4FSwitch = false;
|
||||
SpiritPushed4FMirrors = false;
|
||||
ReverseSpiritChild = false;
|
||||
ReverseSpiritAdult = false;
|
||||
|
||||
CalculatingAvailableChecks = false;
|
||||
|
||||
|
|
|
@ -187,7 +187,6 @@ class Logic {
|
|||
bool Spirit4FSwitch = false;
|
||||
bool SpiritPushed4FMirrors = false;
|
||||
bool ReverseSpiritChild = false;
|
||||
bool ReverseSpiritAdult = false;
|
||||
|
||||
/* --- END OF HELPERS AND LOCATION ACCESS --- */
|
||||
|
||||
|
|
|
@ -3703,7 +3703,7 @@ typedef enum {
|
|||
RT_SPIRIT_CHILD_CHU,
|
||||
RT_SPIRIT_WEST_LEDGE,
|
||||
RT_SPIRIT_LOWER_ADULT_SWITCH,
|
||||
RT_SPIRIT_LOBBY_JUMP,
|
||||
RT_SPIRIT_STATUE_JUMP,
|
||||
RT_SPIRIT_PLATFORM_HOOKSHOT,
|
||||
RT_SPIRIT_MAP_CHEST,
|
||||
RT_SPIRIT_SUN_CHEST,
|
||||
|
|
|
@ -1023,8 +1023,8 @@ void Settings::CreateOptions() {
|
|||
"A bomb can be used to hit the switch on the ceiling, but it must be thrown from a particular distance "
|
||||
"away and with precise timing.");
|
||||
OPT_TRICK(
|
||||
RT_SPIRIT_LOBBY_JUMP, RCQUEST_BOTH, RA_SPIRIT_TEMPLE, { Tricks::Tag::INTERMEDIATE },
|
||||
"Spirit Temple Main Room Jump from Hands to Upper Ledges",
|
||||
RT_SPIRIT_STATUE_JUMP, RCQUEST_BOTH, RA_SPIRIT_TEMPLE, { Tricks::Tag::INTERMEDIATE },
|
||||
"Spirit Temple Statue Room Jump from Hands to Upper Ledges",
|
||||
"A precise jump to obtain the following as adult without needing one of Hover Boots, or Hookshot (in Vanilla) "
|
||||
"or Song of Time (in MQ): - Spirit Temple Statue Room Northeast Chest - Spirit Temple GS Lobby - Spirit Temple "
|
||||
"MQ Central Chamber Top Left Pot (Left) - Spirit Temple MQ Central Chamber Top Left Pot (Right)");
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue