From 70a63370e1945e2ec7a9a46c0f2c101cbb86f42a Mon Sep 17 00:00:00 2001 From: Brent Kerby Date: Tue, 15 Jul 2025 14:04:23 -0600 Subject: [PATCH 1/2] Red Brinstar farms --- helpers.json | 21 +++ .../brinstar/red/Alpha Power Bomb Room.json | 15 ++ region/brinstar/red/Below Spazer.json | 18 +- region/brinstar/red/Beta Power Bomb Room.json | 23 +++ region/brinstar/red/Caterpillar Room.json | 175 ++++++++++++++++-- region/brinstar/red/Hellway.json | 20 +- .../red/Red Brinstar Fireflea Room.json | 31 +++- region/brinstar/red/Red Tower.json | 88 ++++++++- region/brinstar/red/Skree Boost Room.json | 19 ++ 9 files changed, 374 insertions(+), 36 deletions(-) diff --git a/helpers.json b/helpers.json index 02eead07b4..df2f4ed029 100644 --- a/helpers.json +++ b/helpers.json @@ -285,6 +285,27 @@ { "name": "h_ShinesparksCostEnergy", "requires": [] + }, + { + "name": "h_equipmentScreenCycleFrames", + "requires": [ + {"cycleFrames": 300} + ], + "note": [ + "This represents the amount of time that could be required in the pause menu to equip or unequip items." + ], + "devNote": [ + "This is not perfectly precise as the time spent in the pause menu can vary,", + "depending on which items are collected and which items are being equipped or unequipped.", + "It is intended as a typical value for common actions such as performing a Gravity jump or mid-air Spring Ball jump." + ] + }, + { + "name": "h_doubleEquipmentScreenCycleFrames", + "requires": [ + "h_equipmentScreenCycleFrames", + "h_equipmentScreenCycleFrames" + ] } ] }, diff --git a/region/brinstar/red/Alpha Power Bomb Room.json b/region/brinstar/red/Alpha Power Bomb Room.json index ad9b57d57c..437e3fa321 100644 --- a/region/brinstar/red/Alpha Power Bomb Room.json +++ b/region/brinstar/red/Alpha Power Bomb Room.json @@ -302,6 +302,21 @@ } } }, + { + "link": [1, 1], + "name": "Boyon Farm", + "requires": [ + "canBePatient", + "h_useMorphBombs", + {"resetRoom": {"nodes": [1]}}, + {"cycleFrames": 4930} + ], + "clearsObstacles": ["A"], + "resetsObstacles": ["B"], + "farmCycleDrops": [ + {"enemy": "Boyon", "count": 4} + ] + }, { "id": 9, "link": [1, 1], diff --git a/region/brinstar/red/Below Spazer.json b/region/brinstar/red/Below Spazer.json index db5431937f..10aac0fe78 100644 --- a/region/brinstar/red/Below Spazer.json +++ b/region/brinstar/red/Below Spazer.json @@ -504,11 +504,19 @@ "link": [2, 2], "name": "Cacatac Farm", "requires": [ - {"resetRoom": { - "nodes": [1, 2] - }}, - {"partialRefill": {"type": "Energy", "limit": 100}}, - {"partialRefill": {"type": "Super", "limit": 5}} + {"or": [ + {"and": [ + {"resetRoom": {"nodes": [1]}}, + {"cycleFrames": 300} + ]}, + {"and": [ + {"resetRoom": {"nodes": [2]}}, + {"cycleFrames": 240} + ]} + ]} + ], + "farmCycleDrops": [ + {"enemy": "Cacatac", "count": 1} ] }, { diff --git a/region/brinstar/red/Beta Power Bomb Room.json b/region/brinstar/red/Beta Power Bomb Room.json index 593196b2bc..ee7d53c69a 100644 --- a/region/brinstar/red/Beta Power Bomb Room.json +++ b/region/brinstar/red/Beta Power Bomb Room.json @@ -351,6 +351,29 @@ "FIXME: It is possible to use artificial morph to lure the hoppers to the left to then use most of the runway out of the room." ] }, + { + "link": [1, 1], + "name": "Sidehopper Farm", + "requires": [ + {"resetRoom": {"nodes": [1]}}, + {"or": [ + {"and": [ + "ScrewAttack", + {"cycleFrames": 240} + ]}, + {"and": [ + "canDodgeWhileShooting", + "Plasma", + {"cycleFrames": 380} + ]} + ]} + ], + "clearsObstacles": ["A"], + "resetsObstacles": ["B"], + "farmCycleDrops": [ + {"enemy": "Sidehopper", "count": 2} + ] + }, { "id": 3, "link": [1, 1], diff --git a/region/brinstar/red/Caterpillar Room.json b/region/brinstar/red/Caterpillar Room.json index 2ef56f14c5..10c8c3e321 100644 --- a/region/brinstar/red/Caterpillar Room.json +++ b/region/brinstar/red/Caterpillar Room.json @@ -1358,14 +1358,90 @@ "link": [3, 3], "name": "Zero Farm", "requires": [ - {"resetRoom": { - "nodes": [2, 3] - }}, - {"refill": ["PowerBomb"]} + {"or": [ + {"and": [ + {"resetRoom": {"nodes": [3]}}, + {"cycleFrames": 290} + ]}, + {"and": [ + {"resetRoom": {"nodes": [2]}}, + {"cycleFrames": 460} + ]}, + {"and": [ + {"resetRoom": {"nodes": [4]}}, + {"cycleFrames": 660}, + {"or": [ + "canWalljump", + "HiJump", + {"and": [ + "canDoubleBombJump", + {"cycleFrames": 140} + ]}, + {"and": [ + "canSpringBallJumpMidAir", + {"cycleFrames": 40}, + "h_doubleEquipmentScreenCycleFrames" + ]} + ]} + ]}, + {"and": [ + {"resetRoom": {"nodes": [1]}}, + {"cycleFrames": 840}, + {"or": [ + "canWalljump", + "HiJump", + "SpaceJump", + {"and": [ + "canDoubleBombJump", + {"cycleFrames": 280} + ]}, + {"and": [ + "canSpringBallJumpMidAir", + {"cycleFrames": 80}, + "h_doubleEquipmentScreenCycleFrames", + "h_doubleEquipmentScreenCycleFrames" + ]} + ]} + ]}, + {"and": [ + {"resetRoom": {"nodes": [6]}}, + {"cycleFrames": 1900}, + {"or": [ + "canWalljump", + "HiJump", + "SpaceJump", + {"and": [ + "canDoubleBombJump", + {"cycleFrames": 280} + ]}, + {"and": [ + "canSpringBallJumpMidAir", + {"cycleFrames": 80}, + "h_doubleEquipmentScreenCycleFrames", + "h_doubleEquipmentScreenCycleFrames" + ]} + ]} + ]} + ]}, + {"or": [ + "Wave", + "Plasma", + {"and": [ + "Spazer", + {"cycleFrames": 60} + ]}, + {"and": [ + "ScrewAttack", + {"cycleFrames": 70} + ]}, + {"cycleFrames": 130} + ]} ], "clearsObstacles": ["B"], "resetsObstacles": ["A"], - "devNote": "FIXME: Other nodes could be used to reset the room, with additional requirements." + "farmCycleDrops": [ + {"enemy": "Zero", "count": 3} + ] }, { "id": 55, @@ -1689,13 +1765,61 @@ "link": [4, 4], "name": "Cacatac Farm", "requires": [ - {"resetRoom": { - "nodes": [4] - }}, - {"refill": ["Energy", "Super"]} + {"or": [ + {"and": [ + {"resetRoom": { + "nodes": [4] + }}, + {"cycleFrames": 210} + ]}, + {"and": [ + {"or": [ + {"and": [ + {"resetRoom": { + "nodes": [1, 2] + }}, + {"cycleFrames": 400} + ]}, + {"and": [ + {"resetRoom": { + "nodes": [3] + }}, + {"cycleFrames": 860} + ]}, + {"and": [ + {"resetRoom": { + "nodes": [6] + }}, + {"cycleFrames": 1470} + ]} + ]}, + {"or": [ + "canWalljump", + "HiJump", + "SpaceJump", + {"and": [ + "canDoubleBombJump", + {"cycleFrames": 140} + ]}, + {"and": [ + "canSpringBallJumpMidAir", + {"cycleFrames": 40}, + "h_doubleEquipmentScreenCycleFrames" + ]} + ]} + ]} + ]}, + {"or": [ + "Wave", + "Spazer", + "Plasma", + {"cycleFrames": 40} + ]} ], "resetsObstacles": ["A", "B"], - "devNote": "FIXME: Other nodes could be used to reset the room, with additional requirements." + "farmCycleDrops": [ + {"enemy": "Cacatac", "count": 2} + ] }, { "id": 74, @@ -1920,18 +2044,37 @@ "requires": [ {"ammo": {"type": "Super", "count": 1}}, "Morph", + {"resetRoom": { + "nodes": [5] + }}, + {"cycleFrames": 1340}, {"or": [ "canWalljump", "HiJump", - "SpaceJump" + "SpaceJump", + {"and": [ + "canDoubleBombJump", + {"cycleFrames": 280} + ]}, + {"and": [ + "canSpringBallJumpMidAir", + {"cycleFrames": 80}, + "h_doubleEquipmentScreenCycleFrames", + "h_doubleEquipmentScreenCycleFrames" + ]} ]}, - {"resetRoom": { - "nodes": [5] - }}, - {"refill": ["Energy", "PowerBomb"]}, - {"partialRefill": {"type": "Super", "limit": 10}} + {"or": [ + "Wave", + "Spazer", + "Plasma", + {"cycleFrames": 250} + ]} ], "resetsObstacles": ["A", "B"], + "farmCycleDrops": [ + {"enemy": "Cacatac", "count": 2}, + {"enemy": "Zero", "count": 3} + ], "devNote": "It is possible to roll off of the platform above to avoid a mid-air morph." }, { diff --git a/region/brinstar/red/Hellway.json b/region/brinstar/red/Hellway.json index c084325ab9..698bb6a8f4 100644 --- a/region/brinstar/red/Hellway.json +++ b/region/brinstar/red/Hellway.json @@ -87,7 +87,25 @@ "link": [1, 1], "name": "Zebbo Farm", "requires": [ - {"refill": ["Energy", "Missile", "Super"]} + {"cycleFrames": 160} + ], + "farmCycleDrops": [ + {"enemy": "Zebbo", "count": 1} + ] + }, + { + "link": [1, 1], + "name": "Double Zebbo Farm", + "requires": [ + "canTrickyDodgeEnemies", + {"cycleFrames": 160} + ], + "farmCycleDrops": [ + {"enemy": "Zebbo", "count": 2} + ], + "note": [ + "Stand on the platform between the right-most two Zebbo spawners,", + "and walk back and forth to farm them simultaneously." ] }, { diff --git a/region/brinstar/red/Red Brinstar Fireflea Room.json b/region/brinstar/red/Red Brinstar Fireflea Room.json index c5dc327880..23b99b3bcb 100644 --- a/region/brinstar/red/Red Brinstar Fireflea Room.json +++ b/region/brinstar/red/Red Brinstar Fireflea Room.json @@ -165,6 +165,20 @@ } } }, + { + "link": [1, 1], + "name": "Waver Farm", + "requires": [ + {"resetRoom": { + "nodes": [1] + }}, + {"cycleFrames": 1150} + ], + "resetsObstacles": ["A"], + "farmCycleDrops": [ + {"enemy": "Waver", "count": 1} + ] + }, { "id": 4, "link": [1, 1], @@ -633,21 +647,22 @@ { "id": 34, "link": [2, 2], - "name": "Fireflea Farm", + "name": "Firefleas and Waver Farm", "requires": [ {"resetRoom": { "nodes": [2] }}, - {"refill": ["PowerBomb"]}, + {"cycleFrames": 630}, {"or": [ - {"and": [ - "canDodgeWhileShooting", - {"refill": ["Energy"]} - ]}, - {"partialRefill": {"type": "Energy", "limit": 260}} + "canDodgeWhileShooting", + {"cycleFrames": 600} ]} ], - "resetsObstacles": ["A"] + "resetsObstacles": ["A"], + "farmCycleDrops": [ + {"enemy": "Fireflea", "count": 4}, + {"enemy": "Waver", "count": 1} + ] }, { "id": 35, diff --git a/region/brinstar/red/Red Tower.json b/region/brinstar/red/Red Tower.json index 6c7e6e0399..abc0c03ef0 100644 --- a/region/brinstar/red/Red Tower.json +++ b/region/brinstar/red/Red Tower.json @@ -342,15 +342,60 @@ { "id": 1, "link": [1, 1], - "name": "Geega and Beetom Farm", + "name": "Beetom Farm", "requires": [ + {"or": [ + {"and": [ + {"resetRoom": {"nodes": [1]}}, + {"cycleFrames": 570} + ]}, + {"and": [ + {"resetRoom": {"nodes": [1]}}, + "ScrewAttack", + {"cycleFrames": 480} + ]}, + {"and": [ + {"resetRoom": {"nodes": [3, 4]}}, + "HiJump", + "canWalljump", + {"cycleFrames": 800} + ]}, + {"and": [ + {"resetRoom": {"nodes": [5]}}, + {"notable": "Hero Shot"}, + {"or": [ + {"and": [ + "ScrewAttack", + "canConsecutiveWalljump", + {"cycleFrames": 1080} + ]}, + {"and": [ + "canStaggeredWalljump", + {"cycleFrames": 1770} + ]} + ]} + ]} + ]}, {"or": [ "ScrewAttack", "h_useMorphBombs", - {"resourceCapacity": [{"type": "Missile", "count": 1}]}, - {"resourceCapacity": [{"type": "Super", "count": 1}]} - ]}, - {"refill": ["Energy", "Missile", "Super", "PowerBomb"]} + "h_usePowerBomb", + {"and": [ + {"or": [ + {"resourceCapacity": [{"type": "Missile", "count": 1}]}, + {"resourceCapacity": [{"type": "Super", "count": 1}]} + ]}, + {"cycleFrames": 500} + ]} + ]} + ], + "farmCycleDrops": [ + {"enemy": "Beetom", "count": 1} + ], + "resetsObstacles": ["A", "B"], + "devNote": [ + "Using a Power Bomb to farm the Beetom is only useful if Power Bomb drops are modified to give more than 1.", + "FIXME: Other options for resetting the room at the top and bottom nodes are possible." ] }, { @@ -358,7 +403,21 @@ "link": [1, 1], "name": "Geega Farm", "requires": [ - {"refill": ["Energy", "Missile", "Super"]} + {"cycleFrames": 140} + ], + "farmCycleDrops": [ + {"enemy": "Geega", "count": 1} + ] + }, + { + "link": [1, 1], + "name": "Double Geega Farm", + "requires": [ + "canDodgeWhileShooting", + {"cycleFrames": 200} + ], + "farmCycleDrops": [ + {"enemy": "Geega", "count": 2} ] }, { @@ -1237,6 +1296,23 @@ } } }, + { + "link": [2, 2], + "name": "Beetom Farm", + "requires": [ + {"resetRoom": {"nodes": [2]}}, + {"cycleFrames": 300}, + "h_usePowerBomb" + ], + "farmCycleDrops": [ + {"enemy": "Beetom", "count": 1} + ], + "clearsObstacles": ["A"], + "resetsObstacles": ["B"], + "devNote": [ + "This strat is only useful if Power Bomb drops are modified to give more than 1." + ] + }, { "id": 43, "link": [2, 2], diff --git a/region/brinstar/red/Skree Boost Room.json b/region/brinstar/red/Skree Boost Room.json index 9c36e136e6..5de2842010 100644 --- a/region/brinstar/red/Skree Boost Room.json +++ b/region/brinstar/red/Skree Boost Room.json @@ -410,6 +410,25 @@ }, "bypassesDoorShell": true }, + { + "link": [2, 2], + "name": "Skree Farm", + "requires": [ + {"or": [ + {"and": [ + {"resetRoom": {"nodes": [1]}}, + {"cycleFrames": 380} + ]}, + {"and": [ + {"resetRoom": {"nodes": [2]}}, + {"cycleFrames": 220} + ]} + ]} + ], + "farmCycleDrops": [ + {"enemy": "Skree", "count": 2} + ] + }, { "id": 19, "link": [2, 2], From b05cc9eb3dfdd8f964cfb4bd5795fcadfcaabc65 Mon Sep 17 00:00:00 2001 From: Brent Kerby Date: Thu, 17 Jul 2025 10:16:12 -0600 Subject: [PATCH 2/2] feedback updates --- region/brinstar/red/Caterpillar Room.json | 203 ++++++++++++++-------- region/brinstar/red/Hellway.json | 2 +- 2 files changed, 136 insertions(+), 69 deletions(-) diff --git a/region/brinstar/red/Caterpillar Room.json b/region/brinstar/red/Caterpillar Room.json index 10c8c3e321..03da7a9e62 100644 --- a/region/brinstar/red/Caterpillar Room.json +++ b/region/brinstar/red/Caterpillar Room.json @@ -725,6 +725,114 @@ "Let the Zero lead through the morph tunnel or wait for the it to get very close to Samus before touching the scroll block at the exit." ] }, + { + "link": [2, 2], + "name": "Zero Farm", + "requires": [ + {"or": [ + {"and": [ + {"resetRoom": {"nodes": [2]}}, + {"cycleFrames": 460} + ]}, + {"and": [ + {"resetRoom": {"nodes": [4]}}, + {"cycleFrames": 660}, + {"or": [ + "canWalljump", + "HiJump", + {"and": [ + "canDoubleBombJump", + {"cycleFrames": 140} + ]}, + {"and": [ + "canSpringBallJumpMidAir", + {"cycleFrames": 40}, + "h_doubleEquipmentScreenCycleFrames" + ]} + ]} + ]}, + {"and": [ + {"resetRoom": {"nodes": [1]}}, + {"cycleFrames": 840}, + {"or": [ + "canWalljump", + "HiJump", + "SpaceJump", + {"and": [ + "canDoubleBombJump", + {"cycleFrames": 140}, + {"or": [ + {"cycleFrames": 140}, + "h_crouchJumpDownGrab" + ]} + ]}, + {"and": [ + "canSpringBallJumpMidAir", + {"cycleFrames": 40}, + "h_doubleEquipmentScreenCycleFrames", + {"or": [ + "h_crouchJumpDownGrab", + {"and": [ + {"cycleFrames": 40}, + "h_doubleEquipmentScreenCycleFrames" + ]} + ]} + ]} + ]} + ]}, + {"and": [ + {"resetRoom": {"nodes": [6]}}, + {"cycleFrames": 1900}, + {"or": [ + "canWalljump", + "HiJump", + "SpaceJump", + {"and": [ + "canDoubleBombJump", + {"cycleFrames": 140}, + {"or": [ + {"cycleFrames": 140}, + "h_crouchJumpDownGrab" + ]} + ]}, + {"and": [ + "canSpringBallJumpMidAir", + {"cycleFrames": 40}, + "h_doubleEquipmentScreenCycleFrames", + {"or": [ + "h_crouchJumpDownGrab", + {"and": [ + {"cycleFrames": 40}, + "h_doubleEquipmentScreenCycleFrames" + ]} + ]} + ]} + ]} + ]} + ]}, + {"or": [ + "Wave", + "Plasma", + {"and": [ + "Spazer", + {"cycleFrames": 60} + ]}, + {"and": [ + "ScrewAttack", + {"cycleFrames": 70} + ]}, + {"cycleFrames": 130} + ]} + ], + "clearsObstacles": ["B"], + "resetsObstacles": ["A"], + "farmCycleDrops": [ + {"enemy": "Zero", "count": 3} + ], + "devNote": [ + "Resetting at the bottom of the room (node 3) is covered in a separate 3->3 strat." + ] + }, { "id": 27, "link": [2, 2], @@ -1358,83 +1466,29 @@ "link": [3, 3], "name": "Zero Farm", "requires": [ + {"resetRoom": {"nodes": [3]}}, {"or": [ {"and": [ - {"resetRoom": {"nodes": [3]}}, - {"cycleFrames": 290} + "Grapple", + {"cycleFrames": 265} ]}, {"and": [ - {"resetRoom": {"nodes": [2]}}, - {"cycleFrames": 460} + "Wave", + {"cycleFrames": 230} ]}, {"and": [ - {"resetRoom": {"nodes": [4]}}, - {"cycleFrames": 660}, - {"or": [ - "canWalljump", - "HiJump", - {"and": [ - "canDoubleBombJump", - {"cycleFrames": 140} - ]}, - {"and": [ - "canSpringBallJumpMidAir", - {"cycleFrames": 40}, - "h_doubleEquipmentScreenCycleFrames" - ]} - ]} + "Plasma", + {"cycleFrames": 230} ]}, - {"and": [ - {"resetRoom": {"nodes": [1]}}, - {"cycleFrames": 840}, - {"or": [ - "canWalljump", - "HiJump", - "SpaceJump", - {"and": [ - "canDoubleBombJump", - {"cycleFrames": 280} - ]}, - {"and": [ - "canSpringBallJumpMidAir", - {"cycleFrames": 80}, - "h_doubleEquipmentScreenCycleFrames", - "h_doubleEquipmentScreenCycleFrames" - ]} - ]} - ]}, - {"and": [ - {"resetRoom": {"nodes": [6]}}, - {"cycleFrames": 1900}, - {"or": [ - "canWalljump", - "HiJump", - "SpaceJump", - {"and": [ - "canDoubleBombJump", - {"cycleFrames": 280} - ]}, - {"and": [ - "canSpringBallJumpMidAir", - {"cycleFrames": 80}, - "h_doubleEquipmentScreenCycleFrames", - "h_doubleEquipmentScreenCycleFrames" - ]} - ]} - ]} - ]}, - {"or": [ - "Wave", - "Plasma", {"and": [ "Spazer", - {"cycleFrames": 60} + {"cycleFrames": 260} ]}, {"and": [ "ScrewAttack", - {"cycleFrames": 70} + {"cycleFrames": 290} ]}, - {"cycleFrames": 130} + {"cycleFrames": 350} ]} ], "clearsObstacles": ["B"], @@ -2054,13 +2108,23 @@ "SpaceJump", {"and": [ "canDoubleBombJump", - {"cycleFrames": 280} + {"cycleFrames": 140}, + {"or": [ + {"cycleFrames": 140}, + "h_crouchJumpDownGrab" + ]} ]}, {"and": [ "canSpringBallJumpMidAir", - {"cycleFrames": 80}, + {"cycleFrames": 40}, "h_doubleEquipmentScreenCycleFrames", - "h_doubleEquipmentScreenCycleFrames" + {"or": [ + "h_crouchJumpDownGrab", + {"and": [ + {"cycleFrames": 40}, + "h_doubleEquipmentScreenCycleFrames" + ]} + ]} ]} ]}, {"or": [ @@ -2075,7 +2139,10 @@ {"enemy": "Cacatac", "count": 2}, {"enemy": "Zero", "count": 3} ], - "devNote": "It is possible to roll off of the platform above to avoid a mid-air morph." + "devNote": [ + "It is possible to roll off of the platform above to avoid a mid-air morph.", + "FIXME: add a Cac-only farm since it can be done with fewer requirements." + ] }, { "id": 87, diff --git a/region/brinstar/red/Hellway.json b/region/brinstar/red/Hellway.json index 698bb6a8f4..31a926f279 100644 --- a/region/brinstar/red/Hellway.json +++ b/region/brinstar/red/Hellway.json @@ -97,7 +97,7 @@ "link": [1, 1], "name": "Double Zebbo Farm", "requires": [ - "canTrickyDodgeEnemies", + "canDodgeWhileShooting", {"cycleFrames": 160} ], "farmCycleDrops": [