diff --git a/helpers.json b/helpers.json index 293f8e8f80..02eead07b4 100644 --- a/helpers.json +++ b/helpers.json @@ -969,6 +969,14 @@ ]} ] }, + { + "name": "h_flashSuitIceClip", + "requires": [ + "canTrickyUseFrozenEnemies", + "canCeilingClip", + {"useFlashSuit": {}} + ] + }, { "name": "h_maxHeightSpringBallJump", "requires": [ diff --git a/region/maridia/outer/Crab Hole.json b/region/maridia/outer/Crab Hole.json index 2dda12a872..30e6f60b6a 100644 --- a/region/maridia/outer/Crab Hole.json +++ b/region/maridia/outer/Crab Hole.json @@ -1336,7 +1336,16 @@ ]}, {"and": [ "HiJump", - "h_highPixelIceClip" + "h_highPixelIceClip", + "canBeVeryPatient", + {"or": [ + "HiJump", + "Gravity" + ]}, + {"or": [ + {"noFlashSuit": {}}, + "canTrickyCarryFlashSuit" + ]} ]} ]} ], diff --git a/region/maridia/outer/Mt. Everest.json b/region/maridia/outer/Mt. Everest.json index 26394351df..36e181eafd 100644 --- a/region/maridia/outer/Mt. Everest.json +++ b/region/maridia/outer/Mt. Everest.json @@ -3295,6 +3295,46 @@ "FIXME: suitless variations would be possible with HiJump in combination with Spring Ball or Grapple and patience." ] }, + { + "link": [5, 5], + "name": "Flash Suit Ice Clip Door Lock Skip", + "requires": [ + "canBeVeryPatient", + {"or": [ + {"and": [ + "Gravity", + "SpaceJump" + ]}, + {"and": [ + "Gravity", + "HiJump", + "canPreciseGrapple" + ]}, + {"and": [ + "HiJump", + "canPreciseGrapple", + "canSpringBallJumpMidAir" + ]}, + {"and": [ + "HiJump", + "canGravityJump" + ]} + ]}, + {"ammo": {"type": "Super", "count": 1}}, + "h_flashSuitIceClip", + {"shinespark": {"frames": 2, "excessFrames": 1}} + ], + "exitCondition": { + "leaveWithSpark": {} + }, + "bypassesDoorShell": true, + "flashSuitChecked": true, + "note": [ + "Lure a crab to the top door.", + "Use a Super to knock it off and freeze it frame-perfectly below the door.", + "Use a flash suit from a crouched position to spark vertically and clip past the door shell." + ] + }, { "id": 126, "link": [5, 5], diff --git a/region/norfair/crocomire/Post Crocomire Shaft.json b/region/norfair/crocomire/Post Crocomire Shaft.json index 13d3f5ac22..275a70462f 100644 --- a/region/norfair/crocomire/Post Crocomire Shaft.json +++ b/region/norfair/crocomire/Post Crocomire Shaft.json @@ -666,11 +666,36 @@ ], "bypassesDoorShell": true, "note": [ - "Use a Super to knock a Viola off of the middle platforms and ride it up the right wall by freezing it with Ice Beam.", + "Use a Super to knock a Viola off of the middle platforms and ride it up the right wall by freezing it.", "Once it reaches the top door, use another Super to knock it off again, and freeze it mid-air.", "Use Morph and X-Ray to stand on top of it and clip up through the door shell above." ] }, + { + "link": [3, 4], + "name": "Flash Suit Ice Clip Door Lock Skip", + "requires": [ + {"or": [ + "canConsecutiveWalljump", + "SpaceJump", + "canLongIBJ", + "canBePatient" + ]}, + {"ammo": {"type": "Super", "count": 2}}, + "h_flashSuitIceClip", + {"shinespark": {"frames": 2, "excessFrames": 1}} + ], + "exitCondition": { + "leaveWithSpark": {} + }, + "bypassesDoorShell": true, + "flashSuitChecked": true, + "note": [ + "Use a Super to knock a Viola off of the middle platforms and ride it up the right wall by freezing it.", + "Once it reaches the top door, use another Super to knock it off again, and freeze it mid-air pixel perfectly.", + "Use a flash suit from a crouched position to spark vertically and clip past the door shell." + ] + }, { "id": 28, "link": [3, 4], diff --git a/tests/asserts/keywords.py b/tests/asserts/keywords.py index dab4770151..881e429aa3 100644 --- a/tests/asserts/keywords.py +++ b/tests/asserts/keywords.py @@ -479,6 +479,8 @@ def process_req_speed_state(req, states, err_fn): # Note: "canSpeedKeep" can be used for other purposes than obtaining blue, but its presence should be # enough to satisfy the test as a way that blue may be obtained. states = {"blue"} + elif req in ["h_flashSuitIceClip"]: + states = {"preshinespark"} elif req in ["canTemporaryBlue", "canChainTemporaryBlue", "canLongChainTemporaryBlue", "canSpeedball", "canXRayCancelShinecharge"]: if not states.issubset(["shinecharging", "blue"]): err_fn(f"{req} while not in blue state")