Skip to content

Commit f59bdf7

Browse files
authored
Merge branch 'master' into norfair-remote-runway-1
2 parents d0de1f1 + c7e12b8 commit f59bdf7

43 files changed

Lines changed: 2814 additions & 859 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

helpers.json

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,13 @@
385385
],
386386
"devNote": "1 Power bomb leniency per attempt, 9 leniency attempts."
387387
},
388+
{
389+
"name": "h_CrystalSparkLeniency",
390+
"requires": [
391+
{"ammo": {"type": "PowerBomb","count": 8}}
392+
],
393+
"devNote": "1 Power Bomb leniency per attempt, 8 leniency attempts."
394+
},
388395
{
389396
"name": "h_ElevatorCrystalFlashLeniency",
390397
"requires": [
@@ -1021,6 +1028,23 @@
10211028
{"partialRefill": {"type": "Energy", "limit": 1500}}
10221029
]
10231030
},
1031+
{
1032+
"name": "h_CrystalSpark",
1033+
"requires": [
1034+
{"tech": "canCrystalSpark"},
1035+
"canMidAirMorph",
1036+
"h_CrystalFlash",
1037+
"h_CrystalSparkLeniency",
1038+
{"gainBlueSuit": {}}
1039+
]
1040+
},
1041+
{
1042+
"name": "h_heatedCrystalSpark",
1043+
"requires": [
1044+
"h_heatProof",
1045+
"h_CrystalSpark"
1046+
]
1047+
},
10241048
{
10251049
"name": "h_elevatorCrystalFlash",
10261050
"requires": [
@@ -1545,6 +1569,15 @@
15451569
"Morph will not be a usable alternative to get up very constrained ledges, such as in a morph tunnel.",
15461570
"IBJ is not usable for underwater rooms without Gravity."
15471571
]
1572+
},
1573+
{
1574+
"name": "h_RModeKnockbackSpark",
1575+
"requires": [
1576+
{"partialRefill": {"type": "ReserveEnergy", "limit": 4}},
1577+
{"autoReserveTrigger": {"minReserveEnergy": 1, "maxReserveEnergy": 4}},
1578+
"canRModeKnockbackSpark",
1579+
{"shinespark": {"frames": 4, "excessFrames": 4}}
1580+
]
15481581
}
15491582
]
15501583
}

logicalRequirements.md

Lines changed: 55 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,8 @@ A `shinespark` object represents the need for Samus to spend energy performing a
127127
* _frames_: The duration of the shinespark in frames, assuming the spark is completed without being interrupted by reaching 29 energy. The shinespark frames equals the amount of energy spent, as a shinespark uses 1 energy per frame.
128128
* _excessFrames_: The shinespark duration (in frames) that is not required to complete the objective of the shinespark. Subtracting this from the `frames` defines the lower limit of the shinespark energy cost.
129129

130+
A `shinespark` requirement causes a blue suit to be lost.
131+
130132
#### acidFrames object
131133
An `acidFrames` object represents the need for Samus to spend time (measured in frames) in a pool of acid. This is meant to be converted to a flat health value based on item loadout. The vanilla damage for acid is 6 damage every 4 frames, halved by Varia (3 damage every 4 frames), and halved again by Gravity Suit (3 damage every 8 frames).
132134

@@ -516,13 +518,12 @@ __Example:__
516518

517519
__Additional considerations__
518520

519-
* A `canShineCharge` object implicitly requires the Speed Booster. Energy requirements for the shinespark (if applicable) are specified separately using a `shinespark` object. A `canShineCharge` requirement causes a flash suit to be lost.
521+
* A `canShineCharge` object implicitly requires the Speed Booster item and `canDash` tech. Energy requirements for the shinespark (if applicable) are specified separately using a `shinespark` object. A `canShineCharge` requirement causes a loss of any flash suit or blue suit.
520522

521523
#### getBlueSpeed object
522524

523-
A `getBlueSpeed` object represents the need for Samus to be able to gain blue speed using a specified runway. It is very similar to `canShineCharge`, including the same set of properties, except that `getBlueSpeed` does not involve crouching to enter a shinecharge state for performing a shinespark. Instead, `getBlueSpeed` involves using the blue speed directly, such as to destroy enemies, bomb blocks, or Speed blocks.
525+
A `getBlueSpeed` object represents the need for Samus to be able to gain blue speed using a specified runway. It is very similar to `canShineCharge`, including the same set of properties and the same implicit requirements, except that `getBlueSpeed` does not result in the loss of flash suit (it does still result in loss of blue suit). Instead of crouching to enter a shinecharge state for performing a shinespark, `getBlueSpeed` involves using the blue speed directly, such as to destroy enemies, bomb blocks, or Speed blocks.
524526

