Skip to content

Commit c78ab5d

Browse files
authored
Merge pull request #2083 from blkerby/ridley-g-mode
Ridley G-mode and ridleyKill requirement
2 parents 59b116d + e57acf5 commit c78ab5d

4 files changed

Lines changed: 250 additions & 7 deletions

File tree

logicalRequirements.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ A logical requirement is an array of logical elements, which are implicitly link
77
* _The name of a tech._ Techs are defined in [tech.json](tech.json). Those represent a technique that players can perform, which may also imply logical requirements of their own. By convention, a tech's name should start with `can`.
88
* _The name of an item._ Those are defined in [items.json](items.json).
99
* _The name of a game flag._ Those are defined in [items.json](items.json), and are used to represent game events such as defeating a boss, or breaking the Maridia tube. By convention, a game flag's name should start with `f_`.
10+
* _"free"._ This indicates a logical element that is automatically fulfilled.
1011
* _"never"._ This indicates a logical element that cannot be fulfilled under any conditions.
1112
* More complex elements which will be defined in their own sub-sections
1213

@@ -651,6 +652,31 @@ __Example:__
651652
{"noFlashSuit": {}}
652653
```
653654

655+
### Boss requirements
656+
657+
#### Ridley kill
658+
659+
A `ridleyKill` requirement represents the need to kill Ridley, including ammo and energy requirements depending on the player's assumed skill level and available items. The expected duration of the fight can be estimated based on the following assumptions:
660+
- Supers can be used once every 0.5 seconds.
661+
- Missiles can be used once every 0.34 seconds.
662+
- A charged beam shot can be used once every 1.4 seconds.
663+
- Power Bombs can be used once every 3 seconds.
664+
665+
Heat frames are included based on the expected duration of the fight. Patience requirements `canBePatient`, `canBeVeryPatient`, and `canBeExtremelyPatient` are likewise also included. In both cases, a leniency multiplier should be applied to the time taken between shots. Leniency should also be applied based on the assumed accuracy rate of shots hitting Ridley successfully.
666+
667+
Heat frame requirements should be included for the period before the fight begins, as well as after the fight until drops occurs, which can be estimated (slightly generously) at 16 seconds, or 960 heat frames.
668+
669+
If neither Morph nor Screw Attack are available, then at the highest skill level it can be assumed that the player takes unavoidable enemy damage at a rate of 10 energy per second. If Morph or Screw Attack is available, then it is possible to avoid all enemy damage, but for leniency normally some damage should still be assumed.
670+
671+
A `ridleyKill` requirement has the following optional properties which modify the assumptions of the fight:
672+
- _powerBombs_: A boolean indicating if Power Bombs can be used during the fight (default: true).
673+
- _gMode_: A boolean indicating if the fight happens in G-mode. If true, then Samus will be protected from heat damage, but Ridley's fireballs become invisible and immobile while still being dangerous to Samus.
674+
- _stuck_: An enum with possible values "top" or "bottom", indicating the part of the room where Ridley gets stuck, allowing Samus to freely avoid damage from Ridley while inflicting damage to Ridley. If Ridley is stuck at the bottom of the room, then damage can be inflicted at a higher rate (not taking into account lag, which may be increased if a Crystal Flash is used in G-mode):
675+
- Supers can be used once every 0.34 seconds.
676+
- Missiles can be used once every 0.17 seconds.
677+
- A charged beam shot can be used once every 1.1 seconds.
678+
- Power Bombs can be used once every 2.65 seconds, though because there is no known way to keep Ridley stuck while using Power Bombs, strats should set `powerBombs` to `false` when `stuck` is `true`.
679+
654680
### Other requirements
655681

656682
#### tech object

region/lowernorfair/east/Ridley's Room.json

Lines changed: 200 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,94 @@
395395
{"heatFrames": 50}
396396
]
397397
},
398+
{
399+
"link": [1, 3],
400+
"name": "G-Mode Crystal Flash Stuck Ridley",
401+
"entranceCondition": {
402+
"comeInWithGMode": {
403+
"mode": "any",
404+
"morphed": false,
405+
"mobility": "mobile"
406+
}
407+
},
408+
"requires": [
409+
{"notable": "G-Mode Crystal Flash Stuck Ridley"},
410+
"h_heatedGMode",
411+
"h_CrystalFlash",
412+
"h_usePowerBomb",
413+
{"or": [
414+
{"and": [
415+
{"or": [
416+
"canWalljump",
417+
"HiJump",
418+
"canSpringBallJumpMidAir",
419+
"SpaceJump"
420+
]},
421+
{"ridleyKill": {
422+
"powerBombs": false,
423+
"gMode": true,
424+
"stuck": "bottom"}
425+
}
426+
]},
427+
{"ridleyKill": {
428+
"powerBombs": false,
429+
"gMode": true,
430+
"stuck": "top"
431+
}}
432+
]},
433+
{"autoReserveTrigger": {}},
434+
{"heatFrames": 520},
435+
{"partialRefill": {"type": "Energy", "limit": 100}}
436+
],
437+
"setsFlags": ["f_DefeatedRidley"],
438+
"note": [
439+
"Enter the room in G-mode, perform a Crystal Flash, then lay an additional Power Bomb, preferably at the top of the room.",
440+
"The Power Bomb will not explode but will continually force Ridley into a corner of the room.",
441+
"If the Power Bomb is laid near the top of the room, then Ridley will be forced into the bottom of the room,",
442+
"making it easy to damage Ridley at the highest possible rate;",
443+
"if the Power Bomb is laid lower, Ridley will be forced to the top of room, and Samus will have to jump repeatedly to bring it on camera.",
444+
"in which case Ridley can still be damaged but more slowly and with some caution needed to avoid invisible fireballs.",
445+
"After reducing Ridley's health to zero, take damage from Ridley or an invisible fireball to trigger auto-reserves and exit G-mode.",
446+
"Then get grabbed by Ridley to finish the fight."
447+
]
448+
},
449+
{
450+
"link": [1, 3],
451+
"name": "G-Mode Ridley with 30 Supers",
452+
"entranceCondition": {
453+
"comeInWithGMode": {
454+
"mode": "any",
455+
"morphed": false,
456+
"mobility": "mobile"
457+
}
458+
},
459+
"requires": [
460+
{"notable": "G-Mode Ridley with 30 Supers"},
461+
"h_heatedGMode",
462+
{"heatFrames": 0},
463+
{"ammo": {"type": "Super", "count": 30}},
464+
{"or": [
465+
{"and": [
466+
"canPauseAbuse",
467+
{"resourceAtMost": [{"type": "Energy", "count": 1}]},
468+
{"partialRefill": {"type": "Energy", "limit": 100}}
469+
]},
470+
"free"
471+
]}
472+
],
473+
"setsFlags": ["f_DefeatedRidley"],
474+
"note": [
475+
"Enter the room in G-mode and quickly kill Ridley with 30 Supers.",
476+
"G-mode protects against heat damage but also causes Ridley's fireballs to be invisible and not move.",
477+
"As long as Ridley is swooping, not many fireballs will be placed, so delaying Ridley from pogoing can be helpful.",
478+
"Once Ridley begins pogoing, it generally becomes unsafe for Samus to jump high because of the risk of touching a fireball.",
479+
"By the end of the fight, projectiles will probably be overloaded, causing Ridley's drops not to spawn;",
480+
"they can be collected by exiting G-mode just before drops spawn, and pause abusing if necessary."
481+
],
482+
"devNote": [
483+
"FIXME: Leaving back through the open door while still in G-Mode is also possible, and free to do."
484+
]
485+
},
398486
{
399487
"id": 4,
400488
"link": [2, 2],
@@ -577,6 +665,99 @@
577665
],
578666
"flashSuitChecked": true
579667
},
668+
{
669+
"link": [2, 3],
670+
"name": "G-Mode Crystal Flash Stuck Ridley",
671+
"entranceCondition": {
672+
"comeInWithGMode": {
673+
"mode": "any",
674+
"morphed": false,
675+
"mobility": "mobile"
676+
}
677+
},
678+
"requires": [
679+
{"notable": "G-Mode Crystal Flash Stuck Ridley"},
680+
"h_heatedGMode",
681+
"h_CrystalFlash",
682+
"h_usePowerBomb",
683+
{"or": [
684+
{"and": [
685+
{"or": [
686+
"canWalljump",
687+
"HiJump",
688+
"canSpringBallJumpMidAir",
689+
"SpaceJump"
690+
]},
691+
{"ridleyKill": {
692+
"powerBombs": false,
693+
"gMode": true,
694+
"stuck": "bottom"}
695+
}
696+
]},
697+
{"ridleyKill": {
698+
"powerBombs": false,
699+
"gMode": true,
700+
"stuck": "top"
701+
}}
702+
]},
703+
{"autoReserveTrigger": {}},
704+
{"heatFrames": 520},
705+
{"partialRefill": {"type": "Energy", "limit": 100}}
706+
],
707+
"setsFlags": ["f_DefeatedRidley"],
708+
"note": [
709+
"Enter the room in G-mode, perform a Crystal Flash, then lay an additional Power Bomb, preferably at the top of the room.",
710+
"The Power Bomb will not explode but will continually force Ridley into a corner of the room.",
711+
"If the Power Bomb is laid near the top of the room, then Ridley will be forced into the bottom of the room,",
712+
"making it easy to damage Ridley at the highest possible rate;",
713+
"if the Power Bomb is laid lower, Ridley will be forced to the top of room, and Samus will have to jump repeatedly to bring it on camera.",
714+
"in which case Ridley can still be damaged but more slowly and with some caution needed to avoid invisible fireballs.",
715+
"After reducing Ridley's health to zero, take damage from Ridley or an invisible fireball to trigger auto-reserves and exit G-mode.",
716+
"Then get grabbed by Ridley to finish the fight."
717+
],
718+
"devNote": [
719+
"FIXME: artificial morph with direct G-mode is another option for laying a Power Bomb at the top of the room,",
720+
"by landing on the door ledge on entry (the Morph item would still be needed since the Crystal Flash forces Samus out of being morphed)."
721+
]
722+
},
723+
{
724+
"link": [2, 3],
725+
"name": "G-Mode Ridley with 30 Supers",
726+
"entranceCondition": {
727+
"comeInWithGMode": {
728+
"mode": "any",
729+
"morphed": false,
730+
"mobility": "mobile"
731+
}
732+
},
733+
"requires": [
734+
{"notable": "G-Mode Ridley with 30 Supers"},
735+
"h_heatedGMode",
736+
{"heatFrames": 0},
737+
{"ammo": {"type": "Super", "count": 30}},
738+
{"or": [
739+
{"and": [
740+
"canPauseAbuse",
741+
{"resourceAtMost": [{"type": "Energy", "count": 1}]},
742+
{"partialRefill": {"type": "Energy", "limit": 100}}
743+
]},
744+
"free"
745+
]}
746+
],
747+
"setsFlags": ["f_DefeatedRidley"],
748+
"note": [
749+
"Enter the room in G-mode and quickly kill Ridley with 30 Supers.",
750+
"G-mode protects against heat damage but also causes Ridley's fireballs to be invisible and not move.",
751+
"As long as Ridley is swooping, not many fireballs will be placed, so delaying Ridley from pogoing can be helpful.",
752+
"Once Ridley begins pogoing, it generally becomes unsafe for Samus to jump high because of the risk of touching a fireball.",
753+
"By the end of the fight, projectiles will probably be overloaded, causing Ridley's drops not to spawn;",
754+
"they can be collected by exiting G-mode just before drops spawn, and pause abusing if necessary."
755+
],
756+
"devNote": [
757+
"FIXME: Leaving back through the open door while still in G-Mode is also possible,",
758+
"but difficult to do without touching an invisible fireball."
759+
]
760+
},
580761
{
581762
"id": 9,
582763
"link": [3, 1],
@@ -662,9 +843,7 @@
662843
"name": "Heat Proof Ridley",
663844
"requires": [
664845
"h_heatProof",
665-
{"enemyKill": {
666-
"enemies": [["Ridley"]]
667-
}}
846+
{"ridleyKill": {}}
668847
],
669848
"setsFlags": ["f_DefeatedRidley"]
670849
},
@@ -675,9 +854,7 @@
675854
"requires": [
676855
{"notable": "Ridley without Heat Protection"},
677856
{"heatFrames": 0},
678-
{"enemyKill": {
679-
"enemies": [["Ridley"]]
680-
}}
857+
{"ridleyKill": {}}
681858
],
682859
"setsFlags": ["f_DefeatedRidley"],
683860
"note": "Fight Ridley without immunity to heat damage.",
@@ -698,8 +875,24 @@
698875
"id": 1,
699876
"name": "Ridley without Heat Protection",
700877
"note": "Fight Ridley without immunity to heat damage."
878+
},
879+
{
880+
"id": 2,
881+
"name": "G-Mode Crystal Flash Stuck Ridley",
882+
"note": [
883+
"In G-mode, use a Crystal Flash and an additional Power Bomb to get Ridley stuck in a corner of the room.",
884+
"To end the fight, exit G-mode by using damage from Ridley to trigger auto-reserves."
885+
]
886+
},
887+
{
888+
"id": 3,
889+
"name": "G-Mode Ridley with 30 Supers",
890+
"note": [
891+
"In G-Mode, use 30 Supers to end the fight quickly, carefully avoiding the invisible fireballs that Ridley spawns.",
892+
"Use X-Ray to exit G-Mode precisely at the end of the fight just before drops spawn."
893+
]
701894
}
702895
],
703896
"nextStratId": 27,
704-
"nextNotableId": 2
897+
"nextNotableId": 4
705898
}

schema/m3-requirements.schema.json

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -844,6 +844,29 @@
844844
"type": "string",
845845
"title": "Disable Equipment",
846846
"description": "A requirement to disable a specific item."
847+
},
848+
"ridleyKill": {
849+
"type": "object",
850+
"description": "Fulfilled by killing Ridley, including ammo, energy, and skill requirements.",
851+
"additionalProperties": false,
852+
"properties": {
853+
"powerBombs": {
854+
"type": "boolean",
855+
"default": true,
856+
"description": "Whether Power Bombs can be used during the fight."
857+
},
858+
"gMode": {
859+
"type": "boolean",
860+
"default": false,
861+
"description": "Whether the Ridley kill happens while in G-mode, preventing heat damage while making Ridley's fireballs immobile."
862+
},
863+
"stuck": {
864+
"type": "string",
865+
"enum": [null, "top", "bottom"],
866+
"default": null,
867+
"description": "If applicable, the part of the room where Ridley is stuck."
868+
}
869+
}
847870
}
848871
}
849872
}

tests/asserts/keywords.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -588,6 +588,7 @@ def check_speed_states(strat, err_fn):
588588

589589
keywords["values"] = [
590590
"never",
591+
"free",
591592
"spinjump"
592593
]
593594

0 commit comments

Comments
 (0)