Difference between revisions of "Oxygen"
m |
m (Fixed "1 L O2" to "1 Unit O2" to be aligned with the code) |
||
(22 intermediate revisions by 9 users not shown) | |||
Line 1: | Line 1: | ||
− | {{ | + | [[File:Oxygen Tank OxyTank01.jpg|thumb|[[Oxygen Tank]]s are the primary storage mechanism for Oxygen.]] |
+ | Oxygen is vital resource for the player required for them to breathe in [[Survival Mode|Survival]], without access to oxygen either via their suit or an atmosphere they will die. | ||
+ | |||
+ | == Vital Statistics == | ||
+ | Game version 1.196 | ||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | |'''Player oxygen consumption rate'''||style="text-align:right;"|{{#vardefineecho:playerOxygenConsumption|0.063}} L/s || This is a flat rate regardless of activity. | ||
+ | |- | ||
+ | |'''[[Oxygen Farm]] max production rate'''||style="text-align:right;"| {{#show:Mod:Vanilla/CubeBlock/LargeBlockOxygenFarm|?MaxOutputPerSecond}} || Requires sunlight. | ||
+ | |- | ||
+ | |'''[[Large Ship|Large grid]] [[Oxygen Generator|O2/H2 Generator]] max production rate'''||style="text-align:right;"| {{formatnum:{{#expr: {{#show:Mod:Vanilla/CubeBlock/OxygenGenerator|?IceConsumptionPerSecond#-n}} * {{#show:Mod:Vanilla/CubeBlock/OxygenGenerator|?IceToGasRatio#-n}} round 2}}}} L/s || {{#show:Mod:Vanilla/CubeBlock/OxygenGenerator|?IceToGasRatio}} of [[ice]] | ||
+ | |- | ||
+ | |'''[[Small Ship|Small grid]] [[Oxygen Generator|O2/H2 Generator]] max production rate'''||style="text-align:right;"| {{formatnum:{{#expr: {{#show:Mod:Vanilla/CubeBlock/OxygenGeneratorSmall|?IceConsumptionPerSecond#-n}} * {{#show:Mod:Vanilla/CubeBlock/OxygenGeneratorSmall|?IceToGasRatio#-n}} round 2}}}} L/s || {{#show:Mod:Vanilla/CubeBlock/OxygenGeneratorSmall|?IceToGasRatio}} of [[ice]] | ||
+ | |- | ||
+ | |'''Internal suit oxygen tank capacity'''||style="text-align:right;"|{{#vardefineecho:playerOxygenMax|60}} L | ||
+ | |''{{timespan|{{#expr: {{#var:playerOxygenMax}}/{{#var:playerOxygenConsumption}}}}}}'' worth of breathing. | ||
+ | |- | ||
+ | |'''[[Oxygen Bottle]] item'''||style="text-align:right;"|{{#vardefineecho:oxygenMax|{{#show:Mod:Vanilla/Item/OxygenBottle|?GasCapacity#-n}}}} L | ||
+ | |''{{timespan|{{#expr: {{#var:oxygenMax}}/{{#var:playerOxygenConsumption}}}}}}'' worth of breathing. | ||
+ | |- | ||
+ | |'''[[Large Ship|Large grid]] [[Oxygen Tank]]'''||style="text-align:right;"|{{formatnum:{{#vardefineecho:oxygenMax|{{#show:Mod:Vanilla/CubeBlock/OxygenTank|?GasCapacity#-n}}}}}} L | ||
+ | |''{{timespan|{{#expr: {{#var:oxygenMax}}/{{#var:playerOxygenConsumption}}}}}}'' worth of breathing. | ||
+ | |- | ||
+ | |'''[[Small Ship|Small grid]] [[Oxygen Tank]]'''||style="text-align:right;"|{{formatnum:{{#vardefineecho:oxygenMax|{{#show:Mod:Vanilla/CubeBlock/OxygenTankSmall|?GasCapacity#-n}}}}}} L | ||
+ | |''{{timespan|{{#expr: {{#var:oxygenMax}}/{{#var:playerOxygenConsumption}}}}}}'' worth of breathing. | ||
+ | |- | ||
+ | |'''1{{m3}} of 100% room pressure'''||style="text-align:right;"|1 Unit {{O2}} || About ''{{#expr: 1 / {{#var:playerOxygenConsumption}} round 0}} seconds'' worth of breathing. | ||
+ | |- | ||
+ | |'''[[Large Ship|Large grid]] block of air'''||style="text-align:right;"| {{#expr: 2.5 ^ 3}} L || ''{{timespan| {{#expr: 2.5 ^ 3 / {{#var:playerOxygenConsumption}}}}}}'' worth of breathing. | ||
+ | |- | ||
+ | |'''[[Small Ship|Small grid]] block of air'''||style="text-align:right;"| {{#expr: 0.5 ^ 3}} L || About ''{{#expr: 0.5 ^ 3 / {{#var:playerOxygenConsumption}} round 0}} seconds'' worth of breathing. | ||
+ | |- | ||
+ | |'''[[Large Ship|Large grid]] [[Oxygen Generator|O2/H2 Generator]]''' ({{#show:Mod:Vanilla/CubeBlock/OxygenGenerator|?InventoryVolume#L}} [[Ice]]) | ||
+ | |style="text-align:right;"| {{formatnum:{{#expr: {{#vardefineecho:oxygenMax|{{#expr:{{#show:Mod:Vanilla/CubeBlock/OxygenGenerator|?InventoryVolume#-n}} / {{#show:Mod:Vanilla/Ore/Ice|?Volume#-n}} * {{#show:Mod:Vanilla/CubeBlock/OxygenGenerator|?IceToGasRatio#-n}}}}}}round 0}}}} L|| ''{{timespan|{{#expr: {{#var:oxygenMax}} / {{#var:playerOxygenConsumption}}}}}}'' of breathing. | ||
+ | |- | ||
+ | |'''[[Small Ship|Small grid]] [[Oxygen Generator|O2/H2 Generator]]''' ({{#show:Mod:Vanilla/CubeBlock/OxygenGeneratorSmall|?InventoryVolume#L}} [[Ice]]) | ||
+ | |style="text-align:right;"| {{formatnum:{{#expr: {{#vardefineecho:oxygenMax|{{#expr:{{#show:Mod:Vanilla/CubeBlock/OxygenGeneratorSmall|?InventoryVolume#-n}} / {{#show:Mod:Vanilla/Ore/Ice|?Volume#-n}} * {{#show:Mod:Vanilla/CubeBlock/OxygenGeneratorSmall|?IceToGasRatio#-n}}}}}}round 0}}}} L|| ''{{timespan|{{#expr: {{#var:oxygenMax}} / {{#var:playerOxygenConsumption}}}}}}'' of breathing. | ||
+ | |} | ||
+ | |||
== Production == | == Production == | ||
− | Oxygen is created when an [[Oxygen Generator]] processes [[Ice]]. Ice is found in some Asteroids, much the same as any other kind of ore. | + | Oxygen is created when an [[Oxygen Generator]] processes [[Ice]]. Ice is found in some Asteroids and planets, much the same as any other kind of ore. [[Oxygen Farm]]s also generate small amounts of oxygen from sunlight only, but require only electricity and no ice. |
− | [[Oxygen Farm]]s also generate small amounts of | + | |
+ | Oxygen can also be harvested from a [[Planet]]'s atmosphere via an [[Air Vent]], [[Planet/Earth|Earth]] and [[Planet/Alien|Alien]] planet both have varying degrees of oxygen found in their atmosphere. While Ice itself can also be harvested directly from a planet in the form of visible bodies of water which in reality is Ice and can be processed for oxygen and [[hydrogen]]. Earth especially being very rich with oxygen, these planets have infinite amounts of oxygen available. | ||
+ | |||
+ | == Storage == | ||
+ | |||
+ | Oxygen can be stored in [[Oxygen Tank]]s (on ships and stations), in [[Oxygen Bottle]]s (items), and in a space engineer's suit. | ||
+ | |||
+ | A player's suit's oxygen is depleted while the player is wearing a helmet. The remaining oxygen capacity is displayed in the left status panel of the player's HUD in [%], as is the current status of the helmet (if worn or not). A suit's stored oxygen is replenished from a [[Medical Room]], a [[Cockpit]], or a [[Fighter Cockpit]] attached to a [[Conveyor]] system with an [[Oxygen Tank]] or oxygen source (generator or farm). If there is an [[Oxygen Bottle]] in a player's inventory when the suit's oxygen level drops below 30% then oxygen will be transferred from the bottle(s) to refill the suit's oxygen storage. | ||
+ | |||
+ | == Consumption == | ||
− | == | + | === Space Engineer === |
− | A | + | A player consumes oxygen at a rate of 0.063 O<sub>2</sub> / s. This oxygen is taken from the player's suit while their helmet is on (worn) or from the pressurized room they are in while their helmet is off. If a player is sitting with their helmet is off in a cockpit with conveyor access to oxygen then oxygen will be consumed out of the conveyor system (assuming there is an available oxygen tank). |
− | + | If their suit's oxygen is ever depleted then the character will slowly asphyxiate while their helmet is on. A player with their helmet off while not in a pressurized room or a cockpit with conveyor access to oxygen will also asphyxiate. Asphyxiation results in death if an oxygen supply is not restored immediately. | |
+ | * The player can even suffocate in their suit while standing in a pressurized room, if they do not take off their helmet before the suit's internal O<sub>2</sub> tank is depleted! | ||
− | + | === Atmosphere === | |
− | + | An airtight room (larger than a single block) of a [[small ship]], [[large ship]] or [[station]] can be pressurized with oxygen by an [[Air Vent]] with conveyor access to oxygen. The air vent can also depressurize such a room, taking with oxygen out and returning it to the conveyor system (if storage is available). A Graph traversal / flood-fill algorithm is used to fill the enclosed space with oxygen. The algorithm traverses through the volumetric grid and checks for enclosed and open areas. 1 stored unit of oxygen is 1m<sup>3</sup> and blocks with air (no matter what shape) take 15.625 units of oxygen to fill for 1 [[Large ship|large]] block of air, while a [[Small ship|small]] block of hold 0.125 units of oxygen. | |
− | + | ||
− | + | The minimum safe pressure for a character to have their helmet off and breathe in a pressurized room is 50%, if the character is in a room with some oxygen but not enough to reach 50% pressure they'll take 1 hitpoint of damage per second; Even if this room's pressure is tiny any pressure above 0% will do. If the character is in a room with no oxygen whatsoever (or a room that cannot be pressurized due to a leak exposed to space) or in open space such as an exterior - they will take 7 hitpoints of damage per second. A player in a suit without any oxygen will take the full 7 hitpoints of damage per second and has ~14 seconds to find oxygen or they will die. | |
− | + | ||
− | + | Assuming you are in an airtight, pressurized room entirely full of oxygen: | |
− | + | * Welding an airtight block into its final build stage destroys the air that was in its block. | |
− | + | * Grinding an airtight block down from its final build stage to anywhere under it will expand the room by one block, dropping room pressure. | |
+ | * Closing a [[door]] destroys the air that was in its block. | ||
+ | * Welding a block or closing a door creating a 1-block "room"/space will destroy the air that was in that space. | ||
+ | * Losing a fully pressurized large-grid block of air destroys 15.625 units of oxygen. | ||
+ | |||
+ | == Notes on Oxygen Mechanics == | ||
+ | |||
+ | * Oxygen propagation between producers (farms, generators) and consumers (tanks, vents, cockpits, medical rooms) is determined by conveyor rules, but conveyors themselves do not store, contain, or otherwise mutilate oxygen. Oxygen travels instantly between these endpoints. | ||
+ | * Oxygen is drained uniformly from all non-stockpiling tanks. | ||
+ | * Consumers are sorted by priority and, if any oxygen production remains, the rest is uniformly distributed among tanks. Oxygen consumption priority is defined by block type, but currently all consuming blocks appear to have a priority of 0. | ||
+ | * Non-stockpiling tanks are constantly rebalanced with a delay-over-time, subtracting oxygen from some tanks and adding an equal amount to others. | ||
+ | * There's such a thing as 'oxygenated room' object, which contains oxygen block structures, all of which are identical in function (and in volume!) regardless of what actual block occupies the grid coordinate. | ||
+ | * The authority on how much oxygen exists is the room object, rather than the block. Rooms are pressurized and depressurized as a whole, blocks track the room's oxygen level and adjust to match it over time. Oxygen, once released into the environment becomes 'air', for lack of a better word -- a considerably different entity, which is still called 'oxygen' in the code -- and individual block's state does not affect the state of the room until rooms are completely recalculated. Vents directly affect the room oxygen amount, rather than the individual block position they're in; they create 'air' and consume 'oxygen', or vice versa when depressurizing. Medical rooms directly fill spacesuits by consuming oxygen from tanks and adding an equal amount to the suit store. | ||
+ | * Blocks do have individual air level values and constantly adjust this value to the value that would be average for the entire room based on it's size and total air level. The entire room is supposed to have the pressure equalized in 1.5 seconds -- this is a constant. Notice that this is done by each block individually, i.e. air does not move between blocks -- when a block adds or removes air, it does not consider anything except it's current air level and the room's total level and number of blocks in it. | ||
+ | * Air is consumed by characters by directly subtracting it out of the room amount, rather than the current block they're in. Which room they're in is identified by looking for the closest oxygen block structure that is part of a pressurized (i.e. enclosed) 'room'. The code looks at a character's position (a point at your feet) and tries to find which block in which grid to consider by determining which block center the character point is closest to; the first room that is enclosed should be picked, but the order the blocks are considered is dependent on grid orientation, which is why it's possible to stand in an oxygenated room next to a door leading out to vacuum and still suffocate. | ||
+ | * Rooms are defined by propagating block neighbours in all cardinal directions, kind of like flood fill algorithm in a 2D paint program, but in 3D with quirks. Blocks diagonally from each other are not neighbours and rooms do not propagate through corners. Some interesting points about this: | ||
+ | ** Rooms are temporary structures, they are regularly recalculated when blocks are added to the grid, removed from it, or door state changes. | ||
+ | ** The presence or absence of vents does not affect whether something is considered a room or not. The splitting logic works on the entire grid, starting from a particular corner and trying to create new rooms when others end up until the grid is done. | ||
+ | ** State of being pressurized, which is the word the code uses to mean an enclosed room, is actually completely distinct from the actual oxygen amount. | ||
+ | ** Two types of airtight blocks exist - those that are airtight as a whole, so all their walls are airtight, and others. The algorithm considers the direction it arrived to the block from when determining whether the block is airtight for the purposes of enclosing a room, and uses some complicated logic based on mount points (the points on a block where it can connect to other blocks). Blocks with build stages are only airtight when on the last build stage, regardless. | ||
+ | * When rooms are recalculated, should a previously existing room be split in two by a closing door, the pressure will be retained in both of the new rooms from the room that previously occupied the same blocks in the grid. This is done by adding up the total amount of air in every individual block that a newly created room contains if a room previously existed in the same grid block coordinates. This is the only time the amount of air within an individual block seems to matter for anything. Should the total amount end up larger than what the room can contain based on the number of blocks in it, it will be discarded, so building a block destroys air, rather than displacing it. | ||
+ | * Notice that a closed door is airtight from both directions. When closed, any air that it might have contained is discarded since it's not part of either room it separates anymore -- so yes, closing doors destroys air in that block, every time it happens. Closing a door to a room in which pressure has yet to equalize across all blocks can sometimes result in not destroying air. | ||
+ | * Only rooms which end up larger than exactly one block are considered to exist. If the room size calculation ends up with a room exactly one block large then it will be discarded along with every oxygen block that would be part of it. If you end up in a completely enclosed 1x1x1 room with a vent, you will suffocate anyway. | ||
+ | * The amount of oxygen it takes to fill a room to 100% depends on the room's grid size, it's exactly a cube of that grid size. The grid size itself though is not exactly an obvious value and depends on a lot of code that has nothing to do with oxygen, but comments seem to indicate meters are meant to be the unit, so one unit of oxygen should result in exactly one cubic meter of air, and one large block should contain exactly (2.5m)<sup>3</sup> = 15.625m<sup>3</sup> of air. | ||
+ | * There are no efficiency values surrounding pressurization or depressurization. Air vents are 100% efficient, creating exactly the same number of oxygen units that they just sucked out of the room air. But since 'air' is not kept track of as cleanly as inventory oxygen is, it may still end up not being 100% efficient. 'air' gets created and destroyed pretty frequently, particularly so if you open or close any doors while blocks don't have an even pressure. Closing and opening doors inside environment that is not evenly pressurized can destroy much more air than just closing a door does if you do it before 1.5 seconds elapse. | ||
+ | * There is no evidence grinding or welding in a room alters room air content directly, but it alters blocks themselves and thereby forces a room recalculation, so indirectly it does affect air. Welding and grinding that results in separating 1x1x1 block areas will destroy air in it. Welding an airtight block will destroy air it occupied. Grinding a block will increase the room size and decrease room pressure. | ||
+ | * When a newly created room detects that it is no longer enclosed while the room that previously occupied the same space was, it finds the holes and creates a depressurization push and particle effect on the holes. The effect affects everything except blocks within a 5m range from the hole and the magnitude of the force applied depends on distance from the hole. Forced depressurization does not create air in the block it depressurized into. | ||
− | + | == List of Airtight blocks == | |
− | + | *See list of blocks that are airtight - [[Oxygen/Airtight_List|Here]] | |
− | == | + | == See Also == |
+ | *[[Oxygen Tank]] | ||
+ | *[[Oxygen Bottle]] | ||
+ | *[[Ice]] | ||
+ | *[[Hydrogen]] | ||
− | + | [[Category:Game Mechanics]] |
Latest revision as of 07:28, 4 November 2024
Oxygen is vital resource for the player required for them to breathe in Survival, without access to oxygen either via their suit or an atmosphere they will die.
Contents
Vital Statistics
Game version 1.196
Player oxygen consumption rate | 0.063 L/s | This is a flat rate regardless of activity. |
Oxygen Farm max production rate | 0.03 L/s 30 mL/s 3.0e-5 m³/s 1.8 L/min |
Requires sunlight. |
Large grid O2/H2 Generator max production rate | 250 L/s | 10 L/kg of ice |
Small grid O2/H2 Generator max production rate | 50 L/s | 10 L/kg of ice |
Internal suit oxygen tank capacity | 60 L | 15 minutes and 52 seconds worth of breathing. |
Oxygen Bottle item | 100 L | 26 minutes and 27 seconds worth of breathing. |
Large grid Oxygen Tank | 100,000 L | 18 days, 8 hours, 55 minutes and 1 second worth of breathing. |
Small grid Oxygen Tank | 50,000 L | 9 days, 4 hours, 27 minutes and 30 seconds worth of breathing. |
1m3 of 100% room pressure | 1 Unit O2 | About 16 seconds worth of breathing. |
Large grid block of air | 15.625 L | 4 minutes and 8 seconds worth of breathing. |
Small grid block of air | 0.125 L | About 2 seconds worth of breathing. |
Large grid O2/H2 Generator (4,000 L 4 m³ Ice)
400 hL |
108,108 L | 19 days, 20 hours, 40 minutes and 1 second of breathing. |
Small grid O2/H2 Generator (1,000 L 1 m³ Ice)
100 hL |
27,027 L | 4 days, 23 hours, 10 minutes and 0 seconds of breathing. |
Production
Oxygen is created when an Oxygen Generator processes Ice. Ice is found in some Asteroids and planets, much the same as any other kind of ore. Oxygen Farms also generate small amounts of oxygen from sunlight only, but require only electricity and no ice.
Oxygen can also be harvested from a Planet's atmosphere via an Air Vent, Earth and Alien planet both have varying degrees of oxygen found in their atmosphere. While Ice itself can also be harvested directly from a planet in the form of visible bodies of water which in reality is Ice and can be processed for oxygen and hydrogen. Earth especially being very rich with oxygen, these planets have infinite amounts of oxygen available.
Storage
Oxygen can be stored in Oxygen Tanks (on ships and stations), in Oxygen Bottles (items), and in a space engineer's suit.
A player's suit's oxygen is depleted while the player is wearing a helmet. The remaining oxygen capacity is displayed in the left status panel of the player's HUD in [%], as is the current status of the helmet (if worn or not). A suit's stored oxygen is replenished from a Medical Room, a Cockpit, or a Fighter Cockpit attached to a Conveyor system with an Oxygen Tank or oxygen source (generator or farm). If there is an Oxygen Bottle in a player's inventory when the suit's oxygen level drops below 30% then oxygen will be transferred from the bottle(s) to refill the suit's oxygen storage.
Consumption
Space Engineer
A player consumes oxygen at a rate of 0.063 O2 / s. This oxygen is taken from the player's suit while their helmet is on (worn) or from the pressurized room they are in while their helmet is off. If a player is sitting with their helmet is off in a cockpit with conveyor access to oxygen then oxygen will be consumed out of the conveyor system (assuming there is an available oxygen tank).
If their suit's oxygen is ever depleted then the character will slowly asphyxiate while their helmet is on. A player with their helmet off while not in a pressurized room or a cockpit with conveyor access to oxygen will also asphyxiate. Asphyxiation results in death if an oxygen supply is not restored immediately.
- The player can even suffocate in their suit while standing in a pressurized room, if they do not take off their helmet before the suit's internal O2 tank is depleted!
Atmosphere
An airtight room (larger than a single block) of a small ship, large ship or station can be pressurized with oxygen by an Air Vent with conveyor access to oxygen. The air vent can also depressurize such a room, taking with oxygen out and returning it to the conveyor system (if storage is available). A Graph traversal / flood-fill algorithm is used to fill the enclosed space with oxygen. The algorithm traverses through the volumetric grid and checks for enclosed and open areas. 1 stored unit of oxygen is 1m3 and blocks with air (no matter what shape) take 15.625 units of oxygen to fill for 1 large block of air, while a small block of hold 0.125 units of oxygen.
The minimum safe pressure for a character to have their helmet off and breathe in a pressurized room is 50%, if the character is in a room with some oxygen but not enough to reach 50% pressure they'll take 1 hitpoint of damage per second; Even if this room's pressure is tiny any pressure above 0% will do. If the character is in a room with no oxygen whatsoever (or a room that cannot be pressurized due to a leak exposed to space) or in open space such as an exterior - they will take 7 hitpoints of damage per second. A player in a suit without any oxygen will take the full 7 hitpoints of damage per second and has ~14 seconds to find oxygen or they will die.
Assuming you are in an airtight, pressurized room entirely full of oxygen:
- Welding an airtight block into its final build stage destroys the air that was in its block.
- Grinding an airtight block down from its final build stage to anywhere under it will expand the room by one block, dropping room pressure.
- Closing a door destroys the air that was in its block.
- Welding a block or closing a door creating a 1-block "room"/space will destroy the air that was in that space.
- Losing a fully pressurized large-grid block of air destroys 15.625 units of oxygen.
Notes on Oxygen Mechanics
- Oxygen propagation between producers (farms, generators) and consumers (tanks, vents, cockpits, medical rooms) is determined by conveyor rules, but conveyors themselves do not store, contain, or otherwise mutilate oxygen. Oxygen travels instantly between these endpoints.
- Oxygen is drained uniformly from all non-stockpiling tanks.
- Consumers are sorted by priority and, if any oxygen production remains, the rest is uniformly distributed among tanks. Oxygen consumption priority is defined by block type, but currently all consuming blocks appear to have a priority of 0.
- Non-stockpiling tanks are constantly rebalanced with a delay-over-time, subtracting oxygen from some tanks and adding an equal amount to others.
- There's such a thing as 'oxygenated room' object, which contains oxygen block structures, all of which are identical in function (and in volume!) regardless of what actual block occupies the grid coordinate.
- The authority on how much oxygen exists is the room object, rather than the block. Rooms are pressurized and depressurized as a whole, blocks track the room's oxygen level and adjust to match it over time. Oxygen, once released into the environment becomes 'air', for lack of a better word -- a considerably different entity, which is still called 'oxygen' in the code -- and individual block's state does not affect the state of the room until rooms are completely recalculated. Vents directly affect the room oxygen amount, rather than the individual block position they're in; they create 'air' and consume 'oxygen', or vice versa when depressurizing. Medical rooms directly fill spacesuits by consuming oxygen from tanks and adding an equal amount to the suit store.
- Blocks do have individual air level values and constantly adjust this value to the value that would be average for the entire room based on it's size and total air level. The entire room is supposed to have the pressure equalized in 1.5 seconds -- this is a constant. Notice that this is done by each block individually, i.e. air does not move between blocks -- when a block adds or removes air, it does not consider anything except it's current air level and the room's total level and number of blocks in it.
- Air is consumed by characters by directly subtracting it out of the room amount, rather than the current block they're in. Which room they're in is identified by looking for the closest oxygen block structure that is part of a pressurized (i.e. enclosed) 'room'. The code looks at a character's position (a point at your feet) and tries to find which block in which grid to consider by determining which block center the character point is closest to; the first room that is enclosed should be picked, but the order the blocks are considered is dependent on grid orientation, which is why it's possible to stand in an oxygenated room next to a door leading out to vacuum and still suffocate.
- Rooms are defined by propagating block neighbours in all cardinal directions, kind of like flood fill algorithm in a 2D paint program, but in 3D with quirks. Blocks diagonally from each other are not neighbours and rooms do not propagate through corners. Some interesting points about this:
- Rooms are temporary structures, they are regularly recalculated when blocks are added to the grid, removed from it, or door state changes.
- The presence or absence of vents does not affect whether something is considered a room or not. The splitting logic works on the entire grid, starting from a particular corner and trying to create new rooms when others end up until the grid is done.
- State of being pressurized, which is the word the code uses to mean an enclosed room, is actually completely distinct from the actual oxygen amount.
- Two types of airtight blocks exist - those that are airtight as a whole, so all their walls are airtight, and others. The algorithm considers the direction it arrived to the block from when determining whether the block is airtight for the purposes of enclosing a room, and uses some complicated logic based on mount points (the points on a block where it can connect to other blocks). Blocks with build stages are only airtight when on the last build stage, regardless.
- When rooms are recalculated, should a previously existing room be split in two by a closing door, the pressure will be retained in both of the new rooms from the room that previously occupied the same blocks in the grid. This is done by adding up the total amount of air in every individual block that a newly created room contains if a room previously existed in the same grid block coordinates. This is the only time the amount of air within an individual block seems to matter for anything. Should the total amount end up larger than what the room can contain based on the number of blocks in it, it will be discarded, so building a block destroys air, rather than displacing it.
- Notice that a closed door is airtight from both directions. When closed, any air that it might have contained is discarded since it's not part of either room it separates anymore -- so yes, closing doors destroys air in that block, every time it happens. Closing a door to a room in which pressure has yet to equalize across all blocks can sometimes result in not destroying air.
- Only rooms which end up larger than exactly one block are considered to exist. If the room size calculation ends up with a room exactly one block large then it will be discarded along with every oxygen block that would be part of it. If you end up in a completely enclosed 1x1x1 room with a vent, you will suffocate anyway.
- The amount of oxygen it takes to fill a room to 100% depends on the room's grid size, it's exactly a cube of that grid size. The grid size itself though is not exactly an obvious value and depends on a lot of code that has nothing to do with oxygen, but comments seem to indicate meters are meant to be the unit, so one unit of oxygen should result in exactly one cubic meter of air, and one large block should contain exactly (2.5m)3 = 15.625m3 of air.
- There are no efficiency values surrounding pressurization or depressurization. Air vents are 100% efficient, creating exactly the same number of oxygen units that they just sucked out of the room air. But since 'air' is not kept track of as cleanly as inventory oxygen is, it may still end up not being 100% efficient. 'air' gets created and destroyed pretty frequently, particularly so if you open or close any doors while blocks don't have an even pressure. Closing and opening doors inside environment that is not evenly pressurized can destroy much more air than just closing a door does if you do it before 1.5 seconds elapse.
- There is no evidence grinding or welding in a room alters room air content directly, but it alters blocks themselves and thereby forces a room recalculation, so indirectly it does affect air. Welding and grinding that results in separating 1x1x1 block areas will destroy air in it. Welding an airtight block will destroy air it occupied. Grinding a block will increase the room size and decrease room pressure.
- When a newly created room detects that it is no longer enclosed while the room that previously occupied the same space was, it finds the holes and creates a depressurization push and particle effect on the holes. The effect affects everything except blocks within a 5m range from the hole and the magnitude of the force applied depends on distance from the hole. Forced depressurization does not create air in the block it depressurized into.
List of Airtight blocks
- See list of blocks that are airtight - Here