From fd25863aab02c0235362e94ee3db18c9dffc1993 Mon Sep 17 00:00:00 2001 From: Brent Kerby Date: Sun, 4 May 2025 16:29:54 -0600 Subject: [PATCH] Refine Crab Shaft shinecharges --- region/maridia/inner-pink/Crab Shaft.json | 420 ++++++++++++++++++++-- 1 file changed, 383 insertions(+), 37 deletions(-) diff --git a/region/maridia/inner-pink/Crab Shaft.json b/region/maridia/inner-pink/Crab Shaft.json index 99635adbcd..53ff48ad44 100644 --- a/region/maridia/inner-pink/Crab Shaft.json +++ b/region/maridia/inner-pink/Crab Shaft.json @@ -71,6 +71,21 @@ [1, 0], [1, 1] ] + }, + { + "id": 5, + "name": "Middle Right Shinecharged", + "nodeType": "junction", + "nodeSubType": "junction", + "mapTileMask": [ + [1, 0], + [1, 0], + [2, 0], + [1, 1] + ], + "devNote": [ + "This represents being shinecharged at the end of the runway opposite the left door." + ] } ], "enemies": [ @@ -96,7 +111,8 @@ {"id": 1}, {"id": 2}, {"id": 3}, - {"id": 4} + {"id": 4}, + {"id": 5} ] }, { @@ -122,6 +138,15 @@ {"id": 3}, {"id": 4} ] + }, + { + "from": 5, + "to": [ + {"id": 1}, + {"id": 2}, + {"id": 3}, + {"id": 4} + ] } ], "strats": [ @@ -168,33 +193,206 @@ ] }, { - "id": 2, "link": [1, 1], - "name": "Stutter Water Shinecharge, Leave with Spark", + "name": "Precise Stutter Shinecharge, Leave Shinecharged (5-tile runway)", "entranceCondition": { - "comeInRunning": { - "speedBooster": true, + "comeInStutterShinecharging": { + "minTiles": 5 + } + }, + "requires": [ + "canPreciseStutterWaterShineCharge", + "canShinechargeMovementTricky", + "canInsaneJump", + {"shineChargeFrames": 130}, + {"or": [ + "canBeVeryPatient", + {"shineChargeFrames": 15} + ]} + ], + "exitCondition": { + "leaveShinecharged": {} + }, + "unlocksDoors": [ + {"types": ["super"], "requires": []}, + {"types": ["missiles", "powerbomb"], "requires": ["never"]} + ], + "note": [ + "With a runway of 5 tiles (open end) in the other room,", + "the ideal timing for the stutter is to release forward for 5 frames, and repress forward on the last possible frame before the transition.", + "Other timings can work, but will gain the shinecharge further from the door, leaving fewer shinecharge frames remaining.", + "After gaining the shinecharge, continue holding forward in order to make Samus stand.", + "Then turnaround spin jump back toward the door, and continue spin jumping to reach the transition with a shinecharge." + ] + }, + { + "link": [1, 1], + "name": "Precise Stutter Shinecharge, Leave Shinecharged (4-tile runway)", + "entranceCondition": { + "comeInStutterShinecharging": { + "minTiles": 4 + } + }, + "requires": [ + "canPreciseStutterWaterShineCharge", + "canShinechargeMovementTricky", + "canInsaneJump", + {"shineChargeFrames": 140}, + {"or": [ + "canBeVeryPatient", + {"shineChargeFrames": 10} + ]} + ], + "exitCondition": { + "leaveShinecharged": {} + }, + "unlocksDoors": [ + {"types": ["super"], "requires": []}, + {"types": ["missiles", "powerbomb"], "requires": ["never"]} + ], + "note": [ + "With only a runway of 4 tiles (open end) in the other room,", + "the ideal timing for the stutter is to release forward for 4 frames, and repress forward on the last possible frame before the transition.", + "It also works well to release forward for 3 frames and repress on the last possible frame.", + "Other timings can also work, but may gain the shinecharge further from the door, leaving fewer shinecharge frames remaining.", + "After gaining the shinecharge, continue holding forward in order to make Samus stand.", + "Then turnaround spin jump back toward the door, and continue spin jumping to reach the transition with a shinecharge." + ] + }, + { + "link": [1, 1], + "name": "Precise Stutter Shinecharge, Leave Shinecharged (3-tile runway)", + "entranceCondition": { + "comeInStutterShinecharging": { + "minTiles": 3 + } + }, + "requires": [ + "canPreciseStutterWaterShineCharge", + "canShinechargeMovementTricky", + "canInsaneJump", + {"shineChargeFrames": 145}, + {"or": [ + "canBeVeryPatient", + {"shineChargeFrames": 10} + ]} + ], + "exitCondition": { + "leaveShinecharged": {} + }, + "unlocksDoors": [ + {"types": ["super"], "requires": []}, + {"types": ["missiles", "powerbomb"], "requires": ["never"]} + ], + "note": [ + "With only a runway of 3 tiles (open end) in the other room,", + "the ideal timing for the stutter is to release forward for 3 or 4 frames, and repress forward on the last possible frame before the transition.", + "Other timings can work, but will gain the shinecharge further from the door, leaving fewer shinecharge frames remaining.", + "After gaining the shinecharge, continue holding forward in order to make Samus stand.", + "Then turnaround spin jump back toward the door, and continue spin jumping to reach the transition with a shinecharge.", + "Alternatively, with greater difficulty but saving some shinecharge frames,", + "after performing the turnaround spin jump, briefly moonwalk back, then retain momentum by boomeranging forward", + "(switching from pressing backward to pressing forward on the next frame),", + "and arm pump to reach the door quickly." + ], + "devNote": [ + "The same shinecharge frames could be achieved with a closed end runway (effective length of 2.4375),", + "with a 3-frame stutter, but there doesn't appear to be any application." + ] + }, + { + "link": [1, 1], + "name": "Precise Stutter Shinecharge, Leave Shinecharged (2-tile runway)", + "entranceCondition": { + "comeInStutterShinecharging": { "minTiles": 2 } }, "requires": [ - "canStutterWaterShineCharge", - "canShinechargeMovementComplex", - "h_shinechargeMaxRunway", + "canPreciseStutterWaterShineCharge", + "canShinechargeMovementTricky", + "canInsaneJump", + {"shineChargeFrames": 150}, {"or": [ - {"shinespark": {"frames": 12}}, - {"and": [ - "canShinechargeMovementTricky", - {"shinespark": {"frames": 3}} - ]} + "canBeVeryPatient", + {"shineChargeFrames": 15} ]} ], "exitCondition": { - "leaveWithSpark": {} + "leaveShinecharged": {} }, "unlocksDoors": [ - {"types": ["missiles", "super"], "requires": []}, - {"types": ["powerbomb"], "requires": ["never"]} + {"types": ["super"], "requires": []}, + {"types": ["missiles", "powerbomb"], "requires": ["never"]} + ], + "note": [ + "With only a runway of 2 tiles (open end) in the other room,", + "the ideal timing for the stutter is to release forward for 3 frames, and repress forward on the last possible frame before the transition.", + "Other timings can work, but will gain the shinecharge further from the door, leaving fewer shinecharge frames remaining.", + "After gaining the shinecharge, continue holding forward in order to make Samus stand.", + "Then turnaround spin jump back toward the door, and continue spin jumping to reach the transition with a shinecharge.", + "Alternatively, with greater difficulty but saving some shinecharge frames,", + "after performing the turnaround spin jump, briefly moonwalk back, then retain momentum by boomeranging forward", + "(switching from pressing backward to pressing forward on the next frame),", + "and arm pump to reach the door quickly." + ], + "devNote": [ + "FIXME: The canBeVeryPatient requirement is for difficulty placement of the boomerang method;", + "but the boomerang (or maybe specifically the moonwalk boomerang) should possibly be its own tech,", + "and the same with rapid arm pumping." + ] + }, + { + "link": [1, 1], + "name": "Precise Stutter Shinecharge, Leave Shinecharged (1-tile runway)", + "entranceCondition": { + "comeInStutterShinecharging": { + "minTiles": 1 + } + }, + "requires": [ + "canPreciseStutterWaterShineCharge", + "canInsaneJump", + "canBeVeryPatient", + "canShinechargeMovementTricky", + {"shineChargeFrames": 160} + ], + "exitCondition": { + "leaveShinecharged": {} + }, + "unlocksDoors": [ + {"types": ["super"], "requires": []}, + {"types": ["missiles", "powerbomb"], "requires": ["never"]} + ], + "note": [ + "With only 1 tile of runway in the other room, Samus should ideally start on the last pixel of runway with X subpixels of $3FFF or less.", + "Run toward the door, releasing forward for exactly 1 frame and pressing it again on the last possible frame before the transition.", + "Starting with X subpixels of $7FFF can also work (e.g., by simply backing against the door ledge, then jumping and turning around mid-air);", + "in this case, Samus must advance 1 or 2 pixels with an arm pump before the transition (e.g., firing a shot or pressing and/or releasing an angle button),", + "and the shinecharge will be gained slightly further away from the door.", + "After gaining the shinecharge, continue holding forward in order to make Samus stand.", + "Then turnaround spin jump back toward the door, and continue spin jumping to reach the transition with a shinecharge.", + "Alternatively, with greater difficulty but saving some shinecharge frames,", + "after performing the turnaround spin jump, briefly moonwalk back, then retain momentum by boomeranging forward", + "(switching from pressing backward to pressing forward on the next frame),", + "and arm pump to reach the door quickly." + ], + "detailNote": [ + "Ideal subpixels ($3FFF) can be achieved using one of several methods:", + "1) press forward against the door ledge (or a wall aligned with it);", + "jump, and while mid-air, tap forward for exactly 1 frame to land with subpixels $BFFF,", + "moonwalk back for exactly 1 frame to end with subpixels $3FFF.", + "2) press forward against the door ledge (from a platform below, assuming one exists)", + "turn around (while on the ground), and moonwalk back two pixels,", + "then jump and mid-air turnaround onto the ledge;", + "if Samus jumped from the correct pixel but does not land on the ledge, then it was needed to moonwalk back 1 more frame;", + "in this case it is possible to retry by doing a mid-air turnaround back onto the platform, and moonwalking back for 1 frame.", + "3) if X-Ray is available, press against the door ledge (from a platform below, assuming one exists)", + "turn around (while on the ground), then jump and mid-air turnaround toward the door,", + "and use X-Ray to turnaround in place away from the door;", + "repeat this sequence 3 more times: jump, mid-air turnaround, X-Ray turnaround;", + "then do one more jump and mid-air turnaround, high enough to land on the door ledge,", + "and Samus should be in the correct position with subpixels $3FFF." ] }, { @@ -478,27 +676,6 @@ "--Open the top door, shortcharge, turn off gravity while jumping up the left shaft, diagonal spark to the right." ] }, - { - "id": 15, - "link": [1, 4], - "name": "Stutter Water Shinecharge", - "entranceCondition": { - "comeInRunning": { - "speedBooster": true, - "minTiles": 2 - } - }, - "requires": [ - "canStutterWaterShineCharge", - "canShinechargeMovementComplex", - "h_shinechargeMaxRunway", - {"shinespark": {"frames": 40, "excessFrames": 6}} - ], - "note": [ - "After storing the shinecharge, spin jump back to the left and spark aligned against the right side of the left shaft.", - "At the top of the room, hold right in order to land on the platform below the door." - ] - }, { "id": 16, "link": [1, 4], @@ -888,6 +1065,79 @@ ], "devNote": "The requirements are for getting onto the platform." }, + { + "link": [1, 5], + "name": "Water Shinecharge", + "entranceCondition": { + "comeInShinecharging": { + "length": 4, + "openEnd": 0 + } + }, + "requires": [ + "canWaterShineCharge", + {"shineChargeFrames": 0} + ], + "endsWithShineCharge": true + }, + { + "link": [1, 5], + "name": "Precise Stutter Water Shinecharge", + "entranceCondition": { + "comeInStutterShinecharging": { + "minTiles": 2 + } + }, + "requires": [ + "canPreciseStutterWaterShineCharge", + {"shineChargeFrames": 0} + ], + "endsWithShineCharge": true + }, + { + "link": [1, 5], + "name": "Very Precise Stutter Water Shinecharge", + "entranceCondition": { + "comeInStutterShinecharging": { + "minTiles": 1 + } + }, + "requires": [ + "canPreciseStutterWaterShineCharge", + "canInsaneJump", + "canBeVeryPatient", + {"shineChargeFrames": 0} + ], + "endsWithShineCharge": true, + "note": [ + "With only 1 tile of runway in the other room, Samus should ideally start on the last pixel of runway with X subpixels of $3FFF or less.", + "Run toward the door, releasing forward for exactly 1 frame and pressing it again on the last possible frame before the transition.", + "Starting with X subpixels of $7FFF can also work (e.g., by simply backing against the door ledge, then jumping and turning around mid-air);", + "in this case, Samus must advance 1 or 2 pixels with an arm pump before the transition (e.g., firing a shot or pressing and/or releasing an angle button),", + "and the shinecharge will be gained slightly further away." + ], + "detailNote": [ + "Correct subpixels can be achieved using one of several methods:", + "1) press against the door ledge (or a wall aligned with it);", + "jump, and while mid-air, tap forward for exactly 1 frame to land with subpixels $BFFF,", + "moonwalk back for exactly 1 frame to end with subpixels $3FFF.", + "2) press against the door ledge (from a platform below, assuming one exists)", + "turn around (while on the ground), and moonwalk back two pixels,", + "then jump and mid-air turnaround onto the ledge;", + "if Samus jumped from the correct pixel but does not land on the ledge, then it was needed to moonwalk back 1 more frame;", + "in this case it is possible to retry by doing a mid-air turnaround back onto the platform, and moonwalking back for 1 frame.", + "3) if X-Ray is available, press against the door ledge (from a platform below, assuming one exists)", + "turn around (while on the ground), then jump and mid-air turnaround toward the door,", + "and use X-Ray to turnaround in place away from the door;", + "repeat this sequence 3 more times: jump, mid-air turnaround, X-Ray turnaround;", + "then do one more jump and mid-air turnaround, high enough to land on the door ledge,", + "and Samus should be in the correct position with subpixels $3FFF." + ], + "devNote": [ + "The `canBeVeryPatient` is for difficulty placement; this could be improved with a more specific tech later,", + "since it does not actually take a long time to execute." + ] + }, { "id": 31, "link": [2, 1], @@ -1660,6 +1910,102 @@ "h_CrystalFlash" ], "flashSuitChecked": true + }, + { + "link": [5, 1], + "name": "Leave With Spark", + "startsWithShineCharge": true, + "requires": [ + "canShinechargeMovementComplex", + {"shineChargeFrames": 120}, + {"shinespark": {"frames": 9}} + ], + "exitCondition": { + "leaveWithSpark": {} + }, + "unlocksDoors": [ + {"types": ["super"], "requires": []}, + {"types": ["missiles", "powerbomb"], "requires": ["never"]} + ] + }, + { + "link": [5, 1], + "name": "Leave With Temporary Blue", + "startsWithShineCharge": true, + "requires": [ + {"shineChargeFrames": 0}, + "h_getBlueSpeedMaxRunway", + "canXRayTurnaround", + "canChainTemporaryBlue" + ], + "exitCondition": { + "leaveWithTemporaryBlue": {} + }, + "unlocksDoors": [{"types": ["ammo"], "requires": []}], + "flashSuitChecked": true, + "devNote": [ + "The `h_getBlueSpeedMaxRunway` requirement is to satisfy the tests,", + "since we don't have a way to represent that the temporary blue originates from the startsWithShineCharge." + ] + }, + { + "link": [5, 2], + "name": "Leave With Temporary Blue", + "startsWithShineCharge": true, + "requires": [ + {"shineChargeFrames": 0}, + "h_getBlueSpeedMaxRunway", + "canXRayTurnaround", + "canLongChainTemporaryBlue" + ], + "exitCondition": { + "leaveWithTemporaryBlue": {} + }, + "unlocksDoors": [{"types": ["ammo"], "requires": []}], + "flashSuitChecked": true, + "devNote": [ + "The `h_getBlueSpeedMaxRunway` requirement is to satisfy the tests,", + "since we don't have a way to represent that the temporary blue originates from the startsWithShineCharge." + ] + }, + { + "link": [5, 3], + "name": "Leave With Temporary Blue", + "startsWithShineCharge": true, + "requires": [ + "HiJump", + {"shineChargeFrames": 0}, + "h_getBlueSpeedMaxRunway", + "canXRayTurnaround", + "canLongChainTemporaryBlue", + "canTrickySpringBallJump", + "canPauseRemorphTemporaryBlue" + ], + "exitCondition": { + "leaveWithTemporaryBlue": { + "direction": "any" + } + }, + "unlocksDoors": [{"types": ["ammo"], "requires": []}], + "flashSuitChecked": true, + "devNote": [ + "The `h_getBlueSpeedMaxRunway` requirement is to satisfy the tests,", + "since we don't have a way to represent that the temporary blue originates from the startsWithShineCharge." + ] + }, + { + "id": 15, + "link": [5, 4], + "name": "Shinespark", + "requires": [ + "canShinechargeMovementComplex", + "h_shinechargeMaxRunway", + {"shinespark": {"frames": 37, "excessFrames": 1}} + ], + "note": [ + "After storing the shinecharge, spin jump back to the left and spark aligned against the right side of the left shaft.", + "At the top of the room, hold right in order to land on the platform below the door." + ] } ], "notables": [