Skip to content

Commit 1d09363

Browse files
authored
Merge branch 'master' into g-maridia
2 parents 6143e81 + 48a9b48 commit 1d09363

57 files changed

Lines changed: 882 additions & 209 deletions

Some content is hidden

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

logicalRequirements.md

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -206,13 +206,18 @@ __Example:__
206206
```
207207

208208
#### cycleFrames object
209-
A `cycleFrames` object represents the need for Samus to spend time (measured as an amount of in-game frames) in a room as part of a farming cycle. Including a `cycleFrames` requirement is mandatory in farming strats with a [`farmCycleDrops`](strats.md#farm-cycle-drops) property. The `cycleFrames` can be used to determine how many cycles of a farm a player can reasonably be expected to perform, based on an assumed amount of "patience".
209+
A `cycleFrames` object represents the need for Samus to spend time (measured as an amount of in-game frames) in a room as part of a farming cycle. Including a `cycleFrames` requirement is mandatory in farming strats with a [`farmCycleDrops`](strats.md#farm-cycle-drops) property. The `cycleFrames` can be used to determine how many cycles of a farm a player can reasonably be expected to perform, based on an assumed amount of "patience". The frame counts listed tend to be somewhat optimized, so it recommended to apply a lenience factor based on difficulty.
210210

211211
__Example:__
212212
```json
213213
{"cycleFrames": 100}
214214
```
215215

216+
#### simpleCycleFrames object
217+
218+
A `simpleCycleFrames` object represents the need for Samus to spend time (measured as an amount of in-game frames) in a room as part of a farming cycle. It is identical to `cycleFrames` except that the time spent in `simpleCycleFrames` is intended to be invariant, not affected by leniency. This can be useful in cases that involve doing something simple for a significant amount of time, such as standing in place while farming bugs.
219+
220+
216221
#### heatFrames object
217222
A `heatFrames` object represents the need for Samus to spend time (measured in frames) in a heated room. This is meant to be converted to a flat health value based on item loadout. The vanilla damage for heated rooms is 1 damage every 4 frames, negated by Varia or Gravity Suit. The effect of Gravity suit on heat damage may be modified by randomizers. A `heatFrames` object implicitly includes a requirement `{"or": ["h_heatProof", "canHeatRun"]}`.
218223

@@ -223,7 +228,11 @@ __Example:__
223228

224229
__Additional considerations__
225230

226-
Much like the other logical elements that represent environmental frame damage, the heat frame counts listed in this project might not be strictly "perfect" play, but they are very much unforgiving. Their most significant value is to provide relative lengths to different heat runs. It's recommended to apply a leniency factor to those, possibly as an option that can vary by difficulty.
231+
Much like the other logical elements that represent environmental frame damage, the heat frame counts listed in this project might not be strictly "perfect" play, but they are very much unforgiving. Their most significant value is to provide relative lengths to different heat runs. It's recommended to apply a lenience factor to those, possibly as an option that can vary by difficulty.
232+
233+
#### simpleHeatFrames object
234+
235+
A `simpleHeatFrames` object represents the need for Samus to spend time (measured in frames) in a heated room. It is identical to `heatFrames` except that the time spent in `simpleHeatFrames` is intended to be invariant, not affected by leniency. This can be useful in cases that involve doing something simple for a significant amount of time, such as standing in place or running through a long hallway.
227236

228237
#### heatFramesWithEnergyDrops object
229238

@@ -242,6 +251,22 @@ __Example:__
242251
}}
243252
```
244253