525-
Note that a `getBlueSpeed` requirement is compatible with preserving a flash suit, while `canShinecharge` is not.
526527

527528
__Example:__
528529
```json
@@ -534,10 +535,9 @@ __Example:__
534535
}},
535536
```
536537

537-
538538
#### speedBall object
539539

540-
A `speedBall` object represents the need for Samus to be able to gain blue speed and jump into a speedball using a specified runway. It includes a `canSpeedball` tech requirement. Whether a speedball can performed within a given runway length depends on the player's ability to shortcharge as well as to perform a short-hop mockball. The [blue run speed table](strats.md#blue-run-speed-table) describes several tiers of shortcharging skill, their associated runway lengths over which blue speed can be attained, and the resulting run speed. For determining whether a speedball is logically possible, the lowest run speed should be used within the range of what is possible for that skill level; this corresponds to using the "Ideal speed" from the table. The total runway length required can then be computed as follows:
540+
A `speedBall` object represents the need for Samus to be able to gain blue speed and jump into a speedball using a specified runway. It includes a `canSpeedball` requirement. Whether a speedball can performed within a given runway length depends on the player's ability to shortcharge as well as to perform a short-hop mockball. The [blue run speed table](strats.md#blue-run-speed-table) describes several tiers of shortcharging skill, their associated runway lengths over which blue speed can be attained, and the resulting run speed. For determining whether a speedball is logically possible, the lowest run speed should be used within the range of what is possible for that skill level; this corresponds to using the "Ideal speed" from the table. The total runway length required can then be computed as follows:
541541

542542
$$\text{minimum speedball runway} = \text{minimal blue speed runway} + \text{short-hop mockball frames} * \text{mid-air speed}$$
543543

