From 73c64521b36cfce66ef2ffea66ce62922ed7d4d7 Mon Sep 17 00:00:00 2001 From: Brent Kerby Date: Sat, 12 Jul 2025 16:33:53 -0600 Subject: [PATCH 1/4] Refine Volcano Room --- region/norfair/east/Volcano Room.json | 93 ++++++++++++++++++++++----- schema/m3-room.schema.json | 4 ++ 2 files changed, 81 insertions(+), 16 deletions(-) diff --git a/region/norfair/east/Volcano Room.json b/region/norfair/east/Volcano Room.json index 5a3eb516b8..c9fec79493 100644 --- a/region/norfair/east/Volcano Room.json +++ b/region/norfair/east/Volcano Room.json @@ -108,14 +108,21 @@ "exitCondition": { "leaveWithRunway": { "length": 8, - "openEnd": 1 + "openEnd": 1, + "heated": false } - } + }, + "unlocksDoors": [ + {"types": ["ammo"], "requires": []} + ] }, { "id": 2, "link": [1, 1], "name": "Crystal Flash", + "entranceCondition": { + "comeInNormally": {} + }, "requires": [ {"resetRoom": { "nodes": [1] @@ -123,7 +130,7 @@ "h_CrystalFlash" ], "flashSuitChecked": true, - "devNote": "Resetting the room through node 1 ensures that there is no heat." + "devNote": "The comeInNormally entrance condition ensures that there is no heat." }, { "id": 3, @@ -147,6 +154,14 @@ {"lavaFrames": 60} ]} ]} + ], + "exitCondition": { + "leaveNormally": {} + }, + "unlocksDoors": [ + {"types": ["missiles"], "requires": [{"lavaFrames": 80}]}, + {"types": ["super"], "requires": []}, + {"types": ["powerbomb"], "requires": [{"lavaFrames": 60}]} ] }, { @@ -160,17 +175,25 @@ {"and": [ "canCarefulJump", "canMockball", - {"lavaFrames": 180} + {"lavaFrames": 160} ]}, {"lavaFrames": 220} ]}, {"or": [ {"and": [ "canSpaceJumpWaterBounce", - {"lavaFrames": 120} + {"lavaFrames": 60} ]}, {"lavaFrames": 150} ]} + ], + "exitCondition": { + "leaveNormally": {} + }, + "unlocksDoors": [ + {"types": ["missiles"], "requires": [{"lavaFrames": 80}]}, + {"types": ["super"], "requires": []}, + {"types": ["powerbomb"], "requires": [{"lavaFrames": 150}]} ] }, { @@ -190,11 +213,18 @@ "types": ["missiles"], "requires": [{"heatFrames": 20}] }, + { + "types": ["super"], + "requires": [] + }, { "types": ["powerbomb"], "requires": [{"heatFrames": 60}] } - ] + ], + "exitCondition": { + "leaveNormally": {} + } }, { "id": 6, @@ -211,7 +241,8 @@ "exitCondition": { "leaveWithRunway": { "length": 8, - "openEnd": 1 + "openEnd": 1, + "heated": true } }, "unlocksDoors": [ @@ -238,7 +269,24 @@ {"heatFrames": 35} ]}, {"heatFrames": 405} - ] + ], + "unlocksDoors": [ + { + "types": ["missiles"], + "requires": [{"heatFrames": 20}] + }, + { + "types": ["super"], + "requires": [] + }, + { + "types": ["powerbomb"], + "requires": [{"heatFrames": 60}] + } + ], + "exitCondition": { + "leaveNormally": {} + } }, { "id": 10, @@ -337,6 +385,23 @@ ]}, {"heatFrames": 1000} ], + "unlocksDoors": [ + { + "types": ["missiles"], + "requires": [{"heatFrames": 20}] + }, + { + "types": ["super"], + "requires": [] + }, + { + "types": ["powerbomb"], + "requires": [{"heatFrames": 60}] + } + ], + "exitCondition": { + "leaveNormally": {} + }, "flashSuitChecked": true, "note": [ "Enter the morph tunnel then exit G-mode. Shooting the shot block off screen can be done by jumping and shooting up or with Grapple or a Power Bomb.", @@ -353,13 +418,12 @@ "entranceCondition": { "comeInNormally": {} }, - "requires": [ - {"heatFrames": 60} - ], + "requires": [], "exitCondition": { "leaveWithRunway": { "length": 6, - "openEnd": 1 + "openEnd": 1, + "heated": true } }, "unlocksDoors": [{"types": ["ammo"], "requires": []}] @@ -374,10 +438,7 @@ "requires": [ "h_heatedCrystalFlash" ], - "flashSuitChecked": true, - "devNote": [ - "When coming from 1: A lava proof CF could CF at 1, otherwise going through this door should be less damage than staying in Lava." - ] + "flashSuitChecked": true } ], "notables": [], diff --git a/schema/m3-room.schema.json b/schema/m3-room.schema.json index 90b9513495..85c47de9ca 100644 --- a/schema/m3-room.schema.json +++ b/schema/m3-room.schema.json @@ -1009,6 +1009,10 @@ "type": "string", "pattern": "^\\$[0-9|A-F]\\.[0-9|A-F]+$", "description": "Minimum extra run speed (in hexadecimal) with which it is possible to leave with this condition." + }, + "heated": { + "type": "boolean", + "description": "Whether the runway is used in a heated environment. This only needs to be specified if the room is only sometimes heated (e.g. Volcano Room)." } } }, From d5240871798ba82474d146076aae750c55bc74e7 Mon Sep 17 00:00:00 2001 From: Brent Kerby Date: Mon, 14 Jul 2025 16:34:21 -0600 Subject: [PATCH 2/4] Update region/norfair/east/Volcano Room.json Co-authored-by: Michael McKenzie --- region/norfair/east/Volcano Room.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/region/norfair/east/Volcano Room.json b/region/norfair/east/Volcano Room.json index c9fec79493..b3af056e09 100644 --- a/region/norfair/east/Volcano Room.json +++ b/region/norfair/east/Volcano Room.json @@ -177,7 +177,7 @@ "canMockball", {"lavaFrames": 160} ]}, - {"lavaFrames": 220} + {"lavaFrames": 200} ]}, {"or": [ {"and": [ From 0473c93b9d479b4cd41231adf55ef6b52a253983 Mon Sep 17 00:00:00 2001 From: Brent Kerby Date: Mon, 14 Jul 2025 20:08:11 -0600 Subject: [PATCH 3/4] feedback updates --- logicalRequirements.md | 16 +++++++++ region/norfair/east/Volcano Room.json | 51 +++++++++++++++++++++++++-- schema/m3-requirements.schema.json | 31 ++++++++++++++++ 3 files changed, 96 insertions(+), 2 deletions(-) diff --git a/logicalRequirements.md b/logicalRequirements.md index f831b3590b..d023151250 100644 --- a/logicalRequirements.md +++ b/logicalRequirements.md @@ -242,6 +242,22 @@ __Example:__ }} ``` +#### lavaFramesWithEnergyDrops object + +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. + +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. + +__Example:__ +```json +{"lavaFramesWithEnergyDrops": { + "frames": 200, + "drops": [ + {"enemy": "Fune", "count": 1} + ] +}} +``` + #### gravitylessHeatFrames object 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. diff --git a/region/norfair/east/Volcano Room.json b/region/norfair/east/Volcano Room.json index b3af056e09..c3f8dea3b4 100644 --- a/region/norfair/east/Volcano Room.json +++ b/region/norfair/east/Volcano Room.json @@ -162,6 +162,10 @@ {"types": ["missiles"], "requires": [{"lavaFrames": 80}]}, {"types": ["super"], "requires": []}, {"types": ["powerbomb"], "requires": [{"lavaFrames": 60}]} + ], + "devNote": [ + "FIXME: A leaveWithRunway variation could be added, but it would require Speed Booster to be disabled,", + "which would need new schema support in order to properly match entrance conditions in the next room." ] }, { @@ -175,14 +179,20 @@ {"and": [ "canCarefulJump", "canMockball", - {"lavaFrames": 160} + {"lavaFrames": 155} ]}, {"lavaFrames": 200} ]}, {"or": [ {"and": [ "canSpaceJumpWaterBounce", - {"lavaFrames": 60} + {"or": [ + {"and": [ + "canPreciseSpaceJump", + {"lavaFrames": 35} + ]}, + {"lavaFrames": 60} + ]} ]}, {"lavaFrames": 150} ]} @@ -196,6 +206,43 @@ {"types": ["powerbomb"], "requires": [{"lavaFrames": 150}]} ] }, + { + "link": [1, 2], + "name": "Farm Funes and Suitless Lava Dive", + "requires": [ + "canSuitlessLavaDive", + "canFarmWhileShooting", + {"enemyKill": {"enemies": [["Fune", "Fune"]], "explicitWeapons": ["PowerBomb"]}}, + "canMockball", + {"lavaFramesWithEnergyDrops": { + "frames": 120, + "drops": [{"enemy": "Fune", "count": 1}] + }}, + {"lavaFrames": 35}, + {"or": [ + {"and": [ + "canSpaceJumpWaterBounce", + {"or": [ + {"and": [ + "canPreciseSpaceJump", + {"lavaFrames": 35} + ]}, + {"lavaFrames": 60} + ]} + ]}, + {"lavaFrames": 150} + ]} + ], + "exitCondition": { + "leaveNormally": {} + }, + "unlocksDoors": [ + {"types": ["missiles"], "requires": [{"lavaFrames": 80}]}, + {"types": ["super"], "requires": []}, + {"types": ["powerbomb"], "requires": [{"lavaFrames": 150}]} + ], + "devNote": "FIXME: a Gravity version of this could be added." + }, { "id": 5, "link": [2, 1], diff --git a/schema/m3-requirements.schema.json b/schema/m3-requirements.schema.json index 00d6a0d3c4..a8d6b8fcf2 100644 --- a/schema/m3-requirements.schema.json +++ b/schema/m3-requirements.schema.json @@ -309,6 +309,37 @@ "title": "Gravityless Lava Frames", "description": "Fulfilled by spending an amount of energy that corresponds to spending a number of frames in lava, with Gravity Suit turned off, even if available." }, + "lavaFramesWithEnergyDrops": { + "type": "object", + "title": "Lava Frames With Energy Drops", + "description": "Fulfilled by spending an amount of energy that corresponds to spending a number of frames in a lava, with some or all damage offset by collecting energy drops.", + "additionalProperties": false, + "properties": { + "frames": { + "type": "integer", + "minimum": 1 + }, + "drops": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "enemy": { + "type": "string", + "title": "Enemy Name", + "description": "The name of an enemy that drops can be collected from, as found in the enemies file." + }, + "count": { + "type": "integer", + "title": "Count", + "description": "The number of drops that can be collected from this enemy by executing this strat." + } + } + } + } + } + }, "samusEaterFrames": { "type": "integer", "minimum": 1, From 365c8c3ccb9f607e7b776a1650ea5197e203b80c Mon Sep 17 00:00:00 2001 From: Brent Kerby Date: Mon, 14 Jul 2025 21:20:18 -0600 Subject: [PATCH 4/4] add L->R tankless spacejump strat --- region/norfair/east/Volcano Room.json | 33 +++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/region/norfair/east/Volcano Room.json b/region/norfair/east/Volcano Room.json index c3f8dea3b4..ac9efbf841 100644 --- a/region/norfair/east/Volcano Room.json +++ b/region/norfair/east/Volcano Room.json @@ -335,6 +335,39 @@ "leaveNormally": {} } }, + { + "link": [2, 1], + "name": "Come in Running, Space Jump", + "entranceCondition": { + "comeInRunning": { + "minTiles": 2, + "speedBooster": "any" + } + }, + "requires": [ + "Morph", + "SpaceJump", + "canMockball", + {"heatFrames": 390} + ], + "unlocksDoors": [ + { + "types": ["missiles"], + "requires": [{"heatFrames": 20}] + }, + { + "types": ["super"], + "requires": [] + }, + { + "types": ["powerbomb"], + "requires": [{"heatFrames": 60}] + } + ], + "exitCondition": { + "leaveNormally": {} + } + }, { "id": 10, "link": [2, 1],