254+
#### lavaFramesWithEnergyDrops object
255+
256+
A `lavaFramesWithEnergyDrops` object represents the need for Samus to spend time in lava, but with the possibility of offsetting some of the lava damage using energy drops from enemies. Any lava damage is logically applied before the energy gain, so Samus must be able to survive the heat before picking up the drops. Any energy gain is logically capped to not exceed the heat damage, so this logical requirement cannot result in a net energy gain.
257+
258+
The actual amount of energy gained typically depends on RNG and also on which ammo types are completely full. The drop probabilities for each enemy type is given in the [enemies](enemies/main.json) file. Because of the randomness involved, the logical amount of energy gain is open to various interpretations. For example, the mean, the median, or a lower confidence limit could be used.
259+
260+
__Example:__
261+
```json
262+
{"lavaFramesWithEnergyDrops": {
263+
"frames": 200,
264+
"drops": [
265+
{"enemy": "Fune", "count": 1}
266+
]
267+
}}
268+
```
269+
245270
#### gravitylessHeatFrames object
246271
A `gravitylessHeatFrames` object represents Samus in a heated environment with Gravity Suit turned off, even if it is available. The number of frames here needs to be represented as `heatFrames` without the reduction effects given by Gravity Suit.
247272

region/brinstar/blue/Blue Brinstar Energy Tank Room.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -888,6 +888,7 @@
888888
"note": "Falling down the shaft and breaking the crumble block does not require Morph."
889889
},
890890
{
891+
"id": 69,
891892
"link": [2, 2],
892893
"name": "Geemer, Skree, and Reo Farm",
893894
"requires": [
@@ -1446,6 +1447,6 @@
14461447
]
14471448
}
14481449
],
1449-
"nextStratId": 69,
1450+
"nextStratId": 70,
14501451
"nextNotableId": 8
14511452
}

region/brinstar/blue/Morph Ball Room.json

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -364,12 +364,15 @@
364364
}
365365
},
366366
{
367+
"id": 73,
367368
"link": [1, 1],
368369
"name": "Sidehopper Farm",
369370
"requires": [
370371
"h_ZebesIsAwake",
371372
"canPrepareForNextRoom",
372-
{"resetRoom": {"nodes": [1]}},
373+
{"resetRoom": {
374+
"nodes": [1]
375+
}},
373376
{"or": [
374377
{"and": [
375378
"Plasma",
@@ -426,9 +429,7 @@
426429
],
427430
"resetsObstacles": ["A", "B", "D"],
428431
"clearsObstacles": ["C"],
429-
"farmCycleDrops": [
430-
{"enemy": "Sidehopper", "count": 3}
431-
]
432+
"farmCycleDrops": [{"enemy": "Sidehopper", "count": 3}]
432433
},
433434
{
434435
"id": 10,
@@ -1401,6 +1402,6 @@
14011402
}
14021403
],
14031404
"notables": [],
1404-
"nextStratId": 73,
1405+
"nextStratId": 74,
14051406
"nextNotableId": 1
14061407
}

region/brinstar/green/Brinstar Pre-Map Room.json

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,19 @@
127127
},
128128
"flashSuitChecked": true
129129
},
130+
{
131+
"id": 27,
132+
"link": [1, 1],
133+
"name": "Zeela Farm",
134+
"requires": [
135+
{"resetRoom": {
136+
"nodes": [1]
137+
}},
138+
{"cycleFrames": 120}
139+
],
140+
"farmCycleDrops": [{"enemy": "Zeela", "count": 1}],
141+
"resetsObstacles": ["A"]
142+
},
130143
{
131144
"id": 2,
132145
"link": [1, 1],
@@ -433,12 +446,30 @@
433446
{"resetRoom": {
434447
"nodes": [2]
435448
}},
436-
{"partialRefill": {"type": "Energy", "limit": 240}},
437-
{"partialRefill": {"type": "Missile", "limit": 20}},
438-
{"partialRefill": {"type": "Super", "limit": 4}}
449+
{"cycleFrames": 320},
450+
{"or": [
451+
"canDodgeWhileShooting",
452+
"Plasma",
453+
{"and": [
454+
"Wave",
455+
"Spazer"
456+
]},
457+
{"and": [
458+
"Ice",
459+
"Wave"
460+
]},
461+
{"and": [
462+
"Ice",
463+
"Spazer"
464+
]}
465+
]}
439466
],
440467
"resetsObstacles": ["A"],
441-
"flashSuitChecked": true
468+
"flashSuitChecked": true,
469+
"farmCycleDrops": [
470+
{"enemy": "Zeela", "count": 2},
471+
{"enemy": "Sm. Sidehopper", "count": 1}
472+
]
442473
},
443474
{
444475
"id": 24,
@@ -472,6 +503,6 @@
472503
}
473504
],
474505
"notables": [],
475-
"nextStratId": 27,
506+
"nextStratId": 28,
476507
"nextNotableId": 1
477508
}