@@ -677,6 +677,52 @@ __Example:__
677677
{"noFlashSuit": {}}
678678
```
679679

680+
#### gainBlueSuit object
681+
682+
A `gainBlueSuit` object represents that Samus gains a blue suit as part of executing this strat. A blue suit is a special state in which Samus remains blue indefinitely, being able to pass through and destroy bomb blocks, Speed blocks, and most enemies. This state can potentially be carried to distant rooms from where the blue suit was gained.
683+
684+
A `gainBlueSuit` object has no properties.
685+
686+
With certain exceptions explained below, a blue suit can generally be carried around by any sequence of strats until some action is taken which would cause the blue suit to be lost. The need to perform actions that cannot preserve a blue suit are indicated by a `noBlueSuit` logical requirement; typically this is expressed indirectly through tech or helpers, most notably `canDash`.
687+
688+
The process of verifying which strats allow preserving a blue suit is not yet complete. Strats which have been checked are indicated by a property `"blueSuitChecked": true`. Any strat without this property should be assumed to be logically unusable for carrying a blue suit, as though the strat had an extra requirement `{"noBlueSuit": {}}` appended. Note that a strat with `"blueSuitChecked": true` may or may not be able to preserve a blue suit, depending on its logical requirements.
689+
690+
__Example:__
691+
```json
692+
{"gainBlueSuit": {}}
693+
```
694+
695+
#### haveBlueSuit object
696+
697+
A `haveBlueSuit` indicates a need to have a blue suit. This does not consume the blue suit.
698+
699+
__Example:__
700+
```json
701+
{"haveBlueSuit": {}}
702+
```
703+
704+
#### blueSuitShinecharge object
705+
706+
A `blueSuitShinecharge` indicates a need to have a blue suit, in order to perform a shinecharge. A strat with `blueSuitShinecharge` should have a subsequent `shinespark` logical requirement to specify the energy loss from shinesparking, and the `shinespark` requirement will result in the loss of the blue suit.
707+
708+
A `blueSuitShinecharge` object has no properties.
709+
710+
__Example:__
711+
```json
712+
{"blueSuitShinecharge": {}}
713+
```
714+
715+
#### noBlueSuit
716+
717+
A `noBlueSuit` indicates a need to perform actions that are incompatible with preserving a blue suit; it therefore requires that Samus not be in a blue suit state.
718+
719+
A `noBlueSuit` object has no properties.
720+
721+
__Example:__
722+
```json
723+
{"noBlueSuit": {}}
724+
```
725+
680726
### Boss requirements
681727

682728
#### Ridley kill
@@ -730,3 +776,7 @@ __Example:__
730776
```json
731777
{"disableEquipment": "HiJump"}
732778
```
779+
780+
While carrying a blue suit, disabling Speed Booster would result in a loss of the blue suit.
781+
782+
Note that the requirement `{"disableEquipment": "ETank"}` occurs in some strats. This is not a functionality of the vanilla game but may be supported in randomizers or other modifications of the game: it means that the player has a way to control the amount of ETanks that are currently active. It is commonly required in R-mode strats where the player may need to farm non-respawning enemies in the room to put energy back into reserves.

region/brinstar/pink/Spore Spawn Farming Room.json

Lines changed: 70 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,8 @@
8484
{"cycleFrames": 20}
8585
],
8686
"farmCycleDrops": [{"enemy": "Zeb", "count": 1}],
87-
"flashSuitChecked": true
87+
"flashSuitChecked": true,
88+
"blueSuitChecked": true
8889
},
8990
{
9091
"id": 19,
@@ -96,6 +97,7 @@
9697
],
9798
"farmCycleDrops": [{"enemy": "Zeb", "count": 2}],
9899
"flashSuitChecked": true,
100+
"blueSuitChecked": true,
99101
"note": [
100102
"Jump back and forth between the left two bug pipes to farm them simultaneously."
101103
],
@@ -115,7 +117,8 @@
115117
"steepUpTiles": 2
116118
}
117119
},
118-
"flashSuitChecked": true
120+
"flashSuitChecked": true,
121+
"blueSuitChecked": true
119122
},
120123
{
121124
"id": 3,
@@ -130,6 +133,7 @@
130133
"leaveShinecharged": {}
131134
},
132135
"flashSuitChecked": true,
136+
"blueSuitChecked": true,
133137
"note": [
134138
"Stand to the right of the right-most bug pipe, and run to the right to gain a shortcharge.",
135139
"Run back to the left, jump over the bug pipes with one jump, and exit through the left door."
@@ -149,6 +153,7 @@
149153
"leaveShinecharged": {}
150154
},
151155
"flashSuitChecked": true,
156+
"blueSuitChecked": true,
152157
"note": [
153158
"Stand to the right of the right-most bug pipe, and run to the right to gain a shortcharge.",
154159
"Run back to the left, Space Jump over the bug pipes, and exit through the left door."
@@ -167,6 +172,7 @@
167172
"leaveWithSpark": {}
168173
},
169174
"flashSuitChecked": true,
175+
"blueSuitChecked": true,
170176
"note": [
171177
"Stand to the right of the right-most bug pipe, and run to the right to gain a shortcharge.",
172178
"Run back to the left, jump over the bug pipes, and shinespark through the left door."
@@ -188,6 +194,7 @@
188194
}
189195
},
190196
"flashSuitChecked": true,
197+
"blueSuitChecked": true,
191198
"devNote": "A variation with 1 more runway tile could be added for if the door at node 2 is unlocked, and the same for the other remote runway strats."
192199
},
193200
{
@@ -208,7 +215,8 @@
208215
"minExtraRunSpeed": "$1.6"
209216
}
210217
},
211-
"flashSuitChecked": true
218+
"flashSuitChecked": true,
219+
"blueSuitChecked": true
212220
},
213221
{
214222
"id": 8,
@@ -223,7 +231,8 @@
223231
}
224232
}
225233
},
226-
"flashSuitChecked": true
234+
"flashSuitChecked": true,
235+
"blueSuitChecked": true
227236
},
228237
{
229238
"id": 9,
@@ -236,7 +245,8 @@
236245
"exitCondition": {
237246
"leaveWithTemporaryBlue": {}
238247
},
239-
"flashSuitChecked": true
248+
"flashSuitChecked": true,
249+
"blueSuitChecked": true
240250
},
241251
{
242252
"id": 10,
@@ -246,21 +256,35 @@
246256
"exitCondition": {
247257
"leaveWithGModeSetup": {}
248258
},
249-
"flashSuitChecked": true
259+
"flashSuitChecked": true,
260+
"blueSuitChecked": true
261+
},
262+
{
263+
"link": [1, 1],
264+
"name": "Gain Blue Suit (R-Mode Spark Interrupt)",
265+
"entranceCondition": {
266+
"comeInWithRMode": {}
267+
},
268+
"requires": [
269+
{"canShineCharge": {"usedTiles": 21, "steepUpTiles": 2, "openEnd": 0}},
270+
"canRModeSparkInterrupt"
271+
]
250272
},
251273
{
252274
"id": 11,
253275
"link": [1, 2],
254276
"name": "Base",
255277
"requires": [],
256-
"flashSuitChecked": true
278+
"flashSuitChecked": true,
279+
"blueSuitChecked": true
257280
},
258281
{
259282
"id": 12,
260283
"link": [2, 1],
261284
"name": "Base",
262285
"requires": [],
263-
"flashSuitChecked": true
286+
"flashSuitChecked": true,
287+
"blueSuitChecked": true
264288
},
265289
{
266290
"id": 13,
@@ -273,7 +297,8 @@
273297
},
274298
"requires": [],
275299
"bypassesDoorShell": true,
276-
"flashSuitChecked": true
300+
"flashSuitChecked": true,
301+
"blueSuitChecked": true
277302
},
278303
{
279304
"id": 14,
@@ -291,7 +316,8 @@
291316
}
292317
},
293318
"bypassesDoorShell": true,
294-
"flashSuitChecked": true
319+
"flashSuitChecked": true,
320+
"blueSuitChecked": true
295321
},
296322
{
297323
"id": 15,
@@ -309,7 +335,8 @@
309335
}
310336
},
311337
"bypassesDoorShell": true,
312-
"flashSuitChecked": true
338+
"flashSuitChecked": true,
339+
"blueSuitChecked": true
313340
},
314341
{
315342
"id": 18,
@@ -341,6 +368,7 @@
341368
},
342369
"bypassesDoorShell": true,
343370
"flashSuitChecked": true,
371+
"blueSuitChecked": true,
344372
"note": [
345373
"Build up to full run speed and speedball towards the left door.",
346374
"With a little luck, Samus will accelerate through the slope tiles and pass under the door."
@@ -358,7 +386,8 @@
358386
"steepUpTiles": 2
359387
}
360388
},
361-
"flashSuitChecked": true
389+
"flashSuitChecked": true,
390+
"blueSuitChecked": true
362391
},
363392
{
364393
"id": 17,
@@ -368,7 +397,8 @@
368397
"exitCondition": {
369398
"leaveWithGModeSetup": {}
370399
},
371-
"flashSuitChecked": true
400+
"flashSuitChecked": true,
401+
"blueSuitChecked": true
372402
},
373403
{
374404
"id": 20,
@@ -387,6 +417,8 @@
387417
"canSlopeSpark",
388418
{"shinespark": {"frames": 4, "excessFrames": 4}}
389419
],
420+
"flashSuitChecked": true,
421+
"blueSuitChecked": true,
390422
"note": [
391423
"After shinecharging, lure a Zeb and use it to slopespark on the first slope right of the pipe."
392424
],
@@ -411,12 +443,37 @@
411443
"position": "bottom"
412444
}
413445
},
446+
"flashSuitChecked": true,
447+
"blueSuitChecked": true,
414448
"note": [
415449
"After shinecharging, lure a Zeb and use it to slopespark on the first slope right of the pipe."
416450
],
417451
"devNote": [
418452
"No leniency is given as this is a farm room and the Zebs do little damage, even suitless."
419453
]
454+
},
455+
{
456+
"link": [2, 2],
457+
"name": "Gain Blue Suit (R-Mode Spark Interrupt)",
458+
"entranceCondition": {
459+
"comeInWithRMode": {}
460+
},
461+
"requires": [
462+
{"canShineCharge": {"usedTiles": 21, "steepUpTiles": 2, "openEnd": 0}},
463+
"canRModeSparkInterrupt"
464+
],
465+
"flashSuitChecked": true,
466+
"blueSuitChecked": true
467+
},
468+
{
469+
"link": [2, 2],
470+
"name": "Gain Blue Suit (Crystal Spark)",
471+
"requires": [
472+
{"canShineCharge": {"usedTiles": 21, "steepUpTiles": 2, "openEnd": 0}},
473+
"h_CrystalSpark"
474+
],
475+
"flashSuitChecked": true,
476+
"blueSuitChecked": true
420477
}
421478
],
422479
"notables": [

0 commit comments

Comments
 (0)