Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions logicalRequirements.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Heat damage

Every room except this one has heat+lava damage simultaneously. In SMZ3, Gravity grants full protection from lava and Varia full protection from heat. So I think the usage would be running both lavaFramesWithEnergyDrops and HeatFrameWithEnergyDrops in parallel so the randomizer picks which is better for the situation.


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.

Expand Down
175 changes: 158 additions & 17 deletions region/norfair/east/Volcano Room.json
Original file line number Diff line number Diff line change
Expand Up @@ -108,22 +108,29 @@
"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]
}},
"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,
Expand All @@ -147,6 +154,18 @@
{"lavaFrames": 60}
]}
]}
],
"exitCondition": {
"leaveNormally": {}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FIXME: LeaveWithRunway using gravity and no Speedbooster.

},
"unlocksDoors": [
{"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."
]
},
{
Expand All @@ -160,19 +179,70 @@
{"and": [
"canCarefulJump",
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In races, this mockball hasn't been worth attempting.
But also a short hop mockball is more like a trickyJump.

"canMockball",
{"lavaFrames": 180}
{"lavaFrames": 155}
]},
{"lavaFrames": 220}
{"lavaFrames": 200}
]},
{"or": [
{"and": [
"canSpaceJumpWaterBounce",
{"lavaFrames": 120}
{"or": [
{"and": [
"canPreciseSpaceJump",
{"lavaFrames": 35}
]},
{"lavaFrames": 60}
]}
]},
{"lavaFrames": 150}
]}
],
"exitCondition": {
"leaveNormally": {}
},
"unlocksDoors": [
{"types": ["missiles"], "requires": [{"lavaFrames": 80}]},
{"types": ["super"], "requires": []},
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This added lava frames when spacejumping. The fastest way I saw with a blue door was to do an aim down shot to open the door.

{"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],
Expand All @@ -190,11 +260,18 @@
"types": ["missiles"],
"requires": [{"heatFrames": 20}]
},
{
"types": ["super"],
"requires": []
},
{
"types": ["powerbomb"],
"requires": [{"heatFrames": 60}]
}
]
],
"exitCondition": {
"leaveNormally": {}
}
},
{
"id": 6,
Expand All @@ -211,7 +288,8 @@
"exitCondition": {
"leaveWithRunway": {
"length": 8,
"openEnd": 1
"openEnd": 1,
"heated": true
}
},
"unlocksDoors": [
Expand All @@ -238,7 +316,57 @@
{"heatFrames": 35}
]},
{"heatFrames": 405}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SpaceJump + Come in Running + Mockball can be done without an etank.

]
],
"unlocksDoors": [
{
"types": ["missiles"],
"requires": [{"heatFrames": 20}]
},
{
"types": ["super"],
"requires": []
},
{
"types": ["powerbomb"],
"requires": [{"heatFrames": 60}]
}
],
"exitCondition": {
"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,
Expand Down Expand Up @@ -337,6 +465,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.",
Expand All @@ -353,13 +498,12 @@
"entranceCondition": {
"comeInNormally": {}
},
"requires": [
{"heatFrames": 60}
],
"requires": [],
"exitCondition": {
"leaveWithRunway": {
"length": 6,
"openEnd": 1
"openEnd": 1,
"heated": true
}
},
"unlocksDoors": [{"types": ["ammo"], "requires": []}]
Expand All @@ -374,10 +518,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": [],
Expand Down
31 changes: 31 additions & 0 deletions schema/m3-requirements.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
4 changes: 4 additions & 0 deletions schema/m3-room.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -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)."
}
}
},
Expand Down