region/brinstar/green/Early Supers Room.json

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -272,8 +272,9 @@
272272
"link": [1, 1],
273273
"name": "Zeb Farm",
274274
"requires": [
275-
{"refill": ["Energy", "Missile", "Super"]}
275+
{"cycleFrames": 105}
276276
],
277+
"farmCycleDrops": [{"enemy": "Zeb", "count": 1}],
277278
"flashSuitChecked": true
278279
},
279280
{
@@ -802,6 +803,48 @@
802803
"leaveWithTemporaryBlue": {}
803804
}
804805
},
806+
{
807+
"id": 47,
808+
"link": [2, 2],
809+
"name": "Waver and Sidehopper Farm",
810+
"requires": [
811+
{"resetRoom": {
812+
"nodes": [2]
813+
}},
814+
{"or": [
815+
"canWalljump",
816+
"canCrouchJump"
817+
]},
818+
{"or": [
819+
{"and": [
820+
"Plasma",
821+
{"cycleFrames": 600}
822+
]},
823+
{"and": [
824+
"ScrewAttack",
825+
{"cycleFrames": 700}
826+
]},
827+
{"and": [
828+
{"or": [
829+
"Wave",
830+
"Spazer"
831+
]},
832+
{"cycleFrames": 750}
833+
]},
834+
{"and": [
835+
"canDodgeWhileShooting",
836+
{"cycleFrames": 1050}
837+
]}
838+
]}
839+
],
840+
"farmCycleDrops": [
841+
{"enemy": "Waver", "count": 4},
842+
{"enemy": "Sm. Sidehopper", "count": 3}
843+
],
844+
"clearsObstacles": ["A"],
845+
"resetsObstacles": ["B"],
846+
"flashSuitChecked": true
847+
},
805848
{
806849
"id": 30,
807850
"link": [2, 2],
@@ -922,6 +965,6 @@
922965
]
923966
}
924967
],
925-
"nextStratId": 47,
968+
"nextStratId": 48,
926969
"nextNotableId": 4
927970
}

region/brinstar/green/Etecoon Energy Tank Room.json

Lines changed: 60 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -966,6 +966,7 @@
966966
]
967967
},
968968
{
969+
"id": 90,
969970
"link": [3, 3],
970971
"name": "X-Mode, Leave Shinecharged",
971972
"requires": [
@@ -985,7 +986,7 @@
985986
"By holding an angle button, it is possible turn around in X-mode without losing dash speed.",
986987
"Arm pumps can be used to get close to the ledge before shinecharging, to leave with more frames remaining."
987988
]
988-
},
989+
},
989990
{
990991
"id": 79,
991992
"link": [3, 3],
@@ -1040,6 +1041,39 @@
10401041
],
10411042
"devNote": "This does not require canRiskPermanentLossOfAccess if Samus returns through the crumble blocks."
10421043
},
1044+
{
1045+
"id": 91,
1046+
"link": [3, 3],
1047+
"name": "Zebbo and Beetom Farm",
1048+
"requires": [
1049+
"Morph",
1050+
{"resetRoom": {
1051+
"nodes": [3]
1052+
}},
1053+
{"cycleFrames": 630},
1054+
{"or": [
1055+
{"enemyKill": {
1056+
"enemies": [["Beetom", "Beetom"]],
1057+
"explicitWeapons": ["ScrewAttack", "Missile", "PowerBomb"]
1058+
}},
1059+
{"and": [
1060+
"h_useMorphBombs",
1061+
{"or": [
1062+
"Ice",
1063+
"canTrickyDodgeEnemies"
1064+
]},
1065+
{"cycleFrames": 400}
1066+
]}
1067+
]}
1068+
],
1069+
"clearsObstacles": ["A"],
1070+
"resetsObstacles": ["B"],
1071+
"flashSuitChecked": true,
1072+
"farmCycleDrops": [
1073+
{"enemy": "Beetom", "count": 2},
1074+
{"enemy": "Zebbo", "count": 1}
1075+
]
1076+
},
10431077
{
10441078
"id": 75,
10451079
"link": [3, 4],
@@ -1549,25 +1583,39 @@
15491583
{"resetRoom": {
15501584
"nodes": [4]
15511585
}},
1552-
{"enemyKill": {
1553-
"enemies": [["Beetom"]]
1554-
}},
1555-
{"refill": ["Energy", "Missile", "Super", "PowerBomb"]}
1586+
{"cycleFrames": 530},
1587+
{"or": [
1588+
{"enemyKill": {
1589+
"enemies": [["Beetom", "Beetom"]],
1590+
"explicitWeapons": ["ScrewAttack", "Missile", "PowerBomb"]
1591+
}},
1592+
{"and": [
1593+
{"or": [
1594+
"Ice",
1595+
"canTrickyDodgeEnemies"
1596+
]},
1597+
"h_useMorphBombs"
1598+
]}
1599+
]}
15561600
],
15571601
"clearsObstacles": ["A"],
15581602
"resetsObstacles": ["B"],
15591603
"flashSuitChecked": true,
1560-
"devNote": ["FIXME: Node 3 could be used to reset the room, with additional requirements."]
1604+
"farmCycleDrops": [
1605+
{"enemy": "Beetom", "count": 2},
1606+
{"enemy": "Zebbo", "count": 2}
1607+
]
15611608
},
15621609
{
15631610
"id": 52,
15641611
"link": [4, 4],
15651612
"name": "Zebbo Farm",
15661613
"requires": [
15671614
{"obstaclesCleared": ["A"]},
1568-
{"refill": ["Energy", "Missile", "Super"]}
1615+
{"cycleFrames": 115}
15691616
],
1570-
"flashSuitChecked": true
1617+
"flashSuitChecked": true,
1618+
"farmCycleDrops": [{"enemy": "Zebbo", "count": 1}]
15711619
},
15721620
{
15731621
"id": 80,
@@ -1589,6 +1637,7 @@
15891637
"devNote": "It is possible to do this with a Beetom, avoiding the tricky jump, but we will ignore that here."
15901638
},
15911639
{
1640+
"id": 92,
15921641
"link": [4, 4],
15931642
"name": "X-Mode, Leave With Spark",
15941643
"requires": [
@@ -1604,9 +1653,9 @@
16041653
"note": [
16051654
"While in X-mode on the thorns, Samus' will be flashing as i-frames periodically refresh;",
16061655
"by timing the shinecharge and X-Ray release to happen soon after i-frames refresh,",
1607-
"a second thorn hit can be avoided."
1656+
"a second thorn hit can be avoided."
16081657
]
1609-
},
1658+
},
16101659
{
16111660
"id": 88,
16121661
"link": [4, 5],
@@ -2053,7 +2102,7 @@
20532102
]
20542103
}
20552104
],
2056-
"nextStratId": 90,
2105+
"nextStratId": 93,
20572106
"nextNotableId": 8,
20582107
"devNote": ["FIXME: add a strat to take temporary blue from the top to the bottom-right."]
20592108
}

0 commit comments

Comments
 (0)