<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://stationeers-wiki.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=RA2lover</id>
	<title>Stationeers Community Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://stationeers-wiki.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=RA2lover"/>
	<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/Special:Contributions/RA2lover"/>
	<updated>2026-09-18T06:17:16Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=Kit_(Grow_Light)&amp;diff=28183</id>
		<title>Kit (Grow Light)</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=Kit_(Grow_Light)&amp;diff=28183"/>
		<updated>2026-09-18T02:31:39Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: stationpedia blurb, grow light sunlight-equivalent, stacking mechanics, multi-layer hydroponics tray coverage&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Items]][[Category:Lights]][[Category:Electronic]]&lt;br /&gt;
{{Itembox&lt;br /&gt;
 | name            = Kit (Grow Light)&lt;br /&gt;
 | image           = [[File:ItemKitGrowLight.png|Kit(GrowLight)]]&lt;br /&gt;
 | stacks          = 10&lt;br /&gt;
 | paintable       = Yes&lt;br /&gt;
 | constructs      = [[Grow Light]]&lt;br /&gt;
 | recipe_machine1 = Electronics Printer&lt;br /&gt;
 | recipe_cost1    = 5g [[Copper]], 5g [[Steel]], 10g [[Electrum]]&lt;br /&gt;
 | prefabhash      = 341030083&lt;br /&gt;
 | prefabname      = ItemKitGrowLight&lt;br /&gt;
}}{{Stationpedia|[[Agrizero]]&#039;s leading hydroponic lighting system, the GrowUp UV light supplements sunshine in low-light or sun-distant conditions. The unit adds growability over the space of a grid, so it requires proximate placement to work.}}{{Structurebox&lt;br /&gt;
 | name             = Grow Light&lt;br /&gt;
 | image            = [[File:ItemGrowLight.png]]&lt;br /&gt;
 | placed_with_item = [[Kit (Grow Light)]]&lt;br /&gt;
 | power_usage      = 70W&lt;br /&gt;
 | placed_on_grid   = Small Grid&lt;br /&gt;
 | decon_with_tool1 = [[Hand Drill]]&lt;br /&gt;
 | item_rec1        = [[Kit (Grow Light)]]&lt;br /&gt;
 | prefab_hash      = -1758710260&lt;br /&gt;
 | prefab_name      = StructureGrowLight&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
Provides artificial sunlight to grow crops.&lt;br /&gt;
&lt;br /&gt;
Crops need [[Water]] and intermittent sunlight to grow. Without either of them, the plant will die. &lt;br /&gt;
&lt;br /&gt;
[[Guide_(Farming)|Guide (Farming)]] provides additional info on how to setup farming with hydroponic tray.&lt;br /&gt;
&lt;br /&gt;
The grow light provides light equivalent to 80% of solar intensity at earth distance to crops within its illumination pattern. Although multiple overlapping grow lights don&#039;t stack their effects, the effect of a grow light stacks with solar illumination, making the use of a greenhouse potentially worthwhile.&lt;br /&gt;
==Illumination pattern==&lt;br /&gt;
&lt;br /&gt;
The Illumination pattern of the Grow Light has changed as of the [[Update v0.2.6085.26682|Respawn Update: Round Robin Community Starts (Update v0.2.6085.26682)]].&lt;br /&gt;
&lt;br /&gt;
Lighting area is not a focused cone but a 8x7 small grid rectangle with the light being projected out 3 small grids from each side of the grow light. &lt;br /&gt;
&lt;br /&gt;
Previous to this update, the lighting area was a 7x6 rectangle centred on the small [[grid]] of the grow light containing the power connection.&lt;br /&gt;
&lt;br /&gt;
Although ceiling mounting is more logical with regard to real plants growing, it is worth noting that floor mounting will provide the same illumination pattern with no downside.&lt;br /&gt;
&lt;br /&gt;
Ceiling mounting grow lights two large grids above planters will not provide adequate light to the planters.&lt;br /&gt;
&lt;br /&gt;
[[File:Stationeers-grow-light-footprint-jan2026.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
Vertical illumination coverage extends for 5 small grid tiles, looking like this:&lt;br /&gt;
&lt;br /&gt;
[[File:GrowLight topDown 2024.svg|frameless|wall-mount grow light coverage]]&lt;br /&gt;
&lt;br /&gt;
==Wall Mounting vs Ceiling Mounting==&lt;br /&gt;
Ceiling mounting has a nominal coverage of 56 tiles, compared to 48 of wall mounting.&lt;br /&gt;
&lt;br /&gt;
The presence of the light (and associated wiring) interferes with [[Harvie]] and [[LArRE]] placement. When either is expected to be used, wall mounting is more flexible then ceiling mounting. Note that Harvie requires space in two horizontal sides for chutes, so it can only harvest from trays with some separation between them; a Hydroponics LArRE does not have this limitation. It can also only be placed in a top-down arrangement, whereas LArRE can have stations interact with trays in any direction. Advanced builds can use this to stack up to 3 layers of trays on a single grow light while still retaining LArRE coverage for all plants.&lt;br /&gt;
&lt;br /&gt;
If harvest is not needed (such as with ferns being used for oxygen production), trays can be placed so as to cover all available tiles within a tray. This allows up to 332 (8*7*6-4) trays to be illuminated by a single grow light.&lt;br /&gt;
&lt;br /&gt;
{{Data Network Header}}&lt;br /&gt;
&lt;br /&gt;
{{Data Parameters}}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter Name !! Data Type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| On || Boolean || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Data Outputs}}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Output Name !! Data Type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| On || Boolean || &lt;br /&gt;
|-&lt;br /&gt;
| Power || Boolean || &lt;br /&gt;
|-&lt;br /&gt;
| PrefabHash || Integer || &lt;br /&gt;
|-&lt;br /&gt;
| RequiredPower || Integer || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=Fire_Extinguisher_(Reusable)&amp;diff=28182</id>
		<title>Fire Extinguisher (Reusable)</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=Fire_Extinguisher_(Reusable)&amp;diff=28182"/>
		<updated>2026-09-18T01:50:48Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: mention canister in slot is insulated and additional heat is only removed if above 20°C.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Itembox&lt;br /&gt;
 |            name = Fire Extinguisher (Reusable)&lt;br /&gt;
 |           image = [[File:ItemReusableFireExtinguisher.png]]&lt;br /&gt;
 |          stacks = 1&lt;br /&gt;
 |       paintable = yes&lt;br /&gt;
 | recipe_machine1 = Tool Manufactory&lt;br /&gt;
 |    recipe_cost1 = 5g Steel&lt;br /&gt;
 |      prefabhash = -1773192190&lt;br /&gt;
 |      prefabname = ItemReusableFireExtinguisher&lt;br /&gt;
 |      slot_class = SlotClass.Tool&lt;br /&gt;
 |   sorting_class = SortingClass.Tools&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Stationpedia|Requires a canister filled with any inert liquid to operate.}}&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
The Fire Extinguisher (Reusable) is a handheld fire suppression tool. Unlike its predecessor the [[Fire Extinguisher]], it does not carry a fixed charge — instead it accepts a replaceable [[Liquid Canister]] or [[Liquid Canister (Smart)]] which can be refilled and swapped out.&lt;br /&gt;
&lt;br /&gt;
Its canister slot is insulated, allowing safe long-term use of cryogenic inert liquids such as Liquid Nitrogen or Liquid Carbon Dioxide.&lt;br /&gt;
&lt;br /&gt;
= Usage =&lt;br /&gt;
Equip the extinguisher and insert a liquid [[canister]] filled with a [[#Compatible liquids|compatible liquid]]. Activate to spray. While activated the extinguisher will extinguish fires, release its contents into atmosphere, remove 20kJ/tick of heat [[energy]] from the surrounding [[atmosphere]] (if above 20°C) and prevent reignition for five seconds after you stop spraying.&lt;br /&gt;
&lt;br /&gt;
The canister must be at least 99% inert by content — spraying a canister containing [[oxygen]], [[fuel]], or any other reactive substance will not suppress the fire, and any liquid sprayed will still be released into the atmosphere.&lt;br /&gt;
&lt;br /&gt;
== Spray duration ==&lt;br /&gt;
Spray rate is fixed at 0.25 liters per second regardless of canister type.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Canister !! Usable Capacity !! Spray Duration&lt;br /&gt;
|-&lt;br /&gt;
| [[Liquid Canister]] || ~12 L || ~48 seconds&lt;br /&gt;
|-&lt;br /&gt;
| [[Liquid Canister (Smart)]] || ~18 L || ~72 seconds&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Compatible liquids ==&lt;br /&gt;
The following liquids are considered inert and will allow the extinguisher to suppress fires:&lt;br /&gt;
* [[Water]]&lt;br /&gt;
* [[Liquid Carbon Dioxide]]&lt;br /&gt;
* [[Liquid Nitrogen]]&lt;br /&gt;
* [[Liquid Pollutant]]&lt;br /&gt;
* [[Polluted Water]]&lt;br /&gt;
* [[Liquid Hydrochloric Acid]]&lt;br /&gt;
* [[Liquid Silanol]]&lt;br /&gt;
* [[Liquid Sodium Chloride]]&lt;br /&gt;
&lt;br /&gt;
= Slots =&lt;br /&gt;
{{Slots&lt;br /&gt;
|{{Slots/row|name=Liquid Canister|type=LiquidCanister}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=Fire_Extinguisher&amp;diff=28181</id>
		<title>Fire Extinguisher</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=Fire_Extinguisher&amp;diff=28181"/>
		<updated>2026-09-18T01:39:06Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: redirect to reusable fire extinguisher while keeping old content&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Fire Extinguisher (Reusable)]]{{deprecated|0.2.4846.22070}}&lt;br /&gt;
[[Category:Deprecated]]&lt;br /&gt;
[[Category:Tools]]&lt;br /&gt;
{{Itembox&lt;br /&gt;
 | name        = Fire Extinguisher &lt;br /&gt;
 | image       =  [[File:{{#setmainimage:FireExtingusher.PNG}}]]&lt;br /&gt;
 | stacks      = No&lt;br /&gt;
 | createdwith = [[Fabricator]]&lt;br /&gt;
 | cost        = 5 Iron&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
Portable device to extinguish fires or fires of small magnitude. It extingishes a single object from being on fire, making it useful in protecting small areas. However against a large scale fire it is recommended to vent the area. &lt;br /&gt;
&lt;br /&gt;
== Use ==&lt;br /&gt;
Use left-click while in active hand while pointing at object to use. &lt;br /&gt;
&lt;br /&gt;
It can be used to cool a [[room]] by pointing it an object and holding the click, the room temperature will drop fast making it perfect for cheap quick cooling on [[worlds]] like [[Venus]] where you start with one.&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=Dirty_Ore&amp;diff=28180</id>
		<title>Dirty Ore</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=Dirty_Ore&amp;diff=28180"/>
		<updated>2026-09-18T01:25:17Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: /* Description */ mention dirty ore can be processed on a recycler&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
[[Category:Items]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Itembox&lt;br /&gt;
 | image       = &lt;br /&gt;
 | name        = Dirty Ore&lt;br /&gt;
 | createdwith = [[Deep Miner]]&amp;lt;br&amp;gt;[[Rocket Miner]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
Once a [[Deep Miner]] is inside bedrock it starts to produce Dirty Ore, which can be converted to regular ores using a [[Centrifuge]] or [[Combustion Centrifuge]], or into [[Reagent Mix]] at 50% efficiency using a [[Recycler]].&lt;br /&gt;
&lt;br /&gt;
Alternatively, Dirty Ore can also be acquired using the [[Rocket Miner]], returning ore via rockets from space.&lt;br /&gt;
&lt;br /&gt;
== Composition and Mining Regions ==&lt;br /&gt;
Dirty Ore will be converted by the ore-mix of the deep mining regions below the Deep Miner in a 1:1 ratio. The mining regions of a planet can be uncovered by using a rocket with a scanner-head.&lt;br /&gt;
&lt;br /&gt;
== Notes == &lt;br /&gt;
* Changed in 0.2.5903.26007 (terrain update) to have ore generation tied to regions.&lt;br /&gt;
* Added in v0.2.3619.17630 (&amp;quot;Deep Miner, Centrifuges, and Chutes&amp;quot;, 2022-09-20).&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=Polluted_Water&amp;diff=28179</id>
		<title>Polluted Water</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=Polluted_Water&amp;diff=28179"/>
		<updated>2026-09-17T22:11:37Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: /* Usage */ add heat-deleting property&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
{{Infobox gas&lt;br /&gt;
| gas_name = Polluted Water&lt;br /&gt;
| image = icon-pollutedwater.png&lt;br /&gt;
| heat = 64 J/mol*K &amp;lt;!-- Atmospherics.Mole::GetSpecificHeat --&amp;gt;&lt;br /&gt;
| latent_heat = 8000 J/mol &amp;lt;!-- Atmospherics.Mole::LatentHeatOfVaporization --&amp;gt;&lt;br /&gt;
| minimum_condensation = 6.3 kPa at 276.15 K &amp;lt;!-- Atmospherics.Mole::FreezingTemperature --&amp;gt;&lt;br /&gt;
| max_liquid = 6000 kPa at 629 K &amp;lt;!-- Atmospherics.Mole::MaxLiquidTemperature --&amp;gt;&lt;br /&gt;
| freezes = 276.15 K&lt;br /&gt;
| liquid_volume = 18 L/kmol&lt;br /&gt;
| molar_mass = 108 g/mol&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Stationpedia|Polluted water is a waste product from the use of [[Water]] in certain devices. It will freeze into [[Ice (Polluted Water)]] but boil into [[Water|Steam]].&lt;br /&gt;
A [[Water Purifier]] can be used to convert it back to [[Water]]}}&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
Polluted Water is a byproduct of various machines such as when the player uses a [[shower]] as a means to raise a player&#039;s [[hygiene]]. Polluted water needs to be cleaned before it can be usable, either through a &lt;br /&gt;
[[Water Purifier|water purifier]] or by boiling the liquid into [[Water|Steam]].&lt;br /&gt;
&lt;br /&gt;
Polluted Water has a specific heat of {{Gas/Property|Polluted Water|SpecificHeat}} J/mol*K. Because its source product, Water, and evaporation byproduct, Steam, have a higher specific heat of {{Gas/Property|Steam|SpecificHeat}} J/mol*K, the production of polluted water is a heat-deleting process which can be used for cooling. &lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
Polluted water can be obtained by using a [[Shower]] or [[Toilet]].&lt;br /&gt;
&lt;br /&gt;
You can obtain polluted water by smelting [[Ice (Polluted Water)]] using a [[Furnace]] or crushing [[Ice (Polluted Water)]] in an [[Ice Crusher]]. Filtering is no longer required as the [[Furnace]] and [[Ice Crusher]] now contain separate outputs for liquids and gases.&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Source !! Amount&lt;br /&gt;
|-&lt;br /&gt;
| [[Ice (Polluted Water)]] || 50 mol&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
Polluted water was added as part of the &amp;quot;Shelter in Space&amp;quot; update. It was added as a potential byproduct for raising the [[hygiene]] stat.&lt;br /&gt;
{{:Gases and Liquids/Menu}}&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=User_talk:Smaug&amp;diff=28175</id>
		<title>User talk:Smaug</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=User_talk:Smaug&amp;diff=28175"/>
		<updated>2026-09-15T12:34:13Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: Welcome to the crew!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Welcome to Stationeers Community Wiki, Stationeer!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You&#039;re now part of the crew. A few tips to get started:&lt;br /&gt;
* Browse [[Special:RecentChanges|recent changes]] to see what the community is working on&lt;br /&gt;
* Read the [[https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents|help pages]] if you&#039;re new to wiki editing&lt;br /&gt;
* Don&#039;t hesitate to jump in, every edit helps [[User:RA2lover|RA2lover]] ([[User talk:RA2lover|talk]]) 12:34, 15 September 2026 (UTC)&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=User_talk:Eggdropsoap&amp;diff=28174</id>
		<title>User talk:Eggdropsoap</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=User_talk:Eggdropsoap&amp;diff=28174"/>
		<updated>2026-09-15T12:33:55Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: Welcome to the crew!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Welcome to Stationeers Community Wiki, Stationeer!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You&#039;re now part of the crew. A few tips to get started:&lt;br /&gt;
* Browse [[Special:RecentChanges|recent changes]] to see what the community is working on&lt;br /&gt;
* Read the [[https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents|help pages]] if you&#039;re new to wiki editing&lt;br /&gt;
* Don&#039;t hesitate to jump in, every edit helps [[User:RA2lover|RA2lover]] ([[User talk:RA2lover|talk]]) 12:33, 15 September 2026 (UTC)&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=User_talk:Physicist&amp;diff=28173</id>
		<title>User talk:Physicist</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=User_talk:Physicist&amp;diff=28173"/>
		<updated>2026-09-15T12:32:51Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: Welcome to the crew!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Welcome to Stationeers Community Wiki, Stationeer!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You&#039;re now part of the crew. A few tips to get started:&lt;br /&gt;
* Browse [[Special:RecentChanges|recent changes]] to see what the community is working on&lt;br /&gt;
* Read the [[https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents|help pages]] if you&#039;re new to wiki editing&lt;br /&gt;
* Don&#039;t hesitate to jump in, every edit helps [[User:RA2lover|RA2lover]] ([[User talk:RA2lover|talk]]) 12:32, 15 September 2026 (UTC)&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=Combustion_Centrifuge&amp;diff=28172</id>
		<title>Combustion Centrifuge</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=Combustion_Centrifuge&amp;diff=28172"/>
		<updated>2026-09-15T03:05:07Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: /* Engine Speed / Stress */ clarification on the centrifuge needing actual combustion instead of just being capable of combustion, add note that starting from a standstill will always result in stress&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{Itembox&lt;br /&gt;
| name = Kit (Combustion Centrifuge)&lt;br /&gt;
| image = [[File:KitStructureCombustionCentrifuge.png]]&lt;br /&gt;
| prefabhash = 231903234&lt;br /&gt;
| prefabname = KitStructureCombustionCentrifuge&lt;br /&gt;
| stacks = 1&lt;br /&gt;
| slot_class = SlotClass.None&lt;br /&gt;
| sorting_class = SortingClass.Kits&lt;br /&gt;
| recipe_machine1 = Autolathe (Tier Two)&lt;br /&gt;
| recipe_cost1 = 20g [[Steel]], 10g [[Invar]], 5g [[Constantan]]&lt;br /&gt;
| constructs = [[Combustion Centrifuge]]&lt;br /&gt;
}}&lt;br /&gt;
{{Structurebox&lt;br /&gt;
 | name             = Combustion Centrifuge&lt;br /&gt;
 | image            = [[File:StructureCombustionCentrifuge.png]]&lt;br /&gt;
 | power_usage      = 50W&lt;br /&gt;
 | placed_with_item = [[Kit (Combustion Centrifuge)]]&lt;br /&gt;
 | placed_on_grid   = Small Grid&lt;br /&gt;
 | stage_image1     = [[File:StructureCombustionCentrifuge_BuildState0.png]]&lt;br /&gt;
 | decon_with_tool1 = [[Hand Drill]]&lt;br /&gt;
 | item_rec1        = [[Kit (Combustion Centrifuge)]]&lt;br /&gt;
 | const_with_tool2 = [[Welder]]&lt;br /&gt;
 | const_with_item2 = 2x [[Steel Sheets]]&lt;br /&gt;
 | stage_image2     = [[File:StructureCombustionCentrifuge_BuildState1.png]]&lt;br /&gt;
 | decon_with_tool2 = [[Angle Grinder]]&lt;br /&gt;
 | item_rec2        = 2x [[Steel Sheets]]&lt;br /&gt;
 | const_with_item3 = 1x [[Cable Coil]]&lt;br /&gt;
 | decon_with_tool3 = [[Wire Cutters]]&lt;br /&gt;
 | item_rec3        = 1x [[Cable Coil]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Stationpedia|The Combustion Centrifuge is a gas powered version of the [[Centrifuge]]. If a [[Recycler]] or unbalanced [[Furnace]] outputs reagent mixture rather than the desired [[:Category:Ingot|ingots]], a centrifuge allows you to reclaim the raw [[Ores|ore]].&lt;br /&gt;
&lt;br /&gt;
It also refines [[Dirty Ore]] produced from the [[Deep Miner]] and [[Dirty Ore]] produced from the [[Rocket Miner]]. A combustible fuel mix should be supplied to the gas input, and waste gasses should be vented from the output.&lt;br /&gt;
&lt;br /&gt;
The machine&#039;s RPMs must be controlled via the throttle and combustion limiter levers. If the Combustion Centrifuge gains, or loses, RPMs too fast it will experience stress, and eventually grind to a halt.  Higher RPMs directly result in faster processing speeds.&lt;br /&gt;
&lt;br /&gt;
The throttle lever controls the amount of fuel being pulled into the machine, increasing the temperature inside the engine, and leading to an increase in RPM. The limiter lever influences the speed of the combustion, and how much uncombusted gas is in the exhaust.&lt;br /&gt;
&lt;br /&gt;
Ejecting ore from the Combustion Centrifuge while it is at high RPMs will result in additional stress build up.  If turned off while not stressed, the machine will automatically start to brake, and reduce RPMs in a controlled manner.}}&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
The Combustion Centrifuge is a version of the [[Centrifuge]] containing an internal combustion engine whose fuel consumption is adjustable by the throttle lever in 10% increments. Higher engine temperatures result in additional torque which allows it to reach higher speeds, but accelerating (or deccelerating) the engine too quickly results in stress buildup, which causes the engine to grind to a halt if the stress is allowed to reach 100%. It comes with a combustion limiter which allows the rate of combustion to be adjusted.&lt;br /&gt;
&lt;br /&gt;
Ejecting ore from the Combustion Centrifuge while it is spinning will result in 0.1% additional stress buildup/RPM , as well as a 10% reduction in current RPM.&lt;br /&gt;
&lt;br /&gt;
If turned off while not stressed, the machine will automatically start to brake, reduce its drum speed by 15 RPM/tick, and start flushing stored internal gases into its exhaust.&lt;br /&gt;
&lt;br /&gt;
The Combustion Centrifuge can hold 3000g processed ore in its internal storage, allowing it to run for multiple hours before being emptied if processing low-purity ore.&lt;br /&gt;
&lt;br /&gt;
The Combustion Centrifuge has a socket for an [[Integrated Circuit (IC10)|IC10 chip]], similar to the [[Atmospherics]] machine. It comes with two device ports, d0 and d1, for connecting to other devices. To change or set a device, use a [[screwdriver]] to cycle through devices found on the machine&#039;s data network. Code does not run while the centrifuge is turned off, somewhat limiting the centrifuge&#039;s usefulness as turning it off can be necessary to recover from an overstressed state. &lt;br /&gt;
== Throttle ==&lt;br /&gt;
Every [[tick]] up to 0.01 moles of gas will be pulled in to the machine from the input [[pipe]] network. The Throttle parameter linearly controls how much gas to pull in - &amp;lt;code&amp;gt;inputMoles = 0.01*Throttle/100&amp;lt;/code&amp;gt;. The Throttle value is rounded to the nearest 10% increment when set.&lt;br /&gt;
&lt;br /&gt;
== Combustion Limiter ==&lt;br /&gt;
&lt;br /&gt;
The combustion limiter speeds up combustion by forcing an additional percentage of fuel present in the engine to combust &#039;&#039;&#039;after&#039;&#039;&#039; normal combustion takes place. The percentage is quadratically dependent on the combustion limiter lever position:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Force-Combustion Percentages&lt;br /&gt;
!Combustion Limiter setting&lt;br /&gt;
!Combustion Percentage&lt;br /&gt;
|-&lt;br /&gt;
|0% &amp;lt;small&amp;gt;(minimum setting is 3.65%)&amp;lt;/small&amp;gt;&lt;br /&gt;
|0.1%&lt;br /&gt;
|-&lt;br /&gt;
|10%&lt;br /&gt;
|0.75%&lt;br /&gt;
|-&lt;br /&gt;
|20%&lt;br /&gt;
|3%&lt;br /&gt;
|-&lt;br /&gt;
|30%&lt;br /&gt;
|6.75%&lt;br /&gt;
|-&lt;br /&gt;
|40%&lt;br /&gt;
|12%&lt;br /&gt;
|-&lt;br /&gt;
|50%&lt;br /&gt;
|18.75%&lt;br /&gt;
|-&lt;br /&gt;
|60%&lt;br /&gt;
|27%&lt;br /&gt;
|-&lt;br /&gt;
|70%&lt;br /&gt;
|36.75%&lt;br /&gt;
|-&lt;br /&gt;
|80%&lt;br /&gt;
|48%&lt;br /&gt;
|-&lt;br /&gt;
|90%&lt;br /&gt;
|60.75%&lt;br /&gt;
|-&lt;br /&gt;
|100%&lt;br /&gt;
|75%&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Exhaust ==&lt;br /&gt;
The engine pushes gas from its engine into the output pipe network once its internal pressure exceeds 4 MPa. This results in some unburned fuel being present in the exhaust. If the centrifuge is powered off, the centrifuge slows down at 15rpm/tick(as long as no stress is being accrued from excess torque) and hot gas stored inside the engine is slowly flushed out to the exhaust down to 0 kPa. &lt;br /&gt;
&lt;br /&gt;
== Engine Speed / Stress ==&lt;br /&gt;
If the engine&#039;s temperature is above 300°C and combusted at least 30 J during the current tick, the engine produces torque, speeding up by 1 RPM/tick for every {{Overline|416.|6}} K of temperature (up to a maximum of 12 RPM/tick at 5000 K) in a frictionless environment, consuming 30 J*RPM gained from its internal atmosphere in the process. Friction slows the engine down by 1%/tick afterwards, making the engine reach a steady-state speed directly dependent on its temperature.&lt;br /&gt;
&lt;br /&gt;
If the engine speeds up or slows down at a rate slower than &amp;lt;code&amp;gt;min(1000/(RPM+500), 1.25)&amp;lt;/code&amp;gt; &amp;lt;!-- technically, clamp(1000/RPM+500, 0.5,1.25), but the minimum value is unreachable as it only takes place at 1500 RPM but the engine is unable to exceed 1188 RPM. https://www.desmos.com/calculator/vfkabhoxt5 --&amp;gt;RPM/tick, its stress is reduced by 0.5%/tick. Otherwise, its stress is increased by &amp;lt;code&amp;gt;(abs(RPM delta) - 1) * min(1000/(RPM+500), 1.25)&amp;lt;/code&amp;gt; %/tick (which can go negative reducing stress faster than the 0.5%/tick you&#039;d get otherwise). The optimal acceleration/decceleration rate is 1 RPM/tick beyond the 0.5% stress/tick reduction curve, at which point no stress is gained or lost.&lt;br /&gt;
&lt;br /&gt;
If stress is at 100% or more, the centrifuge slows down by a whopping 40 RPM/tick. This can put the centrifuge&#039;s engine into a death spiral as the lower RPM leads to a higher net torque which can increase the stress rate even further, with the only way to resume operation being reducing the engine&#039;s internal temperature to a point it can start accelerating again in a controlled fashion. Because the engine only cools down if it has at least 30 J/tick of combustion still occuring within it, this can be difficult to achieve without turning the centrifuge off and waiting for all hot gas to be flushed into the exhaust, as even at the minimum operating temperature of 300°C a start from a standstill will accrue stress, requiring the centrifuge to get out of its stress-accruing zone before stress exceeds 100%.&lt;br /&gt;
&lt;br /&gt;
== Processing Speed ==&lt;br /&gt;
The speed at which the centrifuge processes items is directly proportional to how fast it is rotating. At 300 RPM, it process pure ores are refined at a rate of 1 second/item and [[Dirty Ore]] / [[Reagent Mix]] at a rate of 6 seconds/item. Excess progress is carried over to the next item processed.&lt;br /&gt;
&lt;br /&gt;
Using regular [[Fuel]], the Combustion Centrifuge can reach a bit higher than 500 RPM, making it just over 5 times faster than the regular [[Centrifuge]] at its max speed. The regular electric centrifuge will take 18 seconds to process a single piece of [[Dirty Ore]], while a Combustion Centrifuge at 515 RPM will take just 3.5 seconds. At full throttle, the centrifuge will take approximately 6.5 hours to deplete a [[Gas Canister (Smart)|Smart Canister]] filled with fuel.&amp;lt;!-- 18 MPa @ 20°C * 64 L = 472 mol = 6.555 h --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The speed of the Combustion Centrifuge can be boosted significantly by replacing the fuel mixture with a [[Fuel|Superfuel]] mixture. Using superfuel can boost the centrifuge to a steady-state maximum of 1188 RPM, processing ore at more than double the speed. This comes at the cost of ease of use, as storing Superfuel mixtures and [[Nitrous Oxide]] itself is difficult, the centrifuge can no longer safely eject items at that speed, and starting up the centrifuge also becomes more complex due to faster and hotter combustion.&lt;br /&gt;
&lt;br /&gt;
{{Data Network Header}}&lt;br /&gt;
{{Data Parameters|&lt;br /&gt;
{{Data Parameters/row|Power|Boolean|w=0|Can be read to return if the Combustion Centrifuge is correctly powered or not, set via the power system, return 1 if powered and 0 if not|multiple=2|0|Unpowered|1|Powered}}&lt;br /&gt;
{{Data Parameters/row|Open|Integer|1 if device is open, otherwise 0|multiple=2|0|Closed|1|Open}}&lt;br /&gt;
{{Data Parameters/row|Error|Boolean|w=0|1 if device is in error state, otherwise 0|multiple=2|0|&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;|1|Error}}&lt;br /&gt;
{{Data Parameters/row|Pressure|Float|w=0|The current pressure reading of the Combustion Centrifuge}}&lt;br /&gt;
{{Data Parameters/row|Temperature|Integer|w=0|The current temperature reading of the Combustion Centrifuge}}&lt;br /&gt;
{{Data Parameters/row|Lock|Boolean|Disable manual operation of the Combustion Centrifuge.|multiple=2|0|Unlocked|1|Locked}}&lt;br /&gt;
{{Data Parameters/row|Reagents|Integer|w=0|Total number of reagents recorded by the Combustion Centrifuge.  Max reagent capacity is 3000, at which time centrifuge will spin down and flash an error. IC/Logic required for automation, otherwise manual operation.}}&lt;br /&gt;
{{Data Parameters/row|RatioOxygen|Float|w=0|The ratio of [[Oxygen]] in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioCarbonDioxide|Float|w=0|The ratio of Carbon Dioxide in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioNitrogen|Float|w=0|The ratio of [[Nitrogen]] in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioPollutant|Float|w=0|The ratio of [[Pollutant]] in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioVolatiles|Float|w=0|The ratio of [[Volatiles]] in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioWater|Float|w=0|The ratio of [[Water]] in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|On|Boolean|The current state of the Combustion Centrifuge.|multiple=2|0|Off|1|On}}&lt;br /&gt;
{{Data Parameters/row|RequiredPower|Integer|w=0|Idle operating power quantity, does not necessarily include extra demand power}}&lt;br /&gt;
{{Data Parameters/row|ClearMemory|Integer|r=0|When set to 1, clears the counter memory (e.g. ExportCount). Will set itself back to 0 when actioned}}&lt;br /&gt;
{{Data Parameters/row|ExportCount|Integer|w=0|How many items exported since last ClearMemory}}&lt;br /&gt;
{{Data Parameters/row|ImportCount|Integer|w=0|How many items imported since last ClearMemory}}&lt;br /&gt;
{{Data Parameters/row|TotalMoles|Float|w=0|Returns the total moles of the Combustion Centrifuge}}&lt;br /&gt;
{{Data Parameters/row|RatioNitrousOxide|Float|w=0|The ratio of Nitrous Oxide in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|PrefabHash|Integer|w=0|The hash of the structure}}&lt;br /&gt;
{{Data Parameters/row|Combustion|Boolean|w=0|Assess if the atmosphere is on fire. Returns 1 if atmosphere is on fire, 0 if not.|0 or 1}}&lt;br /&gt;
{{Data Parameters/row|PressureInput|Float|w=0|The current pressure reading of the Combustion Centrifuge&#039;s Input Network}}&lt;br /&gt;
{{Data Parameters/row|TemperatureInput|Float|w=0|The current temperature reading of the Combustion Centrifuge&#039;s Input Network}}&lt;br /&gt;
{{Data Parameters/row|RatioOxygenInput|Float|w=0|The ratio of [[Oxygen]] in device&#039;s input network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioCarbonDioxideInput|Float|w=0|The ratio of Carbon Dioxide in device&#039;s input network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioNitrogenInput|Float|w=0|The ratio of [[Nitrogen]] in device&#039;s input network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioPollutantInput|Float|w=0|The ratio of [[Pollutant]] in device&#039;s input network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioVolatilesInput|Float|w=0|The ratio of [[Volatiles]] in device&#039;s input network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioWaterInput|Float|w=0|The ratio of [[Water]] in device&#039;s input network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioNitrousOxideInput|Float|w=0|The ratio of Nitrous Oxide in device&#039;s input network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|TotalMolesInput|Float|w=0|Returns the total moles of the Combustion Centrifuge&#039;s Input Network}}&lt;br /&gt;
{{Data Parameters/row|PressureOutput|Float|w=0|The current pressure reading of the Combustion Centrifuge&#039;s Output Network}}&lt;br /&gt;
{{Data Parameters/row|TemperatureOutput|Float|w=0|The current temperature reading of the Combustion Centrifuge&#039;s Output Network}}&lt;br /&gt;
{{Data Parameters/row|RatioOxygenOutput|Float|w=0|The ratio of [[Oxygen]] in device&#039;s Output network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioCarbonDioxideOutput|Float|w=0|The ratio of Carbon Dioxide in device&#039;s Output network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioNitrogenOutput|Float|w=0|The ratio of [[Nitrogen]] in device&#039;s Output network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioPollutantOutput|Float|w=0|The ratio of [[Pollutant]] in device&#039;s Output network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioVolatilesOutput|Float|w=0|The ratio of [[Volatiles]] in device&#039;s Output network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioWaterOutput|Float|w=0|The ratio of [[Water]] in device&#039;s Output network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioNitrousOxideOutput|Float|w=0|The ratio of Nitrous Oxide in device&#039;s Output network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|TotalMolesOutput|Float|w=0|Returns the total moles of the Combustion Centrifuge&#039;s Output Network}}&lt;br /&gt;
{{Data Parameters/row|CombustionInput|Boolean|w=0|Assess if the atmosphere is on fire. Returns 1 if device&#039;s input network is on fire, 0 if not.|0 or 1}}&lt;br /&gt;
{{Data Parameters/row|CombustionOutput|Boolean|w=0|Assess if the atmosphere is on fire. Returns 1 if device&#039;s Output network is on fire, 0 if not.|0 or 1}}&lt;br /&gt;
{{Data Parameters/row|CombustionLimiter|Integer|Retards the rate of combustion inside the machine (range: 0-100), with 0 being the slowest rate of combustion and 100 being the fastest}}&lt;br /&gt;
{{Data Parameters/row|Throttle|Integer|Increases the rate at which the machine works (range: 0-100)}}&lt;br /&gt;
{{Data Parameters/row|Rpm|Integer|w=0|The number of revolutions per minute that the Combustion Centrifuge&#039;s spinning mechanism is doing}}&lt;br /&gt;
{{Data Parameters/row|Stress|Integer|w=0|Machines get stressed when working hard. When Stress reaches 100 the machine will automatically shut down}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidNitrogen|Float|w=0|The ratio of Liquid Nitrogen in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidNitrogenInput|Float|w=0|The ratio of Liquid Nitrogen in device&#039;s input network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidNitrogenOutput|Float|w=0|The ratio of Liquid Nitrogen in device&#039;s Output network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidOxygen|Float|w=0|The ratio of Liquid Oxygen in device&#039;s Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidOxygenInput|Float|w=0|The ratio of Liquid Oxygen in device&#039;s Input Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidOxygenOutput|Float|w=0|The ratio of Liquid Oxygen in Combustion Centrifuge&#039;s Output Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidVolatiles|Float|w=0|The ratio of Liquid Volatiles in device&#039;s Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidVolatilesInput|Float|w=0|The ratio of Liquid Volatiles in device&#039;s Input Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidVolatilesOutput|Float|w=0|The ratio of Liquid Volatiles in Combustion Centrifuge&#039;s Output Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioSteam|Float|w=0|The ratio of Steam in device&#039;s Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioSteamInput|Float|w=0|The ratio of Steam in device&#039;s Input Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioSteamOutput|Float|w=0|The ratio of Steam in Combustion Centrifuge&#039;s Output Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidCarbonDioxide|Float|w=0|The ratio of Liquid Carbon Dioxide in device&#039;s Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidCarbonDioxideInput|Float|w=0|The ratio of Liquid Carbon Dioxide in device&#039;s Input Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidCarbonDioxideOutput|Float|w=0|The ratio of Liquid Carbon Dioxide in Combustion Centrifuge&#039;s Output Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidPollutant|Float|w=0|The ratio of Liquid Pollutant in device&#039;s Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidPollutantInput|Float|w=0|The ratio of Liquid Pollutant in device&#039;s Input Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidPollutantOutput|Float|w=0|The ratio of Liquid Pollutant in Combustion Centrifuge&#039;s Output Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidNitrousOxide|Float|w=0|The ratio of Liquid Nitrous Oxide in device&#039;s Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidNitrousOxideInput|Float|w=0|The ratio of Liquid Nitrous Oxide in device&#039;s Input Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidNitrousOxideOutput|Float|w=0|The ratio of Liquid Nitrous Oxide in Combustion Centrifuge&#039;s Output Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|ReferenceId|Integer|w=0|Unique Reference Identifier for this object}}&lt;br /&gt;
{{Data Parameters/row|RatioHydrogen|Float|w=0|DEPRECATED|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidHydrogen|Float|w=0|DEPRECATED|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioPollutedWater|Float|w=0|The ratio of polluted water in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|NameHash|Integer|w=0|Provides the hash value for the name of the object as a 32 bit integer.}}&lt;br /&gt;
}}&lt;br /&gt;
{{Slots|logic=1&lt;br /&gt;
|{{Slots/row|name=Import|type=None}}&lt;br /&gt;
|{{Slots/row|name=Export|type=None}}&lt;br /&gt;
||{{Slots/row|name=Programmable Chip|type=ProgrammableChip}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Connections}}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Connection Name !! Index&lt;br /&gt;
|-&lt;br /&gt;
| [[Chute]] Input || 0&lt;br /&gt;
|-&lt;br /&gt;
| Chute Output || 1&lt;br /&gt;
|-&lt;br /&gt;
| Data || 2&lt;br /&gt;
|-&lt;br /&gt;
| [[Power]] || 3&lt;br /&gt;
|-&lt;br /&gt;
| Pipe Input || 4&lt;br /&gt;
|-&lt;br /&gt;
| Pipe Input || 5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
[https://steamcommunity.com/sharedfiles/filedetails/?id=3448074160 reference automation implementation by lisnaz]&lt;br /&gt;
[[Category:Machines]]&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=IC10/instructions&amp;diff=28171</id>
		<title>IC10/instructions</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=IC10/instructions&amp;diff=28171"/>
		<updated>2026-09-14T14:31:08Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: add jal ra workaround&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
See [[IC10]] for the primary page for the IC10 instruction set. This page lists all available instructions&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Utility ==&lt;br /&gt;
&lt;br /&gt;
{{ICInstruction|instruction=alias|description=Labels register or device reference with name, device references also affect what shows on the screws on the IC base.|syntax=alias str r?{{!}}d?&lt;br /&gt;
|example=&lt;br /&gt;
{{ICCode|&lt;br /&gt;
alias dAutoHydro1 d0&lt;br /&gt;
alias vTemperature r0&lt;br /&gt;
}}}}&lt;br /&gt;
{{ICInstruction|instruction=define|description=Creates a label that will be replaced throughout the program with the provided value.|syntax=define str num&lt;br /&gt;
|example=&lt;br /&gt;
{{ICCode|&lt;br /&gt;
define ultimateAnswer 42&lt;br /&gt;
move r0 ultimateAnswer # Store 42 in register 0&lt;br /&gt;
}}}}&lt;br /&gt;
{{ICInstruction|instruction=move|description=Register = provided num or register value.|syntax=move r? a(r?{{!}}num)&lt;br /&gt;
|example=&lt;br /&gt;
{{ICCode|move r0 42 # Store 42 in register 0}}}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = yield&lt;br /&gt;
| description = Pauses execution for 1 tick&lt;br /&gt;
| syntax = yield&lt;br /&gt;
}}{{ICInstruction&lt;br /&gt;
| instruction = sleep&lt;br /&gt;
| description = Pauses execution on the IC for a seconds&lt;br /&gt;
| syntax = sleep a(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = hcf&lt;br /&gt;
| description = Halt and catch fire&lt;br /&gt;
| note = Creates a small explosion, destroying the chip and starting fires on flammable atmospheres.&lt;br /&gt;
| syntax = hcf&lt;br /&gt;
}}&lt;br /&gt;
== Mathematical ==&lt;br /&gt;
&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = abs&lt;br /&gt;
| description = Register = the absolute value of a&lt;br /&gt;
| syntax = abs r? a(r?{{!}}num)&lt;br /&gt;
| example = {{ICCode|&lt;br /&gt;
define negativeNumber -10&lt;br /&gt;
abs r0 negativeNumber # Compute the absolute value of -10 and store it in register 0&lt;br /&gt;
}}&lt;br /&gt;
}}{{ICInstruction&lt;br /&gt;
| instruction = sgn&lt;br /&gt;
| syntax = sgn r a(r?{{!}}num)&lt;br /&gt;
| description = Stores the sign of a in the register: -1 if a is negative, 1 if positive, 0 if a is 0 (or not a number).&lt;br /&gt;
}}{{ICInstruction&lt;br /&gt;
| instruction = add&lt;br /&gt;
| description = Register = a + b.&lt;br /&gt;
| syntax = add r? a(r?{{!}}num) b(r?{{!}}num)&lt;br /&gt;
| example = {{ICCode|add r0 r0 1 # increment r0 by one}}&lt;br /&gt;
{{ICCode|&lt;br /&gt;
define num1 10&lt;br /&gt;
define num2 20&lt;br /&gt;
add r0 num1 num2 # Add 10 and 20 and store the result in register 0&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = ceil&lt;br /&gt;
| description = Register = smallest integer greater than a&lt;br /&gt;
| syntax = ceil r? a(r?{{!}}num)&lt;br /&gt;
| example = {{ICCode|&lt;br /&gt;
define floatNumber 10.3&lt;br /&gt;
ceil r0 floatNumber # Compute the ceiling of 10.3 and store it in register 0&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = div&lt;br /&gt;
| description = Register = a / b&lt;br /&gt;
| syntax = div r? a(r?{{!}}num) b(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = pow&lt;br /&gt;
| description = Stores the result of raising a to the power of b in the register. Follows IEEE-754 standard for floating point arithmetic.&lt;br /&gt;
| syntax = pow r? a(r?{{!}}num) b(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = exp&lt;br /&gt;
| description = exp(a) or e^a&lt;br /&gt;
| syntax = exp r? a(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = floor&lt;br /&gt;
| description = Register = largest integer less than a&lt;br /&gt;
| syntax = floor r? a(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = log&lt;br /&gt;
| description = base e log(a) or ln(a)&lt;br /&gt;
| syntax = log r? a(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = max&lt;br /&gt;
| description = Register = max of a or b&lt;br /&gt;
| note = If any of the values is NaN, NaN is returned.&lt;br /&gt;
| syntax = max r? a(r?{{!}}num) b(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = min&lt;br /&gt;
| description = Register = min of a or b&lt;br /&gt;
| note = If any of the values is NaN, NaN is returned.&lt;br /&gt;
| syntax = min r? a(r?{{!}}num) b(r?{{!}}num)&lt;br /&gt;
}}{{ICInstruction&lt;br /&gt;
| instruction = clamp&lt;br /&gt;
| syntax = clamp r? a(r?{{!}}num) min(r?{{!}}num) max(r?{{!}}num)&lt;br /&gt;
| description = Stores a clamped to the inclusive inclusive range [min, max] in the register provided.&lt;br /&gt;
| note = Functionally equivalent to min(max(a,min),max).&amp;lt;br&amp;gt;If any of the values are NaN, NaN is returned.&lt;br /&gt;
| example = clamp 100 10 50 = 50&amp;lt;br&amp;gt;&lt;br /&gt;
clamp 0 10 50 = 10&amp;lt;br&amp;gt;&lt;br /&gt;
clamp 20 10 50 = 20&amp;lt;br&amp;gt;&lt;br /&gt;
}}{{ICInstruction&lt;br /&gt;
| instruction = mod&lt;br /&gt;
| description = Register = a mod b (note: NOT a % b)&lt;br /&gt;
| syntax = mod r? a(r?{{!}}num) b(r?{{!}}num)&lt;br /&gt;
| example = {{ICCode|&lt;br /&gt;
mod r0 10 20 # Expected: r0 = 10&lt;br /&gt;
mod r1 22 20 # Expected: r1 = 2&lt;br /&gt;
mod r2 22 -20 # Expected: r2 = 18&lt;br /&gt;
mod r2 22 -10 # Expected: r2 = 18&lt;br /&gt;
mod r2 -7 4 # Expected: r2 = 1&lt;br /&gt;
mod r2 -7 9 # Expected: r2 = 2&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction|instruction=mul|description=Register = a * b|syntax=mul r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=rand|description=Register = a random value x with 0 &amp;lt;= x &amp;lt; 1|syntax=rand r?}}&lt;br /&gt;
{{ICInstruction|instruction=round|description=Register = a rounded to nearest integer|syntax=round r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=sqrt|description=Register = square root of a|syntax=sqrt r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=sub|description=Register = a - b.|syntax=sub r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=trunc|description=Register = a with fractional part removed|syntax=trunc r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=lerp|description=Linearly interpolates between a and b by the ratio c, and places the result in the register provided. The ratio c will be clamped between 0 and 1.|syntax=lerp r? a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
&lt;br /&gt;
=== Mathematical / Trigonometric ===&lt;br /&gt;
&lt;br /&gt;
{{ICInstruction|instruction=acos|description=Returns the angle (radians) whos cos is the specified value|syntax=acos r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=asin|description=Returns the angle (radians) whos sine is the specified value|syntax=asin r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=atan|description=Returns the angle (radians) whos tan is the specified value|syntax=atan r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=atan2|description=Returns the angle (radians) whose tangent is the quotient of two specified values: a (y) and b (x)|syntax=atan2 r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=cos|description=Returns the cosine of the specified angle (radians)|syntax=cos r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=sin|description=Returns the sine of the specified angle (radians)|syntax=sin r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=tan|description=Returns the tan of the specified angle (radians) |syntax=tan r? a(r?{{!}}num)}}&lt;br /&gt;
&lt;br /&gt;
== Stack ==&lt;br /&gt;
&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = clr&lt;br /&gt;
| description = Clears the stack memory for the provided device.&lt;br /&gt;
| note = Throws a DeviceNotFound exception when used on inaccessible devices.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Throws a MemoryNotReadable exception when used on devices without a writable stack memory. (likely a bug)&lt;br /&gt;
| syntax = clr d?&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = clrd&lt;br /&gt;
| description = Seeks directly for the provided device id and clears the stack memory of that device&lt;br /&gt;
| note = Throws a DeviceNotFound exception when used on inaccessible devices.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Throws a MemoryNotWriteable exception when used on devices without a writable stack memory.&lt;br /&gt;
| syntax = clrd id(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = get&lt;br /&gt;
| description = Using the provided device, attempts to read the stack value at the provided address, and places it in the register.&lt;br /&gt;
| note = Throws a DeviceNotFound exception when used on inaccessible devices.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Throws a MemoryNotReadable exception when used on devices without a readable stack memory.&lt;br /&gt;
| syntax = get r? device(d?{{!}}r?{{!}}id) address(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = getd&lt;br /&gt;
| description = Seeks directly for the provided device id, attempts to read the stack value at the provided address, and places it in the register.&lt;br /&gt;
| note = Throws a DeviceNotFound exception when used on inaccessible devices.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Throws a MemoryNotReadable exception when used on devices without a readable stack memory.&lt;br /&gt;
| syntax = getd r? id(r?{{!}}id) address(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = peek&lt;br /&gt;
| description = Reads the value at stack address sp-1 and saves it into the provided register.&lt;br /&gt;
| note = Out-of-bounds reads result in a stack underflow/overflow exception.&lt;br /&gt;
| syntax = peek r?&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = poke&lt;br /&gt;
| description = Stores the provided value at the provided address in the stack.&lt;br /&gt;
| note = Out-of-bounds writes result in a stack underflow/overflow exception.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There is no built-in instruction for reading IC10 stack memory at arbitrary addresses. Although circuit housings can use get db, machines with an IC slot need to use a stack pointer assignment followed by a peek as a workaround.&lt;br /&gt;
| syntax = poke address(r?{{!}}num) value(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = pop&lt;br /&gt;
| description = Decrements the stack pointer, then returns the writes the value at the resulting stack pointer address into the provided register.&lt;br /&gt;
| note = Out-of-bounds reads result in a stack underflow/overflow exception.&lt;br /&gt;
| syntax = pop r?&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = push&lt;br /&gt;
| description = Writes the provided value to the stack pointer address, then increments the stack pointer.&lt;br /&gt;
| note = Out-of-bounds writes throw a Stack underflow/overflow exception.&lt;br /&gt;
| syntax = push a(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = put&lt;br /&gt;
| description = Using the provided device, attempts to write the provided value to its stack at the provided address.&lt;br /&gt;
| note = Throws a DeviceNotFound exception when used on inaccessible devices.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Throws a MemoryNotWritable exception when used on devices without a writable stack memory.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Intercepts exceptions thrown by the device during the attempt to write to the device&#039;s stack, passing stack overflow/underflow exceptions through and throwing Unknown exceptions for other exception types.&lt;br /&gt;
| syntax = put device(d?{{!}}r?{{!}}id) address(r?{{!}}num) value(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = putd&lt;br /&gt;
| description = Seeks directly for the provided device id, attempts to write the provided value to the stack at the provided address.&lt;br /&gt;
| note = Throws a DeviceNotFound exception when used on inaccessible devices.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Throws a MemoryNotWritable exception when used on devices without a writable stack memory.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Intercepts exceptions thrown by the device during the attempt to write to the device&#039;s stack, passing stack overflow/underflow exceptions through and throwing Unknown exceptions for other exception types.&lt;br /&gt;
| syntax = putd id(r?{{!}}id) address(r?{{!}}num) value(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Slot/Logic ==&lt;br /&gt;
&lt;br /&gt;
{{ICInstruction|instruction=l|description=Loads device LogicType to register by housing index value.|syntax=l r? device(d?{{!}}r?{{!}}id) logicType&lt;br /&gt;
|example=&lt;br /&gt;
Read from the device on d0 into register 0&lt;br /&gt;
{{ICCode|l r0 d0 Setting}}&lt;br /&gt;
Read the pressure from a sensor&lt;br /&gt;
{{ICCode|l r1 d5 Pressure}}&lt;br /&gt;
This also works with aliases. For example:&lt;br /&gt;
{{ICCode|&lt;br /&gt;
alias Sensor d0&lt;br /&gt;
l r0 Sensor Temperature&lt;br /&gt;
}}}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = lr&lt;br /&gt;
| description = Loads reagent of device&#039;s ReagentMode where a hash of the reagent type to check for. ReagentMode can be either Contents (0), Required (1), Recipe (2). Can use either the word, or the number.&lt;br /&gt;
| note = Instruction performs different actions depending on the provided reagent mode.&lt;br /&gt;
&amp;lt;br&amp;gt;Valid reagentMode values:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;LogicReagentMode.Contents (0): Return how much reagentHash reagent is present in the device.&lt;br /&gt;
&amp;lt;br&amp;gt;LogicReagentMode.Required (1): Return how much additional reagentHash reagent is missing to complete the device&#039;s currently selected recipe.&lt;br /&gt;
&amp;lt;br&amp;gt;LogicReagentMode.Recipe (2): Return how much reagentHash reagent the device&#039;s currently selected recipe requires.&lt;br /&gt;
&amp;lt;br&amp;gt;LogicReagentMode.TotalContents (3): Return the total amount of reagents a  device contains, ignoring reagentHash. Equivalent to &amp;quot;l r device Reagents&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Other reagent modes throw an UnhandledReagentMode exception.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Instruction throws an IncorrectReagentDevice exception on Required and Recipe LogicReagentModes if attempting to use them on a device that can&#039;t select a recipe, such as a Furnace.&lt;br /&gt;
| syntax = lr r? device(d?{{!}}r?{{!}}id) reagentMode reagentHash&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction|instruction=ls|description=Loads slot LogicSlotType on device to register.|syntax=ls r? device(d?{{!}}r?{{!}}id) slotIndex logicSlotType&lt;br /&gt;
|example=&lt;br /&gt;
Read from the second slot of device on d0, stores 1 in r0 if it&#039;s occupied, 0 otherwise.&lt;br /&gt;
{{ICCode|ls r0 d0 2 Occupied}}&lt;br /&gt;
And here is the code to read the charge of an AIMeE:&lt;br /&gt;
{{ICCode|&lt;br /&gt;
alias robot d0&lt;br /&gt;
alias charge r10&lt;br /&gt;
ls charge robot 0 Charge&lt;br /&gt;
}}}}&lt;br /&gt;
{{ICInstruction|instruction=s|description=Stores register value to LogicType on device by housing index value.|syntax=s device(d?{{!}}r?{{!}}id) logicType r?&lt;br /&gt;
|example=&lt;br /&gt;
{{ICCode|&lt;br /&gt;
s d0 Setting r0&lt;br /&gt;
}}}}&lt;br /&gt;
{{ICInstruction|instruction=ss|description=Stores register value to device stored in a slot LogicSlotType on device.|syntax=ss device(d?{{!}}r?{{!}}id) slotIndex logicSlotType r?}}&lt;br /&gt;
{{ICInstruction|instruction=rmap|description=Given a reagent hash (signed 32bit int), store the corresponding prefab hash that the device expects to fulfill the reagent requirement. For example, on an autolathe, the hash for Iron will store the hash for ItemIronIngot.|syntax=rmap r? d? reagentHash(r?{{!}}num)}}&lt;br /&gt;
&lt;br /&gt;
=== Slot/Logic / Batched ===&lt;br /&gt;
&lt;br /&gt;
{{ICInstruction|instruction=lb|description=Loads LogicType from all output network devices with provided type hash using the provide batch mode. Average (0), Sum (1), Minimum (2), Maximum (3). Can use either the word, or the number.|syntax=lb r? deviceHash logicType batchMode&lt;br /&gt;
|example=&lt;br /&gt;
{{ICCode|lb r0 HASH(&amp;quot;StructureWallLight&amp;quot;) On Sum}}}}&lt;br /&gt;
{{ICInstruction|instruction=lbn|description=Loads LogicType from all output network devices with provided type and name hashes using the provide batch mode. Average (0), Sum (1), Minimum (2), Maximum (3). Can use either the word, or the number.|syntax=lbn r? deviceHash nameHash logicType batchMode}}&lt;br /&gt;
{{ICInstruction|instruction=lbns|description=Loads LogicSlotType from slotIndex from all output network devices with provided type and name hashes using the provide batch mode. Average (0), Sum (1), Minimum (2), Maximum (3). Can use either the word, or the number.|syntax=lbns r? deviceHash nameHash slotIndex logicSlotType batchMode}}&lt;br /&gt;
{{ICInstruction|instruction=lbs|description=Loads LogicSlotType from slotIndex from all output network devices with provided type hash using the provide batch mode. Average (0), Sum (1), Minimum (2), Maximum (3). Can use either the word, or the number.|syntax=lbs r? deviceHash slotIndex logicSlotType batchMode}}&lt;br /&gt;
{{ICInstruction|instruction=sb|description=Stores register value to LogicType on all output network devices with provided type hash.|syntax=sb deviceHash logicType r?&lt;br /&gt;
|example=&lt;br /&gt;
{{ICCode|sb HASH(&amp;quot;StructureWallLight&amp;quot;) On 1}}}}&lt;br /&gt;
{{ICInstruction|instruction=sbn|description=Stores register value to LogicType on all output network devices with provided type hash and name.|syntax=sbn deviceHash nameHash logicType r?}}&lt;br /&gt;
{{ICInstruction|instruction=sbs|description=Stores register value to LogicSlotType on all output network devices with provided type hash in the provided slot.|syntax=sbs deviceHash slotIndex logicSlotType r?}}&lt;br /&gt;
&lt;br /&gt;
== Bitwise ==&lt;br /&gt;
&lt;br /&gt;
{{ICInstruction|instruction=and|description=Performs a bitwise logical AND operation on the binary representation of two values. Each bit of the result is determined by evaluating the corresponding bits of the input values. If both bits are 1, the resulting bit is set to 1. Otherwise the resulting bit is set to 0.|syntax=and r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=nor|description=Performs a bitwise logical NOR (NOT OR) operation on the binary representation of two values. Each bit of the result is determined by evaluating the corresponding bits of the input values. If both bits are 0, the resulting bit is set to 1. Otherwise, if at least one bit is 1, the resulting bit is set to 0.|syntax=nor r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=not|description=Performs a bitwise logical NOT operation flipping each bit of the input value, resulting in a binary complement. If a bit is 1, it becomes 0, and if a bit is 0, it becomes 1.|syntax=not r? a(r?{{!}}num)&lt;br /&gt;
|note=&lt;br /&gt;
This is a bitwise operation, the NOT of 1 =&amp;gt; -2, etc. You may want to use seqz instead}}&lt;br /&gt;
{{ICInstruction|instruction=or|description=Performs a bitwise logical OR operation on the binary representation of two values. Each bit of the result is determined by evaluating the corresponding bits of the input values. If either bit is 1, the resulting bit is set to 1. If both bits are 0, the resulting bit is set to 0.|syntax=or r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=sla|description=Performs a bitwise arithmetic left shift operation on the binary representation of a value. It shifts the bits to the left and fills the vacated rightmost bits with zeros (note that this is indistinguishable from &#039;sll&#039;).|syntax=sla r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=sll|description=Performs a bitwise logical left shift operation on the binary representation of a value. It shifts the bits to the left and fills the vacated rightmost bits with zeros.|syntax=sll r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=sra|description=Performs a bitwise arithmetic right shift operation on the binary representation of a value. It shifts the bits to the right and fills the vacated leftmost bits with a copy of the sign bit (the most significant bit).|syntax=sra r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=srl|description=Performs a bitwise logical right shift operation on the binary representation of a value. It shifts the bits to the right and fills the vacated leftmost bits with zeros|syntax=srl r? a(r?{{!}}num) b(r?{{!}}num)}}{{ICInstruction&lt;br /&gt;
| instruction = rol&lt;br /&gt;
| syntax = rol r? a(r?{{!}}num) b(r?{{!}}num)&lt;br /&gt;
| description = Performs a bitwise left rotation on the binary representation of a by b places, wrapping the bits shifted out of the most significant position back into the least significant position.&lt;br /&gt;
| example = rol $DEADBEEFCAFE2000 16 -&amp;gt; $BEEFCAFE2000DEAD&lt;br /&gt;
}}{{ICInstruction&lt;br /&gt;
| instruction = ror&lt;br /&gt;
| syntax = ror r? a(r?{{!}}num) b(r?{{!}}num)&lt;br /&gt;
| description = Performs a bitwise right rotation on the binary representation of A by B places, wrapping the bits shifted out of the least significant position back into the most significant position.&lt;br /&gt;
| example = ror $1234, 4 -&amp;gt; $4000000000000123&lt;br /&gt;
}}{{ICInstruction|instruction=xor|description=Performs a bitwise logical XOR (exclusive OR) operation on the binary representation of two values. Each bit of the result is determined by evaluating the corresponding bits of the input values. If the bits are different (one bit is 0 and the other is 1), the resulting bit is set to 1. If the bits are the same (both 0 or both 1), the resulting bit is set to 0.|syntax=xor r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = ext&lt;br /&gt;
| description = Extracts a bit field from source value, beginning at bit offset for length bits and places result in the provided register. Payload cannot exceed 53 bits in final length.&lt;br /&gt;
| note = Throws a ShiftUnderflow exception if offset is smaller than 1 or length is smaller than 0.&amp;lt;br&amp;gt;&lt;br /&gt;
Throws a ShiftOverflow exception if offset is greater than or equal to 53 bits.&amp;lt;br&amp;gt;&lt;br /&gt;
Throws a PayloadOverflow exception if length is greater than 53 bits.&lt;br /&gt;
| example = {{ICCode|&lt;br /&gt;
move r0 $DEADBEEF&lt;br /&gt;
ext r1 r0 8 16 #After execution, r1&#039;s value is $ADBE&lt;br /&gt;
}}&lt;br /&gt;
| syntax = ext r? source(r?{{!}}num) offset(r?{{!}}num) length(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = ins&lt;br /&gt;
| description = Inserts a bit field into the provided register, beginning at bit offset for length bits. Payload cannot exceed 53 bits in final length.&lt;br /&gt;
| syntax = ins r? field(r?{{!}}num) offset(r?{{!}}num) length(r?{{!}}num)&lt;br /&gt;
| note = Throws a ShiftUnderflow exception if length is smaller than 1 or offset is smaller than 0.&amp;lt;br&amp;gt;&lt;br /&gt;
Throws a ShiftOverflow exception if offset is greater than 53 bits.&amp;lt;br&amp;gt;&lt;br /&gt;
Throws a PayloadOverflow exception if offset+length is greater to or equal to 53 bits.&amp;lt;br&amp;gt;&lt;br /&gt;
| example = {{ICCode|move r0 $DE0000EF&lt;br /&gt;
move r1 $ADBE&lt;br /&gt;
ins r0 r1 8 16 #inserts field r1 at bit 8 for 16 bits, result: $DEADBEEF}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Comparison ==&lt;br /&gt;
&lt;br /&gt;
{{ICInstruction|instruction=select|description=Register = b if a is non-zero, otherwise c|syntax=select r? a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)&lt;br /&gt;
|example=&lt;br /&gt;
&amp;lt;b&amp;gt;1)&amp;lt;/b&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
move r0 &amp;lt;s style=&amp;quot;text-decoration-line:underline;text-decoration-color:red;&amp;quot;&amp;gt;0&amp;lt;/s&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
select &amp;lt;s style=&amp;quot;text-decoration-line:underline;text-decoration-color:red;&amp;gt;r1&amp;lt;/s&amp;gt; r0 10 &amp;lt;s style=&amp;quot;text-decoration-line:underline;text-decoration-color:red;&amp;gt;200&amp;lt;/s&amp;gt;&lt;br /&gt;
{{ICCode|&lt;br /&gt;
move r0 0&lt;br /&gt;
select r1 r0 10 200&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br/&amp;gt;after run, &amp;lt;s style=&amp;quot;text-decoration-line:underline;text-decoration-color:red;&amp;quot;&amp;gt;r1 = 200&amp;lt;/s&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;b&amp;gt;2)&amp;lt;/b&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
move r0 &amp;lt;s style=&amp;quot;text-decoration-line:underline;text-decoration-color:red;&amp;quot;&amp;gt;5&amp;lt;/s&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
select &amp;lt;s style=&amp;quot;text-decoration-line:underline;text-decoration-color:red;&amp;gt;r1&amp;lt;/s&amp;gt; r0 &amp;lt;s style=&amp;quot;text-decoration-line:underline;text-decoration-color:red;&amp;gt;10&amp;lt;/s&amp;gt; 200&lt;br /&gt;
{{ICCode|&lt;br /&gt;
move r0 1&lt;br /&gt;
select r1 r0 10 100&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br/&amp;gt;after run, &amp;lt;s style=&amp;quot;text-decoration-line:underline;text-decoration-color:red;&amp;quot;&amp;gt;r1 = 10&amp;lt;/s&amp;gt;&lt;br /&gt;
|note=&lt;br /&gt;
This operation can be used as a simple ternary condition}}&lt;br /&gt;
&lt;br /&gt;
=== Comparison / Device Pin ===&lt;br /&gt;
&lt;br /&gt;
{{ICInstruction|instruction=sdns|description=Register = 1 if device is not set, otherwise 0|syntax=sdns r? device(d?{{!}}r?{{!}}id)}}&lt;br /&gt;
{{ICInstruction|instruction=sdse|description=Register = 1 if device is set, otherwise 0.|syntax=sdse r? device(d?{{!}}r?{{!}}id)}}&lt;br /&gt;
&lt;br /&gt;
=== Comparison / Value ===&lt;br /&gt;
&lt;br /&gt;
{{ICInstruction|instruction=sap|description=Register = 1 if abs(a - b) &amp;lt;= max(c * max(abs(a), abs(b)), float.epsilon * 8), otherwise 0|syntax=sap r? a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)&lt;br /&gt;
|example=&lt;br /&gt;
Set register to 1 if a and b are close enough to each other with the scaling factor of c. Equivalent to Python [https://docs.python.org/3/library/math.html#math.isclose math.isclose]}}&lt;br /&gt;
{{ICInstruction|instruction=sapz|description=Register = 1 if abs(a) &amp;lt;= max(b * abs(a), float.epsilon * 8), otherwise 0|syntax=sapz r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=seq|description=Register = 1 if a == b, otherwise 0|syntax=seq r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=seqz|description=Register = 1 if a == 0, otherwise 0|syntax=seqz r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=sge|description=Register = 1 if a &amp;gt;= b, otherwise 0|syntax=sge r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=sgez|description=Register = 1 if a &amp;gt;= 0, otherwise 0|syntax=sgez r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=sgt|description=Register = 1 if a &amp;gt; b, otherwise 0|syntax=sgt r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=sgtz|description=Register = 1 if a &amp;gt; 0, otherwise 0|syntax=sgtz r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=sle|description=Register = 1 if a &amp;lt;= b, otherwise 0|syntax=sle r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=slez|description=Register = 1 if a &amp;lt;= 0, otherwise 0|syntax=slez r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=slt|description=Register = 1 if a &amp;lt; b, otherwise 0|syntax=slt r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=sltz|description=Register = 1 if a &amp;lt; 0, otherwise 0|syntax=sltz r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=sna|description=Register = 1 if abs(a - b) &amp;gt; max(c * max(abs(a), abs(b)), float.epsilon * 8), otherwise 0|syntax=sna r? a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=snan|description=Register = 1 if a is NaN, otherwise 0|syntax=snan r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=snanz|description=Register = 0 if a is NaN, otherwise 1|syntax=snanz r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=snaz|description=Register = 1 if abs(a) &amp;gt; max(b * abs(a), float.epsilon), otherwise 0|syntax=snaz r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=sne|description=Register = 1 if a != b, otherwise 0|syntax=sne r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=snez|description=Register = 1 if a != 0, otherwise 0|syntax=snez r? a(r?{{!}}num)}}&lt;br /&gt;
&lt;br /&gt;
== Branching ==&lt;br /&gt;
&lt;br /&gt;
{{ICInstruction|instruction=j|description=Jump execution to line a|syntax=j int&lt;br /&gt;
|example=&lt;br /&gt;
{{ICCode|j 0 # jump line 0}}&lt;br /&gt;
{{ICCode|&lt;br /&gt;
j label # jump to a label&lt;br /&gt;
&lt;br /&gt;
label:&lt;br /&gt;
# your code here&lt;br /&gt;
}}}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = jal&lt;br /&gt;
| description = Jump execution to line a and store next line number in ra&lt;br /&gt;
| syntax = jal int&lt;br /&gt;
| note = Actual behavior as of The Power Line Update (Q3 2026) stores the next line number in ra before jumping execution to line a. This results in jal ra being a no-op (likely a bug).&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
As a workaround, an always-taken branch-and-link can be used instead (for example, beqzal 0 ra).&lt;br /&gt;
| example = jal provides a way to do function calls in IC10 mips&lt;br /&gt;
&lt;br /&gt;
{{ICCode|&lt;br /&gt;
move r0 1000&lt;br /&gt;
move r1 0&lt;br /&gt;
start:&lt;br /&gt;
jal average&lt;br /&gt;
s db Setting r0&lt;br /&gt;
yield&lt;br /&gt;
j start&lt;br /&gt;
&lt;br /&gt;
average:&lt;br /&gt;
add r0 r0 r1&lt;br /&gt;
div r0 r0 2&lt;br /&gt;
j ra # jump back&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction|instruction=jr|description=Relative jump to line a|syntax=jr int}}&lt;br /&gt;
&lt;br /&gt;
=== Branching / Device Pin ===&lt;br /&gt;
&lt;br /&gt;
{{ICInstruction|instruction=bdnvl|description=Will branch to line a if the provided device not valid for a load instruction for the provided logic type.|syntax=bdnvl device(d?{{!}}r?{{!}}id) logicType a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bdnvs|description=Will branch to line a if the provided device not valid for a store instruction for the provided logic type.|syntax=bdnvs device(d?{{!}}r?{{!}}id) logicType a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bdns|description=Branch to line a if device d isn&#039;t set|syntax=bdns d? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bdnsal|description=Jump execution to line a and store next line number if device is not set|syntax=bdnsal d? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bdse|description=Branch to line a if device d is set|syntax=bdse d? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bdseal|description=Jump execution to line a and store next line number if device is set|syntax=bdseal d? a(r?{{!}}num)&lt;br /&gt;
|example=&lt;br /&gt;
{{ICCode|&lt;br /&gt;
#Store line number and jump to line 32 if d0 is assigned.&lt;br /&gt;
bdseal d0 32&lt;br /&gt;
}}&lt;br /&gt;
{{ICCode|&lt;br /&gt;
#Store line in ra and jump to label HarvestCrop if device d0 is assigned.&lt;br /&gt;
bdseal d0 HarvestCrop&lt;br /&gt;
}}}}&lt;br /&gt;
{{ICInstruction|instruction=brdns|description=Relative branch to line a if device is not set|syntax=brdns d? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=brdse|description=Relative branch to line a if device is set|syntax=brdse d? a(r?{{!}}num)}}&lt;br /&gt;
&lt;br /&gt;
=== Branching / Comparison ===&lt;br /&gt;
&lt;br /&gt;
{{ICInstruction|instruction=bap|description=Branch to line d if abs(a - b) &amp;lt;= max(c * max(abs(a), abs(b)), float.epsilon * 8)|syntax=bap a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num) d(r?{{!}}num)&lt;br /&gt;
|example=&lt;br /&gt;
Branch if a and b are close enough to each other with the scaling factor of c. Equivalent to Python [https://docs.python.org/3/library/math.html#math.isclose math.isclose]}}&lt;br /&gt;
{{ICInstruction|instruction=brap|description=Relative branch to line d if abs(a - b) &amp;lt;= max(c * max(abs(a), abs(b)), float.epsilon * 8)|syntax=brap a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num) d(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bapal|description=Branch to line c if a != b and store next line number in ra|syntax=bapal a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num) d(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bapz|description=Branch to line c if abs(a) &amp;lt;= max(b * abs(a), float.epsilon * 8)|syntax=bapz a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=brapz|description=Relative branch to line c if abs(a) &amp;lt;= max(b * abs(a), float.epsilon * 8)|syntax=brapz a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bapzal|description=Branch to line c if abs(a) &amp;lt;= max(b * abs(a), float.epsilon * 8) and store next line number in ra|syntax=bapzal a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=beq|description=Branch to line c if a == b|syntax=beq a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=breq|description=Relative branch to line c if a == b|syntax=breq a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=beqal|description=Branch to line c if a == b and store next line number in ra|syntax=beqal a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=beqz|description=Branch to line b if a == 0|syntax=beqz a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=breqz|description=Relative branch to line b if a == 0|syntax=breqz a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=beqzal|description=Branch to line b if a == 0 and store next line number in ra|syntax=beqzal a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bge|description=Branch to line c if a &amp;gt;= b|syntax=bge a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=brge|description=Relative branch to line c if a &amp;gt;= b|syntax=brge a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bgeal|description=Branch to line c if a &amp;gt;= b and store next line number in ra|syntax=bgeal a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bgez|description=Branch to line b if a &amp;gt;= 0|syntax=bgez a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=brgez|description=Relative branch to line b if a &amp;gt;= 0|syntax=brgez a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bgezal|description=Branch to line b if a &amp;gt;= 0 and store next line number in ra|syntax=bgezal a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bgt|description=Branch to line c if a &amp;gt; b|syntax=bgt a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)&lt;br /&gt;
|example=&lt;br /&gt;
An example of a &#039;&#039;&#039;Schmitt&#039;&#039;&#039; trigger, turning on a device if the temperature is too low, and turning it off if it&#039;s too high and finally&lt;br /&gt;
doing nothing if the temperature is within the desired range.&lt;br /&gt;
{{ICCode|&lt;br /&gt;
alias sensor d0&lt;br /&gt;
alias device d1&lt;br /&gt;
&lt;br /&gt;
define mintemp 293.15&lt;br /&gt;
define maxtemp 298.15&lt;br /&gt;
&lt;br /&gt;
start:&lt;br /&gt;
yield&lt;br /&gt;
l r0 sensor Temperature&lt;br /&gt;
# If the temperature &amp;lt; mintemp, turn on the device&lt;br /&gt;
blt r0 mintemp turnOn&lt;br /&gt;
# If the temperature &amp;gt; maxtemp, turn off the device&lt;br /&gt;
bgt r0 maxtemp turnOff&lt;br /&gt;
j start&lt;br /&gt;
&lt;br /&gt;
turnOn:&lt;br /&gt;
s device On 1&lt;br /&gt;
j start&lt;br /&gt;
turnOff:&lt;br /&gt;
s device On 0&lt;br /&gt;
j start&lt;br /&gt;
}}}}&lt;br /&gt;
{{ICInstruction|instruction=brgt|description=relative branch to line c if a &amp;gt; b|syntax=brgt a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bgtal|description=Branch to line c if a &amp;gt; b and store next line number in ra|syntax=bgtal a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bgtz|description=Branch to line b if a &amp;gt; 0|syntax=bgtz a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=brgtz|description=Relative branch to line b if a &amp;gt; 0|syntax=brgtz a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bgtzal|description=Branch to line b if a &amp;gt; 0 and store next line number in ra|syntax=bgtzal a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=ble|description=Branch to line c if a &amp;lt;= b|syntax=ble a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=brle|description=Relative branch to line c if a &amp;lt;= b|syntax=brle a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bleal|description=Branch to line c if a &amp;lt;= b and store next line number in ra|syntax=bleal a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=blez|description=Branch to line b if a &amp;lt;= 0|syntax=blez a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=brlez|description=Relative branch to line b if a &amp;lt;= 0|syntax=brlez a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=blezal|description=Branch to line b if a &amp;lt;= 0 and store next line number in ra|syntax=blezal a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=blt|description=Branch to line c if a &amp;lt; b|syntax=blt a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)&lt;br /&gt;
|example=&lt;br /&gt;
An example of a &#039;&#039;&#039;Schmitt&#039;&#039;&#039; trigger, turning on a device if the temperature is too low, and turning it off if it&#039;s too high and finally&lt;br /&gt;
doing nothing if the temperature is within the desired range.&lt;br /&gt;
{{ICCode|&lt;br /&gt;
alias sensor d0&lt;br /&gt;
alias device d1&lt;br /&gt;
&lt;br /&gt;
define mintemp 293.15&lt;br /&gt;
define maxtemp 298.15&lt;br /&gt;
&lt;br /&gt;
start:&lt;br /&gt;
yield&lt;br /&gt;
l r0 sensor Temperature&lt;br /&gt;
# If the temperature &amp;lt; mintemp, turn on the device&lt;br /&gt;
blt r0 mintemp turnOn&lt;br /&gt;
# If the temperature &amp;gt; maxtemp, turn off the device&lt;br /&gt;
bgt r0 maxtemp turnOff&lt;br /&gt;
j start&lt;br /&gt;
&lt;br /&gt;
turnOn:&lt;br /&gt;
s device On 1&lt;br /&gt;
j start&lt;br /&gt;
turnOff:&lt;br /&gt;
s device On 0&lt;br /&gt;
j start&lt;br /&gt;
}}}}&lt;br /&gt;
{{ICInstruction|instruction=brlt|description=Relative branch to line c if a &amp;lt; b|syntax=brlt a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bltal|description=Branch to line c if a &amp;lt; b and store next line number in ra|syntax=bltal a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bltz|description=Branch to line b if a &amp;lt; 0|syntax=bltz a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=brltz|description=Relative branch to line b if a &amp;lt; 0|syntax=brltz a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bltzal|description=Branch to line b if a &amp;lt; 0 and store next line number in ra|syntax=bltzal a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bna|description=Branch to line d if abs(a - b) &amp;gt; max(c * max(abs(a), abs(b)), float.epsilon * 8)|syntax=bna a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num) d(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=brna|description=Relative branch to line d if abs(a - b) &amp;gt; max(c * max(abs(a), abs(b)), float.epsilon * 8)|syntax=brna a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num) d(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bnaal|description=Branch to line d if abs(a - b) &amp;lt;= max(c * max(abs(a), abs(b)), float.epsilon * 8) and store next line number in ra|syntax=bnaal a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num) d(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bnan|description=Branch to line b if a is not a number (NaN)|syntax=bnan a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=brnan|description=Relative branch to line b if a is not a number (NaN)|syntax=brnan a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bnaz|description=Branch to line c if abs(a) &amp;gt; max (b * abs(a), float.epsilon * 8)|syntax=bnaz a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=brnaz|description=Relative branch to line c if abs(a) &amp;gt; max(b * abs(a), float.epsilon * 8)|syntax=brnaz a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bnazal|description=Branch to line c if abs(a) &amp;gt; max (b * abs(a), float.epsilon * 8) and store next line number in ra|syntax=bnazal a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bne|description=Branch to line c if a != b|syntax=bne a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=brne|description=Relative branch to line c if a != b|syntax=brne a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bneal|description=Branch to line c if a != b and store next line number in ra|syntax=bneal a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bnez|description=branch to line b if a != 0|syntax=bnez a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=brnez|description=Relative branch to line b if a != 0|syntax=brnez a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bnezal|description=Branch to line b if a != 0 and store next line number in ra|syntax=bnezal a(r?{{!}}num) b(r?{{!}}num)}}&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=IC10/instructions&amp;diff=28170</id>
		<title>IC10/instructions</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=IC10/instructions&amp;diff=28170"/>
		<updated>2026-09-14T09:25:14Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: /* Branching */ document potential bug in jal ra behavior&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
See [[IC10]] for the primary page for the IC10 instruction set. This page lists all available instructions&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Utility ==&lt;br /&gt;
&lt;br /&gt;
{{ICInstruction|instruction=alias|description=Labels register or device reference with name, device references also affect what shows on the screws on the IC base.|syntax=alias str r?{{!}}d?&lt;br /&gt;
|example=&lt;br /&gt;
{{ICCode|&lt;br /&gt;
alias dAutoHydro1 d0&lt;br /&gt;
alias vTemperature r0&lt;br /&gt;
}}}}&lt;br /&gt;
{{ICInstruction|instruction=define|description=Creates a label that will be replaced throughout the program with the provided value.|syntax=define str num&lt;br /&gt;
|example=&lt;br /&gt;
{{ICCode|&lt;br /&gt;
define ultimateAnswer 42&lt;br /&gt;
move r0 ultimateAnswer # Store 42 in register 0&lt;br /&gt;
}}}}&lt;br /&gt;
{{ICInstruction|instruction=move|description=Register = provided num or register value.|syntax=move r? a(r?{{!}}num)&lt;br /&gt;
|example=&lt;br /&gt;
{{ICCode|move r0 42 # Store 42 in register 0}}}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = yield&lt;br /&gt;
| description = Pauses execution for 1 tick&lt;br /&gt;
| syntax = yield&lt;br /&gt;
}}{{ICInstruction&lt;br /&gt;
| instruction = sleep&lt;br /&gt;
| description = Pauses execution on the IC for a seconds&lt;br /&gt;
| syntax = sleep a(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = hcf&lt;br /&gt;
| description = Halt and catch fire&lt;br /&gt;
| note = Creates a small explosion, destroying the chip and starting fires on flammable atmospheres.&lt;br /&gt;
| syntax = hcf&lt;br /&gt;
}}&lt;br /&gt;
== Mathematical ==&lt;br /&gt;
&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = abs&lt;br /&gt;
| description = Register = the absolute value of a&lt;br /&gt;
| syntax = abs r? a(r?{{!}}num)&lt;br /&gt;
| example = {{ICCode|&lt;br /&gt;
define negativeNumber -10&lt;br /&gt;
abs r0 negativeNumber # Compute the absolute value of -10 and store it in register 0&lt;br /&gt;
}}&lt;br /&gt;
}}{{ICInstruction&lt;br /&gt;
| instruction = sgn&lt;br /&gt;
| syntax = sgn r a(r?{{!}}num)&lt;br /&gt;
| description = Stores the sign of a in the register: -1 if a is negative, 1 if positive, 0 if a is 0 (or not a number).&lt;br /&gt;
}}{{ICInstruction&lt;br /&gt;
| instruction = add&lt;br /&gt;
| description = Register = a + b.&lt;br /&gt;
| syntax = add r? a(r?{{!}}num) b(r?{{!}}num)&lt;br /&gt;
| example = {{ICCode|add r0 r0 1 # increment r0 by one}}&lt;br /&gt;
{{ICCode|&lt;br /&gt;
define num1 10&lt;br /&gt;
define num2 20&lt;br /&gt;
add r0 num1 num2 # Add 10 and 20 and store the result in register 0&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = ceil&lt;br /&gt;
| description = Register = smallest integer greater than a&lt;br /&gt;
| syntax = ceil r? a(r?{{!}}num)&lt;br /&gt;
| example = {{ICCode|&lt;br /&gt;
define floatNumber 10.3&lt;br /&gt;
ceil r0 floatNumber # Compute the ceiling of 10.3 and store it in register 0&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = div&lt;br /&gt;
| description = Register = a / b&lt;br /&gt;
| syntax = div r? a(r?{{!}}num) b(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = pow&lt;br /&gt;
| description = Stores the result of raising a to the power of b in the register. Follows IEEE-754 standard for floating point arithmetic.&lt;br /&gt;
| syntax = pow r? a(r?{{!}}num) b(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = exp&lt;br /&gt;
| description = exp(a) or e^a&lt;br /&gt;
| syntax = exp r? a(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = floor&lt;br /&gt;
| description = Register = largest integer less than a&lt;br /&gt;
| syntax = floor r? a(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = log&lt;br /&gt;
| description = base e log(a) or ln(a)&lt;br /&gt;
| syntax = log r? a(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = max&lt;br /&gt;
| description = Register = max of a or b&lt;br /&gt;
| note = If any of the values is NaN, NaN is returned.&lt;br /&gt;
| syntax = max r? a(r?{{!}}num) b(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = min&lt;br /&gt;
| description = Register = min of a or b&lt;br /&gt;
| note = If any of the values is NaN, NaN is returned.&lt;br /&gt;
| syntax = min r? a(r?{{!}}num) b(r?{{!}}num)&lt;br /&gt;
}}{{ICInstruction&lt;br /&gt;
| instruction = clamp&lt;br /&gt;
| syntax = clamp r? a(r?{{!}}num) min(r?{{!}}num) max(r?{{!}}num)&lt;br /&gt;
| description = Stores a clamped to the inclusive inclusive range [min, max] in the register provided.&lt;br /&gt;
| note = Functionally equivalent to min(max(a,min),max).&amp;lt;br&amp;gt;If any of the values are NaN, NaN is returned.&lt;br /&gt;
| example = clamp 100 10 50 = 50&amp;lt;br&amp;gt;&lt;br /&gt;
clamp 0 10 50 = 10&amp;lt;br&amp;gt;&lt;br /&gt;
clamp 20 10 50 = 20&amp;lt;br&amp;gt;&lt;br /&gt;
}}{{ICInstruction&lt;br /&gt;
| instruction = mod&lt;br /&gt;
| description = Register = a mod b (note: NOT a % b)&lt;br /&gt;
| syntax = mod r? a(r?{{!}}num) b(r?{{!}}num)&lt;br /&gt;
| example = {{ICCode|&lt;br /&gt;
mod r0 10 20 # Expected: r0 = 10&lt;br /&gt;
mod r1 22 20 # Expected: r1 = 2&lt;br /&gt;
mod r2 22 -20 # Expected: r2 = 18&lt;br /&gt;
mod r2 22 -10 # Expected: r2 = 18&lt;br /&gt;
mod r2 -7 4 # Expected: r2 = 1&lt;br /&gt;
mod r2 -7 9 # Expected: r2 = 2&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction|instruction=mul|description=Register = a * b|syntax=mul r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=rand|description=Register = a random value x with 0 &amp;lt;= x &amp;lt; 1|syntax=rand r?}}&lt;br /&gt;
{{ICInstruction|instruction=round|description=Register = a rounded to nearest integer|syntax=round r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=sqrt|description=Register = square root of a|syntax=sqrt r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=sub|description=Register = a - b.|syntax=sub r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=trunc|description=Register = a with fractional part removed|syntax=trunc r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=lerp|description=Linearly interpolates between a and b by the ratio c, and places the result in the register provided. The ratio c will be clamped between 0 and 1.|syntax=lerp r? a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
&lt;br /&gt;
=== Mathematical / Trigonometric ===&lt;br /&gt;
&lt;br /&gt;
{{ICInstruction|instruction=acos|description=Returns the angle (radians) whos cos is the specified value|syntax=acos r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=asin|description=Returns the angle (radians) whos sine is the specified value|syntax=asin r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=atan|description=Returns the angle (radians) whos tan is the specified value|syntax=atan r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=atan2|description=Returns the angle (radians) whose tangent is the quotient of two specified values: a (y) and b (x)|syntax=atan2 r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=cos|description=Returns the cosine of the specified angle (radians)|syntax=cos r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=sin|description=Returns the sine of the specified angle (radians)|syntax=sin r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=tan|description=Returns the tan of the specified angle (radians) |syntax=tan r? a(r?{{!}}num)}}&lt;br /&gt;
&lt;br /&gt;
== Stack ==&lt;br /&gt;
&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = clr&lt;br /&gt;
| description = Clears the stack memory for the provided device.&lt;br /&gt;
| note = Throws a DeviceNotFound exception when used on inaccessible devices.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Throws a MemoryNotReadable exception when used on devices without a writable stack memory. (likely a bug)&lt;br /&gt;
| syntax = clr d?&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = clrd&lt;br /&gt;
| description = Seeks directly for the provided device id and clears the stack memory of that device&lt;br /&gt;
| note = Throws a DeviceNotFound exception when used on inaccessible devices.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Throws a MemoryNotWriteable exception when used on devices without a writable stack memory.&lt;br /&gt;
| syntax = clrd id(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = get&lt;br /&gt;
| description = Using the provided device, attempts to read the stack value at the provided address, and places it in the register.&lt;br /&gt;
| note = Throws a DeviceNotFound exception when used on inaccessible devices.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Throws a MemoryNotReadable exception when used on devices without a readable stack memory.&lt;br /&gt;
| syntax = get r? device(d?{{!}}r?{{!}}id) address(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = getd&lt;br /&gt;
| description = Seeks directly for the provided device id, attempts to read the stack value at the provided address, and places it in the register.&lt;br /&gt;
| note = Throws a DeviceNotFound exception when used on inaccessible devices.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Throws a MemoryNotReadable exception when used on devices without a readable stack memory.&lt;br /&gt;
| syntax = getd r? id(r?{{!}}id) address(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = peek&lt;br /&gt;
| description = Reads the value at stack address sp-1 and saves it into the provided register.&lt;br /&gt;
| note = Out-of-bounds reads result in a stack underflow/overflow exception.&lt;br /&gt;
| syntax = peek r?&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = poke&lt;br /&gt;
| description = Stores the provided value at the provided address in the stack.&lt;br /&gt;
| note = Out-of-bounds writes result in a stack underflow/overflow exception.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There is no built-in instruction for reading IC10 stack memory at arbitrary addresses. Although circuit housings can use get db, machines with an IC slot need to use a stack pointer assignment followed by a peek as a workaround.&lt;br /&gt;
| syntax = poke address(r?{{!}}num) value(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = pop&lt;br /&gt;
| description = Decrements the stack pointer, then returns the writes the value at the resulting stack pointer address into the provided register.&lt;br /&gt;
| note = Out-of-bounds reads result in a stack underflow/overflow exception.&lt;br /&gt;
| syntax = pop r?&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = push&lt;br /&gt;
| description = Writes the provided value to the stack pointer address, then increments the stack pointer.&lt;br /&gt;
| note = Out-of-bounds writes throw a Stack underflow/overflow exception.&lt;br /&gt;
| syntax = push a(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = put&lt;br /&gt;
| description = Using the provided device, attempts to write the provided value to its stack at the provided address.&lt;br /&gt;
| note = Throws a DeviceNotFound exception when used on inaccessible devices.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Throws a MemoryNotWritable exception when used on devices without a writable stack memory.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Intercepts exceptions thrown by the device during the attempt to write to the device&#039;s stack, passing stack overflow/underflow exceptions through and throwing Unknown exceptions for other exception types.&lt;br /&gt;
| syntax = put device(d?{{!}}r?{{!}}id) address(r?{{!}}num) value(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = putd&lt;br /&gt;
| description = Seeks directly for the provided device id, attempts to write the provided value to the stack at the provided address.&lt;br /&gt;
| note = Throws a DeviceNotFound exception when used on inaccessible devices.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Throws a MemoryNotWritable exception when used on devices without a writable stack memory.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Intercepts exceptions thrown by the device during the attempt to write to the device&#039;s stack, passing stack overflow/underflow exceptions through and throwing Unknown exceptions for other exception types.&lt;br /&gt;
| syntax = putd id(r?{{!}}id) address(r?{{!}}num) value(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Slot/Logic ==&lt;br /&gt;
&lt;br /&gt;
{{ICInstruction|instruction=l|description=Loads device LogicType to register by housing index value.|syntax=l r? device(d?{{!}}r?{{!}}id) logicType&lt;br /&gt;
|example=&lt;br /&gt;
Read from the device on d0 into register 0&lt;br /&gt;
{{ICCode|l r0 d0 Setting}}&lt;br /&gt;
Read the pressure from a sensor&lt;br /&gt;
{{ICCode|l r1 d5 Pressure}}&lt;br /&gt;
This also works with aliases. For example:&lt;br /&gt;
{{ICCode|&lt;br /&gt;
alias Sensor d0&lt;br /&gt;
l r0 Sensor Temperature&lt;br /&gt;
}}}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = lr&lt;br /&gt;
| description = Loads reagent of device&#039;s ReagentMode where a hash of the reagent type to check for. ReagentMode can be either Contents (0), Required (1), Recipe (2). Can use either the word, or the number.&lt;br /&gt;
| note = Instruction performs different actions depending on the provided reagent mode.&lt;br /&gt;
&amp;lt;br&amp;gt;Valid reagentMode values:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;LogicReagentMode.Contents (0): Return how much reagentHash reagent is present in the device.&lt;br /&gt;
&amp;lt;br&amp;gt;LogicReagentMode.Required (1): Return how much additional reagentHash reagent is missing to complete the device&#039;s currently selected recipe.&lt;br /&gt;
&amp;lt;br&amp;gt;LogicReagentMode.Recipe (2): Return how much reagentHash reagent the device&#039;s currently selected recipe requires.&lt;br /&gt;
&amp;lt;br&amp;gt;LogicReagentMode.TotalContents (3): Return the total amount of reagents a  device contains, ignoring reagentHash. Equivalent to &amp;quot;l r device Reagents&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Other reagent modes throw an UnhandledReagentMode exception.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Instruction throws an IncorrectReagentDevice exception on Required and Recipe LogicReagentModes if attempting to use them on a device that can&#039;t select a recipe, such as a Furnace.&lt;br /&gt;
| syntax = lr r? device(d?{{!}}r?{{!}}id) reagentMode reagentHash&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction|instruction=ls|description=Loads slot LogicSlotType on device to register.|syntax=ls r? device(d?{{!}}r?{{!}}id) slotIndex logicSlotType&lt;br /&gt;
|example=&lt;br /&gt;
Read from the second slot of device on d0, stores 1 in r0 if it&#039;s occupied, 0 otherwise.&lt;br /&gt;
{{ICCode|ls r0 d0 2 Occupied}}&lt;br /&gt;
And here is the code to read the charge of an AIMeE:&lt;br /&gt;
{{ICCode|&lt;br /&gt;
alias robot d0&lt;br /&gt;
alias charge r10&lt;br /&gt;
ls charge robot 0 Charge&lt;br /&gt;
}}}}&lt;br /&gt;
{{ICInstruction|instruction=s|description=Stores register value to LogicType on device by housing index value.|syntax=s device(d?{{!}}r?{{!}}id) logicType r?&lt;br /&gt;
|example=&lt;br /&gt;
{{ICCode|&lt;br /&gt;
s d0 Setting r0&lt;br /&gt;
}}}}&lt;br /&gt;
{{ICInstruction|instruction=ss|description=Stores register value to device stored in a slot LogicSlotType on device.|syntax=ss device(d?{{!}}r?{{!}}id) slotIndex logicSlotType r?}}&lt;br /&gt;
{{ICInstruction|instruction=rmap|description=Given a reagent hash (signed 32bit int), store the corresponding prefab hash that the device expects to fulfill the reagent requirement. For example, on an autolathe, the hash for Iron will store the hash for ItemIronIngot.|syntax=rmap r? d? reagentHash(r?{{!}}num)}}&lt;br /&gt;
&lt;br /&gt;
=== Slot/Logic / Batched ===&lt;br /&gt;
&lt;br /&gt;
{{ICInstruction|instruction=lb|description=Loads LogicType from all output network devices with provided type hash using the provide batch mode. Average (0), Sum (1), Minimum (2), Maximum (3). Can use either the word, or the number.|syntax=lb r? deviceHash logicType batchMode&lt;br /&gt;
|example=&lt;br /&gt;
{{ICCode|lb r0 HASH(&amp;quot;StructureWallLight&amp;quot;) On Sum}}}}&lt;br /&gt;
{{ICInstruction|instruction=lbn|description=Loads LogicType from all output network devices with provided type and name hashes using the provide batch mode. Average (0), Sum (1), Minimum (2), Maximum (3). Can use either the word, or the number.|syntax=lbn r? deviceHash nameHash logicType batchMode}}&lt;br /&gt;
{{ICInstruction|instruction=lbns|description=Loads LogicSlotType from slotIndex from all output network devices with provided type and name hashes using the provide batch mode. Average (0), Sum (1), Minimum (2), Maximum (3). Can use either the word, or the number.|syntax=lbns r? deviceHash nameHash slotIndex logicSlotType batchMode}}&lt;br /&gt;
{{ICInstruction|instruction=lbs|description=Loads LogicSlotType from slotIndex from all output network devices with provided type hash using the provide batch mode. Average (0), Sum (1), Minimum (2), Maximum (3). Can use either the word, or the number.|syntax=lbs r? deviceHash slotIndex logicSlotType batchMode}}&lt;br /&gt;
{{ICInstruction|instruction=sb|description=Stores register value to LogicType on all output network devices with provided type hash.|syntax=sb deviceHash logicType r?&lt;br /&gt;
|example=&lt;br /&gt;
{{ICCode|sb HASH(&amp;quot;StructureWallLight&amp;quot;) On 1}}}}&lt;br /&gt;
{{ICInstruction|instruction=sbn|description=Stores register value to LogicType on all output network devices with provided type hash and name.|syntax=sbn deviceHash nameHash logicType r?}}&lt;br /&gt;
{{ICInstruction|instruction=sbs|description=Stores register value to LogicSlotType on all output network devices with provided type hash in the provided slot.|syntax=sbs deviceHash slotIndex logicSlotType r?}}&lt;br /&gt;
&lt;br /&gt;
== Bitwise ==&lt;br /&gt;
&lt;br /&gt;
{{ICInstruction|instruction=and|description=Performs a bitwise logical AND operation on the binary representation of two values. Each bit of the result is determined by evaluating the corresponding bits of the input values. If both bits are 1, the resulting bit is set to 1. Otherwise the resulting bit is set to 0.|syntax=and r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=nor|description=Performs a bitwise logical NOR (NOT OR) operation on the binary representation of two values. Each bit of the result is determined by evaluating the corresponding bits of the input values. If both bits are 0, the resulting bit is set to 1. Otherwise, if at least one bit is 1, the resulting bit is set to 0.|syntax=nor r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=not|description=Performs a bitwise logical NOT operation flipping each bit of the input value, resulting in a binary complement. If a bit is 1, it becomes 0, and if a bit is 0, it becomes 1.|syntax=not r? a(r?{{!}}num)&lt;br /&gt;
|note=&lt;br /&gt;
This is a bitwise operation, the NOT of 1 =&amp;gt; -2, etc. You may want to use seqz instead}}&lt;br /&gt;
{{ICInstruction|instruction=or|description=Performs a bitwise logical OR operation on the binary representation of two values. Each bit of the result is determined by evaluating the corresponding bits of the input values. If either bit is 1, the resulting bit is set to 1. If both bits are 0, the resulting bit is set to 0.|syntax=or r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=sla|description=Performs a bitwise arithmetic left shift operation on the binary representation of a value. It shifts the bits to the left and fills the vacated rightmost bits with zeros (note that this is indistinguishable from &#039;sll&#039;).|syntax=sla r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=sll|description=Performs a bitwise logical left shift operation on the binary representation of a value. It shifts the bits to the left and fills the vacated rightmost bits with zeros.|syntax=sll r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=sra|description=Performs a bitwise arithmetic right shift operation on the binary representation of a value. It shifts the bits to the right and fills the vacated leftmost bits with a copy of the sign bit (the most significant bit).|syntax=sra r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=srl|description=Performs a bitwise logical right shift operation on the binary representation of a value. It shifts the bits to the right and fills the vacated leftmost bits with zeros|syntax=srl r? a(r?{{!}}num) b(r?{{!}}num)}}{{ICInstruction&lt;br /&gt;
| instruction = rol&lt;br /&gt;
| syntax = rol r? a(r?{{!}}num) b(r?{{!}}num)&lt;br /&gt;
| description = Performs a bitwise left rotation on the binary representation of a by b places, wrapping the bits shifted out of the most significant position back into the least significant position.&lt;br /&gt;
| example = rol $DEADBEEFCAFE2000 16 -&amp;gt; $BEEFCAFE2000DEAD&lt;br /&gt;
}}{{ICInstruction&lt;br /&gt;
| instruction = ror&lt;br /&gt;
| syntax = ror r? a(r?{{!}}num) b(r?{{!}}num)&lt;br /&gt;
| description = Performs a bitwise right rotation on the binary representation of A by B places, wrapping the bits shifted out of the least significant position back into the most significant position.&lt;br /&gt;
| example = ror $1234, 4 -&amp;gt; $4000000000000123&lt;br /&gt;
}}{{ICInstruction|instruction=xor|description=Performs a bitwise logical XOR (exclusive OR) operation on the binary representation of two values. Each bit of the result is determined by evaluating the corresponding bits of the input values. If the bits are different (one bit is 0 and the other is 1), the resulting bit is set to 1. If the bits are the same (both 0 or both 1), the resulting bit is set to 0.|syntax=xor r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = ext&lt;br /&gt;
| description = Extracts a bit field from source value, beginning at bit offset for length bits and places result in the provided register. Payload cannot exceed 53 bits in final length.&lt;br /&gt;
| note = Throws a ShiftUnderflow exception if offset is smaller than 1 or length is smaller than 0.&amp;lt;br&amp;gt;&lt;br /&gt;
Throws a ShiftOverflow exception if offset is greater than or equal to 53 bits.&amp;lt;br&amp;gt;&lt;br /&gt;
Throws a PayloadOverflow exception if length is greater than 53 bits.&lt;br /&gt;
| example = {{ICCode|&lt;br /&gt;
move r0 $DEADBEEF&lt;br /&gt;
ext r1 r0 8 16 #After execution, r1&#039;s value is $ADBE&lt;br /&gt;
}}&lt;br /&gt;
| syntax = ext r? source(r?{{!}}num) offset(r?{{!}}num) length(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = ins&lt;br /&gt;
| description = Inserts a bit field into the provided register, beginning at bit offset for length bits. Payload cannot exceed 53 bits in final length.&lt;br /&gt;
| syntax = ins r? field(r?{{!}}num) offset(r?{{!}}num) length(r?{{!}}num)&lt;br /&gt;
| note = Throws a ShiftUnderflow exception if length is smaller than 1 or offset is smaller than 0.&amp;lt;br&amp;gt;&lt;br /&gt;
Throws a ShiftOverflow exception if offset is greater than 53 bits.&amp;lt;br&amp;gt;&lt;br /&gt;
Throws a PayloadOverflow exception if offset+length is greater to or equal to 53 bits.&amp;lt;br&amp;gt;&lt;br /&gt;
| example = {{ICCode|move r0 $DE0000EF&lt;br /&gt;
move r1 $ADBE&lt;br /&gt;
ins r0 r1 8 16 #inserts field r1 at bit 8 for 16 bits, result: $DEADBEEF}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Comparison ==&lt;br /&gt;
&lt;br /&gt;
{{ICInstruction|instruction=select|description=Register = b if a is non-zero, otherwise c|syntax=select r? a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)&lt;br /&gt;
|example=&lt;br /&gt;
&amp;lt;b&amp;gt;1)&amp;lt;/b&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
move r0 &amp;lt;s style=&amp;quot;text-decoration-line:underline;text-decoration-color:red;&amp;quot;&amp;gt;0&amp;lt;/s&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
select &amp;lt;s style=&amp;quot;text-decoration-line:underline;text-decoration-color:red;&amp;gt;r1&amp;lt;/s&amp;gt; r0 10 &amp;lt;s style=&amp;quot;text-decoration-line:underline;text-decoration-color:red;&amp;gt;200&amp;lt;/s&amp;gt;&lt;br /&gt;
{{ICCode|&lt;br /&gt;
move r0 0&lt;br /&gt;
select r1 r0 10 200&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br/&amp;gt;after run, &amp;lt;s style=&amp;quot;text-decoration-line:underline;text-decoration-color:red;&amp;quot;&amp;gt;r1 = 200&amp;lt;/s&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;b&amp;gt;2)&amp;lt;/b&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
move r0 &amp;lt;s style=&amp;quot;text-decoration-line:underline;text-decoration-color:red;&amp;quot;&amp;gt;5&amp;lt;/s&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
select &amp;lt;s style=&amp;quot;text-decoration-line:underline;text-decoration-color:red;&amp;gt;r1&amp;lt;/s&amp;gt; r0 &amp;lt;s style=&amp;quot;text-decoration-line:underline;text-decoration-color:red;&amp;gt;10&amp;lt;/s&amp;gt; 200&lt;br /&gt;
{{ICCode|&lt;br /&gt;
move r0 1&lt;br /&gt;
select r1 r0 10 100&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br/&amp;gt;after run, &amp;lt;s style=&amp;quot;text-decoration-line:underline;text-decoration-color:red;&amp;quot;&amp;gt;r1 = 10&amp;lt;/s&amp;gt;&lt;br /&gt;
|note=&lt;br /&gt;
This operation can be used as a simple ternary condition}}&lt;br /&gt;
&lt;br /&gt;
=== Comparison / Device Pin ===&lt;br /&gt;
&lt;br /&gt;
{{ICInstruction|instruction=sdns|description=Register = 1 if device is not set, otherwise 0|syntax=sdns r? device(d?{{!}}r?{{!}}id)}}&lt;br /&gt;
{{ICInstruction|instruction=sdse|description=Register = 1 if device is set, otherwise 0.|syntax=sdse r? device(d?{{!}}r?{{!}}id)}}&lt;br /&gt;
&lt;br /&gt;
=== Comparison / Value ===&lt;br /&gt;
&lt;br /&gt;
{{ICInstruction|instruction=sap|description=Register = 1 if abs(a - b) &amp;lt;= max(c * max(abs(a), abs(b)), float.epsilon * 8), otherwise 0|syntax=sap r? a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)&lt;br /&gt;
|example=&lt;br /&gt;
Set register to 1 if a and b are close enough to each other with the scaling factor of c. Equivalent to Python [https://docs.python.org/3/library/math.html#math.isclose math.isclose]}}&lt;br /&gt;
{{ICInstruction|instruction=sapz|description=Register = 1 if abs(a) &amp;lt;= max(b * abs(a), float.epsilon * 8), otherwise 0|syntax=sapz r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=seq|description=Register = 1 if a == b, otherwise 0|syntax=seq r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=seqz|description=Register = 1 if a == 0, otherwise 0|syntax=seqz r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=sge|description=Register = 1 if a &amp;gt;= b, otherwise 0|syntax=sge r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=sgez|description=Register = 1 if a &amp;gt;= 0, otherwise 0|syntax=sgez r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=sgt|description=Register = 1 if a &amp;gt; b, otherwise 0|syntax=sgt r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=sgtz|description=Register = 1 if a &amp;gt; 0, otherwise 0|syntax=sgtz r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=sle|description=Register = 1 if a &amp;lt;= b, otherwise 0|syntax=sle r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=slez|description=Register = 1 if a &amp;lt;= 0, otherwise 0|syntax=slez r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=slt|description=Register = 1 if a &amp;lt; b, otherwise 0|syntax=slt r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=sltz|description=Register = 1 if a &amp;lt; 0, otherwise 0|syntax=sltz r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=sna|description=Register = 1 if abs(a - b) &amp;gt; max(c * max(abs(a), abs(b)), float.epsilon * 8), otherwise 0|syntax=sna r? a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=snan|description=Register = 1 if a is NaN, otherwise 0|syntax=snan r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=snanz|description=Register = 0 if a is NaN, otherwise 1|syntax=snanz r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=snaz|description=Register = 1 if abs(a) &amp;gt; max(b * abs(a), float.epsilon), otherwise 0|syntax=snaz r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=sne|description=Register = 1 if a != b, otherwise 0|syntax=sne r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=snez|description=Register = 1 if a != 0, otherwise 0|syntax=snez r? a(r?{{!}}num)}}&lt;br /&gt;
&lt;br /&gt;
== Branching ==&lt;br /&gt;
&lt;br /&gt;
{{ICInstruction|instruction=j|description=Jump execution to line a|syntax=j int&lt;br /&gt;
|example=&lt;br /&gt;
{{ICCode|j 0 # jump line 0}}&lt;br /&gt;
{{ICCode|&lt;br /&gt;
j label # jump to a label&lt;br /&gt;
&lt;br /&gt;
label:&lt;br /&gt;
# your code here&lt;br /&gt;
}}}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = jal&lt;br /&gt;
| description = Jump execution to line a and store next line number in ra&lt;br /&gt;
| syntax = jal int&lt;br /&gt;
| note = Actual behavior as of The Power Line Update (Q3 2026) stores the next line number in ra before jumping execution to line a. This results in jal ra being a no-op (likely a bug).&lt;br /&gt;
| example = jal provides a way to do function calls in IC10 mips&lt;br /&gt;
&lt;br /&gt;
{{ICCode|&lt;br /&gt;
move r0 1000&lt;br /&gt;
move r1 0&lt;br /&gt;
start:&lt;br /&gt;
jal average&lt;br /&gt;
s db Setting r0&lt;br /&gt;
yield&lt;br /&gt;
j start&lt;br /&gt;
&lt;br /&gt;
average:&lt;br /&gt;
add r0 r0 r1&lt;br /&gt;
div r0 r0 2&lt;br /&gt;
j ra # jump back&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction|instruction=jr|description=Relative jump to line a|syntax=jr int}}&lt;br /&gt;
&lt;br /&gt;
=== Branching / Device Pin ===&lt;br /&gt;
&lt;br /&gt;
{{ICInstruction|instruction=bdnvl|description=Will branch to line a if the provided device not valid for a load instruction for the provided logic type.|syntax=bdnvl device(d?{{!}}r?{{!}}id) logicType a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bdnvs|description=Will branch to line a if the provided device not valid for a store instruction for the provided logic type.|syntax=bdnvs device(d?{{!}}r?{{!}}id) logicType a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bdns|description=Branch to line a if device d isn&#039;t set|syntax=bdns d? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bdnsal|description=Jump execution to line a and store next line number if device is not set|syntax=bdnsal d? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bdse|description=Branch to line a if device d is set|syntax=bdse d? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bdseal|description=Jump execution to line a and store next line number if device is set|syntax=bdseal d? a(r?{{!}}num)&lt;br /&gt;
|example=&lt;br /&gt;
{{ICCode|&lt;br /&gt;
#Store line number and jump to line 32 if d0 is assigned.&lt;br /&gt;
bdseal d0 32&lt;br /&gt;
}}&lt;br /&gt;
{{ICCode|&lt;br /&gt;
#Store line in ra and jump to label HarvestCrop if device d0 is assigned.&lt;br /&gt;
bdseal d0 HarvestCrop&lt;br /&gt;
}}}}&lt;br /&gt;
{{ICInstruction|instruction=brdns|description=Relative branch to line a if device is not set|syntax=brdns d? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=brdse|description=Relative branch to line a if device is set|syntax=brdse d? a(r?{{!}}num)}}&lt;br /&gt;
&lt;br /&gt;
=== Branching / Comparison ===&lt;br /&gt;
&lt;br /&gt;
{{ICInstruction|instruction=bap|description=Branch to line d if abs(a - b) &amp;lt;= max(c * max(abs(a), abs(b)), float.epsilon * 8)|syntax=bap a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num) d(r?{{!}}num)&lt;br /&gt;
|example=&lt;br /&gt;
Branch if a and b are close enough to each other with the scaling factor of c. Equivalent to Python [https://docs.python.org/3/library/math.html#math.isclose math.isclose]}}&lt;br /&gt;
{{ICInstruction|instruction=brap|description=Relative branch to line d if abs(a - b) &amp;lt;= max(c * max(abs(a), abs(b)), float.epsilon * 8)|syntax=brap a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num) d(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bapal|description=Branch to line c if a != b and store next line number in ra|syntax=bapal a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num) d(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bapz|description=Branch to line c if abs(a) &amp;lt;= max(b * abs(a), float.epsilon * 8)|syntax=bapz a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=brapz|description=Relative branch to line c if abs(a) &amp;lt;= max(b * abs(a), float.epsilon * 8)|syntax=brapz a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bapzal|description=Branch to line c if abs(a) &amp;lt;= max(b * abs(a), float.epsilon * 8) and store next line number in ra|syntax=bapzal a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=beq|description=Branch to line c if a == b|syntax=beq a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=breq|description=Relative branch to line c if a == b|syntax=breq a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=beqal|description=Branch to line c if a == b and store next line number in ra|syntax=beqal a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=beqz|description=Branch to line b if a == 0|syntax=beqz a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=breqz|description=Relative branch to line b if a == 0|syntax=breqz a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=beqzal|description=Branch to line b if a == 0 and store next line number in ra|syntax=beqzal a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bge|description=Branch to line c if a &amp;gt;= b|syntax=bge a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=brge|description=Relative branch to line c if a &amp;gt;= b|syntax=brge a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bgeal|description=Branch to line c if a &amp;gt;= b and store next line number in ra|syntax=bgeal a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bgez|description=Branch to line b if a &amp;gt;= 0|syntax=bgez a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=brgez|description=Relative branch to line b if a &amp;gt;= 0|syntax=brgez a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bgezal|description=Branch to line b if a &amp;gt;= 0 and store next line number in ra|syntax=bgezal a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bgt|description=Branch to line c if a &amp;gt; b|syntax=bgt a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)&lt;br /&gt;
|example=&lt;br /&gt;
An example of a &#039;&#039;&#039;Schmitt&#039;&#039;&#039; trigger, turning on a device if the temperature is too low, and turning it off if it&#039;s too high and finally&lt;br /&gt;
doing nothing if the temperature is within the desired range.&lt;br /&gt;
{{ICCode|&lt;br /&gt;
alias sensor d0&lt;br /&gt;
alias device d1&lt;br /&gt;
&lt;br /&gt;
define mintemp 293.15&lt;br /&gt;
define maxtemp 298.15&lt;br /&gt;
&lt;br /&gt;
start:&lt;br /&gt;
yield&lt;br /&gt;
l r0 sensor Temperature&lt;br /&gt;
# If the temperature &amp;lt; mintemp, turn on the device&lt;br /&gt;
blt r0 mintemp turnOn&lt;br /&gt;
# If the temperature &amp;gt; maxtemp, turn off the device&lt;br /&gt;
bgt r0 maxtemp turnOff&lt;br /&gt;
j start&lt;br /&gt;
&lt;br /&gt;
turnOn:&lt;br /&gt;
s device On 1&lt;br /&gt;
j start&lt;br /&gt;
turnOff:&lt;br /&gt;
s device On 0&lt;br /&gt;
j start&lt;br /&gt;
}}}}&lt;br /&gt;
{{ICInstruction|instruction=brgt|description=relative branch to line c if a &amp;gt; b|syntax=brgt a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bgtal|description=Branch to line c if a &amp;gt; b and store next line number in ra|syntax=bgtal a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bgtz|description=Branch to line b if a &amp;gt; 0|syntax=bgtz a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=brgtz|description=Relative branch to line b if a &amp;gt; 0|syntax=brgtz a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bgtzal|description=Branch to line b if a &amp;gt; 0 and store next line number in ra|syntax=bgtzal a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=ble|description=Branch to line c if a &amp;lt;= b|syntax=ble a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=brle|description=Relative branch to line c if a &amp;lt;= b|syntax=brle a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bleal|description=Branch to line c if a &amp;lt;= b and store next line number in ra|syntax=bleal a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=blez|description=Branch to line b if a &amp;lt;= 0|syntax=blez a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=brlez|description=Relative branch to line b if a &amp;lt;= 0|syntax=brlez a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=blezal|description=Branch to line b if a &amp;lt;= 0 and store next line number in ra|syntax=blezal a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=blt|description=Branch to line c if a &amp;lt; b|syntax=blt a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)&lt;br /&gt;
|example=&lt;br /&gt;
An example of a &#039;&#039;&#039;Schmitt&#039;&#039;&#039; trigger, turning on a device if the temperature is too low, and turning it off if it&#039;s too high and finally&lt;br /&gt;
doing nothing if the temperature is within the desired range.&lt;br /&gt;
{{ICCode|&lt;br /&gt;
alias sensor d0&lt;br /&gt;
alias device d1&lt;br /&gt;
&lt;br /&gt;
define mintemp 293.15&lt;br /&gt;
define maxtemp 298.15&lt;br /&gt;
&lt;br /&gt;
start:&lt;br /&gt;
yield&lt;br /&gt;
l r0 sensor Temperature&lt;br /&gt;
# If the temperature &amp;lt; mintemp, turn on the device&lt;br /&gt;
blt r0 mintemp turnOn&lt;br /&gt;
# If the temperature &amp;gt; maxtemp, turn off the device&lt;br /&gt;
bgt r0 maxtemp turnOff&lt;br /&gt;
j start&lt;br /&gt;
&lt;br /&gt;
turnOn:&lt;br /&gt;
s device On 1&lt;br /&gt;
j start&lt;br /&gt;
turnOff:&lt;br /&gt;
s device On 0&lt;br /&gt;
j start&lt;br /&gt;
}}}}&lt;br /&gt;
{{ICInstruction|instruction=brlt|description=Relative branch to line c if a &amp;lt; b|syntax=brlt a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bltal|description=Branch to line c if a &amp;lt; b and store next line number in ra|syntax=bltal a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bltz|description=Branch to line b if a &amp;lt; 0|syntax=bltz a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=brltz|description=Relative branch to line b if a &amp;lt; 0|syntax=brltz a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bltzal|description=Branch to line b if a &amp;lt; 0 and store next line number in ra|syntax=bltzal a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bna|description=Branch to line d if abs(a - b) &amp;gt; max(c * max(abs(a), abs(b)), float.epsilon * 8)|syntax=bna a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num) d(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=brna|description=Relative branch to line d if abs(a - b) &amp;gt; max(c * max(abs(a), abs(b)), float.epsilon * 8)|syntax=brna a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num) d(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bnaal|description=Branch to line d if abs(a - b) &amp;lt;= max(c * max(abs(a), abs(b)), float.epsilon * 8) and store next line number in ra|syntax=bnaal a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num) d(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bnan|description=Branch to line b if a is not a number (NaN)|syntax=bnan a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=brnan|description=Relative branch to line b if a is not a number (NaN)|syntax=brnan a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bnaz|description=Branch to line c if abs(a) &amp;gt; max (b * abs(a), float.epsilon * 8)|syntax=bnaz a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=brnaz|description=Relative branch to line c if abs(a) &amp;gt; max(b * abs(a), float.epsilon * 8)|syntax=brnaz a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bnazal|description=Branch to line c if abs(a) &amp;gt; max (b * abs(a), float.epsilon * 8) and store next line number in ra|syntax=bnazal a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bne|description=Branch to line c if a != b|syntax=bne a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=brne|description=Relative branch to line c if a != b|syntax=brne a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bneal|description=Branch to line c if a != b and store next line number in ra|syntax=bneal a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bnez|description=branch to line b if a != 0|syntax=bnez a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=brnez|description=Relative branch to line b if a != 0|syntax=brnez a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bnezal|description=Branch to line b if a != 0 and store next line number in ra|syntax=bnezal a(r?{{!}}num) b(r?{{!}}num)}}&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=IC10/instructions&amp;diff=28165</id>
		<title>IC10/instructions</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=IC10/instructions&amp;diff=28165"/>
		<updated>2026-09-13T09:04:51Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: Document stack instruction exception behavior, mention there&amp;#039;s no direct read-equivalent for pokes.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
See [[IC10]] for the primary page for the IC10 instruction set. This page lists all available instructions&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Utility ==&lt;br /&gt;
&lt;br /&gt;
{{ICInstruction|instruction=alias|description=Labels register or device reference with name, device references also affect what shows on the screws on the IC base.|syntax=alias str r?{{!}}d?&lt;br /&gt;
|example=&lt;br /&gt;
{{ICCode|&lt;br /&gt;
alias dAutoHydro1 d0&lt;br /&gt;
alias vTemperature r0&lt;br /&gt;
}}}}&lt;br /&gt;
{{ICInstruction|instruction=define|description=Creates a label that will be replaced throughout the program with the provided value.|syntax=define str num&lt;br /&gt;
|example=&lt;br /&gt;
{{ICCode|&lt;br /&gt;
define ultimateAnswer 42&lt;br /&gt;
move r0 ultimateAnswer # Store 42 in register 0&lt;br /&gt;
}}}}&lt;br /&gt;
{{ICInstruction|instruction=move|description=Register = provided num or register value.|syntax=move r? a(r?{{!}}num)&lt;br /&gt;
|example=&lt;br /&gt;
{{ICCode|move r0 42 # Store 42 in register 0}}}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = yield&lt;br /&gt;
| description = Pauses execution for 1 tick&lt;br /&gt;
| syntax = yield&lt;br /&gt;
}}{{ICInstruction&lt;br /&gt;
| instruction = sleep&lt;br /&gt;
| description = Pauses execution on the IC for a seconds&lt;br /&gt;
| syntax = sleep a(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = hcf&lt;br /&gt;
| description = Halt and catch fire&lt;br /&gt;
| note = Creates a small explosion, destroying the chip and starting fires on flammable atmospheres.&lt;br /&gt;
| syntax = hcf&lt;br /&gt;
}}&lt;br /&gt;
== Mathematical ==&lt;br /&gt;
&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = abs&lt;br /&gt;
| description = Register = the absolute value of a&lt;br /&gt;
| syntax = abs r? a(r?{{!}}num)&lt;br /&gt;
| example = {{ICCode|&lt;br /&gt;
define negativeNumber -10&lt;br /&gt;
abs r0 negativeNumber # Compute the absolute value of -10 and store it in register 0&lt;br /&gt;
}}&lt;br /&gt;
}}{{ICInstruction&lt;br /&gt;
| instruction = sgn&lt;br /&gt;
| syntax = sgn r a(r?{{!}}num)&lt;br /&gt;
| description = Stores the sign of a in the register: -1 if a is negative, 1 if positive, 0 if a is 0 (or not a number).&lt;br /&gt;
}}{{ICInstruction&lt;br /&gt;
| instruction = add&lt;br /&gt;
| description = Register = a + b.&lt;br /&gt;
| syntax = add r? a(r?{{!}}num) b(r?{{!}}num)&lt;br /&gt;
| example = {{ICCode|add r0 r0 1 # increment r0 by one}}&lt;br /&gt;
{{ICCode|&lt;br /&gt;
define num1 10&lt;br /&gt;
define num2 20&lt;br /&gt;
add r0 num1 num2 # Add 10 and 20 and store the result in register 0&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = ceil&lt;br /&gt;
| description = Register = smallest integer greater than a&lt;br /&gt;
| syntax = ceil r? a(r?{{!}}num)&lt;br /&gt;
| example = {{ICCode|&lt;br /&gt;
define floatNumber 10.3&lt;br /&gt;
ceil r0 floatNumber # Compute the ceiling of 10.3 and store it in register 0&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = div&lt;br /&gt;
| description = Register = a / b&lt;br /&gt;
| syntax = div r? a(r?{{!}}num) b(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = pow&lt;br /&gt;
| description = Stores the result of raising a to the power of b in the register. Follows IEEE-754 standard for floating point arithmetic.&lt;br /&gt;
| syntax = pow r? a(r?{{!}}num) b(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = exp&lt;br /&gt;
| description = exp(a) or e^a&lt;br /&gt;
| syntax = exp r? a(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = floor&lt;br /&gt;
| description = Register = largest integer less than a&lt;br /&gt;
| syntax = floor r? a(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = log&lt;br /&gt;
| description = base e log(a) or ln(a)&lt;br /&gt;
| syntax = log r? a(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = max&lt;br /&gt;
| description = Register = max of a or b&lt;br /&gt;
| note = If any of the values is NaN, NaN is returned.&lt;br /&gt;
| syntax = max r? a(r?{{!}}num) b(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = min&lt;br /&gt;
| description = Register = min of a or b&lt;br /&gt;
| note = If any of the values is NaN, NaN is returned.&lt;br /&gt;
| syntax = min r? a(r?{{!}}num) b(r?{{!}}num)&lt;br /&gt;
}}{{ICInstruction&lt;br /&gt;
| instruction = clamp&lt;br /&gt;
| syntax = clamp r? a(r?{{!}}num) min(r?{{!}}num) max(r?{{!}}num)&lt;br /&gt;
| description = Stores a clamped to the inclusive inclusive range [min, max] in the register provided.&lt;br /&gt;
| note = Functionally equivalent to min(max(a,min),max).&amp;lt;br&amp;gt;If any of the values are NaN, NaN is returned.&lt;br /&gt;
| example = clamp 100 10 50 = 50&amp;lt;br&amp;gt;&lt;br /&gt;
clamp 0 10 50 = 10&amp;lt;br&amp;gt;&lt;br /&gt;
clamp 20 10 50 = 20&amp;lt;br&amp;gt;&lt;br /&gt;
}}{{ICInstruction&lt;br /&gt;
| instruction = mod&lt;br /&gt;
| description = Register = a mod b (note: NOT a % b)&lt;br /&gt;
| syntax = mod r? a(r?{{!}}num) b(r?{{!}}num)&lt;br /&gt;
| example = {{ICCode|&lt;br /&gt;
mod r0 10 20 # Expected: r0 = 10&lt;br /&gt;
mod r1 22 20 # Expected: r1 = 2&lt;br /&gt;
mod r2 22 -20 # Expected: r2 = 18&lt;br /&gt;
mod r2 22 -10 # Expected: r2 = 18&lt;br /&gt;
mod r2 -7 4 # Expected: r2 = 1&lt;br /&gt;
mod r2 -7 9 # Expected: r2 = 2&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction|instruction=mul|description=Register = a * b|syntax=mul r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=rand|description=Register = a random value x with 0 &amp;lt;= x &amp;lt; 1|syntax=rand r?}}&lt;br /&gt;
{{ICInstruction|instruction=round|description=Register = a rounded to nearest integer|syntax=round r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=sqrt|description=Register = square root of a|syntax=sqrt r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=sub|description=Register = a - b.|syntax=sub r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=trunc|description=Register = a with fractional part removed|syntax=trunc r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=lerp|description=Linearly interpolates between a and b by the ratio c, and places the result in the register provided. The ratio c will be clamped between 0 and 1.|syntax=lerp r? a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
&lt;br /&gt;
=== Mathematical / Trigonometric ===&lt;br /&gt;
&lt;br /&gt;
{{ICInstruction|instruction=acos|description=Returns the angle (radians) whos cos is the specified value|syntax=acos r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=asin|description=Returns the angle (radians) whos sine is the specified value|syntax=asin r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=atan|description=Returns the angle (radians) whos tan is the specified value|syntax=atan r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=atan2|description=Returns the angle (radians) whose tangent is the quotient of two specified values: a (y) and b (x)|syntax=atan2 r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=cos|description=Returns the cosine of the specified angle (radians)|syntax=cos r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=sin|description=Returns the sine of the specified angle (radians)|syntax=sin r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=tan|description=Returns the tan of the specified angle (radians) |syntax=tan r? a(r?{{!}}num)}}&lt;br /&gt;
&lt;br /&gt;
== Stack ==&lt;br /&gt;
&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = clr&lt;br /&gt;
| description = Clears the stack memory for the provided device.&lt;br /&gt;
| note = Throws a DeviceNotFound exception when used on inaccessible devices.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Throws a MemoryNotReadable exception when used on devices without a writable stack memory. (likely a bug)&lt;br /&gt;
| syntax = clr d?&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = clrd&lt;br /&gt;
| description = Seeks directly for the provided device id and clears the stack memory of that device&lt;br /&gt;
| note = Throws a DeviceNotFound exception when used on inaccessible devices.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Throws a MemoryNotWriteable exception when used on devices without a writable stack memory.&lt;br /&gt;
| syntax = clrd id(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = get&lt;br /&gt;
| description = Using the provided device, attempts to read the stack value at the provided address, and places it in the register.&lt;br /&gt;
| note = Throws a DeviceNotFound exception when used on inaccessible devices.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Throws a MemoryNotReadable exception when used on devices without a readable stack memory.&lt;br /&gt;
| syntax = get r? device(d?{{!}}r?{{!}}id) address(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = getd&lt;br /&gt;
| description = Seeks directly for the provided device id, attempts to read the stack value at the provided address, and places it in the register.&lt;br /&gt;
| note = Throws a DeviceNotFound exception when used on inaccessible devices.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Throws a MemoryNotReadable exception when used on devices without a readable stack memory.&lt;br /&gt;
| syntax = getd r? id(r?{{!}}id) address(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = peek&lt;br /&gt;
| description = Reads the value at stack address sp-1 and saves it into the provided register.&lt;br /&gt;
| note = Out-of-bounds reads result in a stack underflow/overflow exception.&lt;br /&gt;
| syntax = peek r?&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = poke&lt;br /&gt;
| description = Stores the provided value at the provided address in the stack.&lt;br /&gt;
| note = Out-of-bounds writes result in a stack underflow/overflow exception.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There is no built-in instruction for reading IC10 stack memory at arbitrary addresses. Although circuit housings can use get db, machines with an IC slot need to use a stack pointer assignment followed by a peek as a workaround.&lt;br /&gt;
| syntax = poke address(r?{{!}}num) value(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = pop&lt;br /&gt;
| description = Decrements the stack pointer, then returns the writes the value at the resulting stack pointer address into the provided register.&lt;br /&gt;
| note = Out-of-bounds reads result in a stack underflow/overflow exception.&lt;br /&gt;
| syntax = pop r?&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = push&lt;br /&gt;
| description = Writes the provided value to the stack pointer address, then increments the stack pointer.&lt;br /&gt;
| note = Out-of-bounds writes throw a Stack underflow/overflow exception.&lt;br /&gt;
| syntax = push a(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = put&lt;br /&gt;
| description = Using the provided device, attempts to write the provided value to its stack at the provided address.&lt;br /&gt;
| note = Throws a DeviceNotFound exception when used on inaccessible devices.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Throws a MemoryNotWritable exception when used on devices without a writable stack memory.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Intercepts exceptions thrown by the device during the attempt to write to the device&#039;s stack, passing stack overflow/underflow exceptions through and throwing Unknown exceptions for other exception types.&lt;br /&gt;
| syntax = put device(d?{{!}}r?{{!}}id) address(r?{{!}}num) value(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = putd&lt;br /&gt;
| description = Seeks directly for the provided device id, attempts to write the provided value to the stack at the provided address.&lt;br /&gt;
| note = Throws a DeviceNotFound exception when used on inaccessible devices.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Throws a MemoryNotWritable exception when used on devices without a writable stack memory.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Intercepts exceptions thrown by the device during the attempt to write to the device&#039;s stack, passing stack overflow/underflow exceptions through and throwing Unknown exceptions for other exception types.&lt;br /&gt;
| syntax = putd id(r?{{!}}id) address(r?{{!}}num) value(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Slot/Logic ==&lt;br /&gt;
&lt;br /&gt;
{{ICInstruction|instruction=l|description=Loads device LogicType to register by housing index value.|syntax=l r? device(d?{{!}}r?{{!}}id) logicType&lt;br /&gt;
|example=&lt;br /&gt;
Read from the device on d0 into register 0&lt;br /&gt;
{{ICCode|l r0 d0 Setting}}&lt;br /&gt;
Read the pressure from a sensor&lt;br /&gt;
{{ICCode|l r1 d5 Pressure}}&lt;br /&gt;
This also works with aliases. For example:&lt;br /&gt;
{{ICCode|&lt;br /&gt;
alias Sensor d0&lt;br /&gt;
l r0 Sensor Temperature&lt;br /&gt;
}}}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = lr&lt;br /&gt;
| description = Loads reagent of device&#039;s ReagentMode where a hash of the reagent type to check for. ReagentMode can be either Contents (0), Required (1), Recipe (2). Can use either the word, or the number.&lt;br /&gt;
| note = Instruction performs different actions depending on the provided reagent mode.&lt;br /&gt;
&amp;lt;br&amp;gt;Valid reagentMode values:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;LogicReagentMode.Contents (0): Return how much reagentHash reagent is present in the device.&lt;br /&gt;
&amp;lt;br&amp;gt;LogicReagentMode.Required (1): Return how much additional reagentHash reagent is missing to complete the device&#039;s currently selected recipe.&lt;br /&gt;
&amp;lt;br&amp;gt;LogicReagentMode.Recipe (2): Return how much reagentHash reagent the device&#039;s currently selected recipe requires.&lt;br /&gt;
&amp;lt;br&amp;gt;LogicReagentMode.TotalContents (3): Return the total amount of reagents a  device contains, ignoring reagentHash. Equivalent to &amp;quot;l r device Reagents&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Other reagent modes throw an UnhandledReagentMode exception.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Instruction throws an IncorrectReagentDevice exception on Required and Recipe LogicReagentModes if attempting to use them on a device that can&#039;t select a recipe, such as a Furnace.&lt;br /&gt;
| syntax = lr r? device(d?{{!}}r?{{!}}id) reagentMode reagentHash&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction|instruction=ls|description=Loads slot LogicSlotType on device to register.|syntax=ls r? device(d?{{!}}r?{{!}}id) slotIndex logicSlotType&lt;br /&gt;
|example=&lt;br /&gt;
Read from the second slot of device on d0, stores 1 in r0 if it&#039;s occupied, 0 otherwise.&lt;br /&gt;
{{ICCode|ls r0 d0 2 Occupied}}&lt;br /&gt;
And here is the code to read the charge of an AIMeE:&lt;br /&gt;
{{ICCode|&lt;br /&gt;
alias robot d0&lt;br /&gt;
alias charge r10&lt;br /&gt;
ls charge robot 0 Charge&lt;br /&gt;
}}}}&lt;br /&gt;
{{ICInstruction|instruction=s|description=Stores register value to LogicType on device by housing index value.|syntax=s device(d?{{!}}r?{{!}}id) logicType r?&lt;br /&gt;
|example=&lt;br /&gt;
{{ICCode|&lt;br /&gt;
s d0 Setting r0&lt;br /&gt;
}}}}&lt;br /&gt;
{{ICInstruction|instruction=ss|description=Stores register value to device stored in a slot LogicSlotType on device.|syntax=ss device(d?{{!}}r?{{!}}id) slotIndex logicSlotType r?}}&lt;br /&gt;
{{ICInstruction|instruction=rmap|description=Given a reagent hash (signed 32bit int), store the corresponding prefab hash that the device expects to fulfill the reagent requirement. For example, on an autolathe, the hash for Iron will store the hash for ItemIronIngot.|syntax=rmap r? d? reagentHash(r?{{!}}num)}}&lt;br /&gt;
&lt;br /&gt;
=== Slot/Logic / Batched ===&lt;br /&gt;
&lt;br /&gt;
{{ICInstruction|instruction=lb|description=Loads LogicType from all output network devices with provided type hash using the provide batch mode. Average (0), Sum (1), Minimum (2), Maximum (3). Can use either the word, or the number.|syntax=lb r? deviceHash logicType batchMode&lt;br /&gt;
|example=&lt;br /&gt;
{{ICCode|lb r0 HASH(&amp;quot;StructureWallLight&amp;quot;) On Sum}}}}&lt;br /&gt;
{{ICInstruction|instruction=lbn|description=Loads LogicType from all output network devices with provided type and name hashes using the provide batch mode. Average (0), Sum (1), Minimum (2), Maximum (3). Can use either the word, or the number.|syntax=lbn r? deviceHash nameHash logicType batchMode}}&lt;br /&gt;
{{ICInstruction|instruction=lbns|description=Loads LogicSlotType from slotIndex from all output network devices with provided type and name hashes using the provide batch mode. Average (0), Sum (1), Minimum (2), Maximum (3). Can use either the word, or the number.|syntax=lbns r? deviceHash nameHash slotIndex logicSlotType batchMode}}&lt;br /&gt;
{{ICInstruction|instruction=lbs|description=Loads LogicSlotType from slotIndex from all output network devices with provided type hash using the provide batch mode. Average (0), Sum (1), Minimum (2), Maximum (3). Can use either the word, or the number.|syntax=lbs r? deviceHash slotIndex logicSlotType batchMode}}&lt;br /&gt;
{{ICInstruction|instruction=sb|description=Stores register value to LogicType on all output network devices with provided type hash.|syntax=sb deviceHash logicType r?&lt;br /&gt;
|example=&lt;br /&gt;
{{ICCode|sb HASH(&amp;quot;StructureWallLight&amp;quot;) On 1}}}}&lt;br /&gt;
{{ICInstruction|instruction=sbn|description=Stores register value to LogicType on all output network devices with provided type hash and name.|syntax=sbn deviceHash nameHash logicType r?}}&lt;br /&gt;
{{ICInstruction|instruction=sbs|description=Stores register value to LogicSlotType on all output network devices with provided type hash in the provided slot.|syntax=sbs deviceHash slotIndex logicSlotType r?}}&lt;br /&gt;
&lt;br /&gt;
== Bitwise ==&lt;br /&gt;
&lt;br /&gt;
{{ICInstruction|instruction=and|description=Performs a bitwise logical AND operation on the binary representation of two values. Each bit of the result is determined by evaluating the corresponding bits of the input values. If both bits are 1, the resulting bit is set to 1. Otherwise the resulting bit is set to 0.|syntax=and r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=nor|description=Performs a bitwise logical NOR (NOT OR) operation on the binary representation of two values. Each bit of the result is determined by evaluating the corresponding bits of the input values. If both bits are 0, the resulting bit is set to 1. Otherwise, if at least one bit is 1, the resulting bit is set to 0.|syntax=nor r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=not|description=Performs a bitwise logical NOT operation flipping each bit of the input value, resulting in a binary complement. If a bit is 1, it becomes 0, and if a bit is 0, it becomes 1.|syntax=not r? a(r?{{!}}num)&lt;br /&gt;
|note=&lt;br /&gt;
This is a bitwise operation, the NOT of 1 =&amp;gt; -2, etc. You may want to use seqz instead}}&lt;br /&gt;
{{ICInstruction|instruction=or|description=Performs a bitwise logical OR operation on the binary representation of two values. Each bit of the result is determined by evaluating the corresponding bits of the input values. If either bit is 1, the resulting bit is set to 1. If both bits are 0, the resulting bit is set to 0.|syntax=or r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=sla|description=Performs a bitwise arithmetic left shift operation on the binary representation of a value. It shifts the bits to the left and fills the vacated rightmost bits with zeros (note that this is indistinguishable from &#039;sll&#039;).|syntax=sla r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=sll|description=Performs a bitwise logical left shift operation on the binary representation of a value. It shifts the bits to the left and fills the vacated rightmost bits with zeros.|syntax=sll r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=sra|description=Performs a bitwise arithmetic right shift operation on the binary representation of a value. It shifts the bits to the right and fills the vacated leftmost bits with a copy of the sign bit (the most significant bit).|syntax=sra r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=srl|description=Performs a bitwise logical right shift operation on the binary representation of a value. It shifts the bits to the right and fills the vacated leftmost bits with zeros|syntax=srl r? a(r?{{!}}num) b(r?{{!}}num)}}{{ICInstruction&lt;br /&gt;
| instruction = rol&lt;br /&gt;
| syntax = rol r? a(r?{{!}}num) b(r?{{!}}num)&lt;br /&gt;
| description = Performs a bitwise left rotation on the binary representation of a by b places, wrapping the bits shifted out of the most significant position back into the least significant position.&lt;br /&gt;
| example = rol $DEADBEEFCAFE2000 16 -&amp;gt; $BEEFCAFE2000DEAD&lt;br /&gt;
}}{{ICInstruction&lt;br /&gt;
| instruction = ror&lt;br /&gt;
| syntax = ror r? a(r?{{!}}num) b(r?{{!}}num)&lt;br /&gt;
| description = Performs a bitwise right rotation on the binary representation of A by B places, wrapping the bits shifted out of the least significant position back into the most significant position.&lt;br /&gt;
| example = ror $1234, 4 -&amp;gt; $4000000000000123&lt;br /&gt;
}}{{ICInstruction|instruction=xor|description=Performs a bitwise logical XOR (exclusive OR) operation on the binary representation of two values. Each bit of the result is determined by evaluating the corresponding bits of the input values. If the bits are different (one bit is 0 and the other is 1), the resulting bit is set to 1. If the bits are the same (both 0 or both 1), the resulting bit is set to 0.|syntax=xor r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = ext&lt;br /&gt;
| description = Extracts a bit field from source value, beginning at bit offset for length bits and places result in the provided register. Payload cannot exceed 53 bits in final length.&lt;br /&gt;
| note = Throws a ShiftUnderflow exception if offset is smaller than 1 or length is smaller than 0.&amp;lt;br&amp;gt;&lt;br /&gt;
Throws a ShiftOverflow exception if offset is greater than or equal to 53 bits.&amp;lt;br&amp;gt;&lt;br /&gt;
Throws a PayloadOverflow exception if length is greater than 53 bits.&lt;br /&gt;
| example = {{ICCode|&lt;br /&gt;
move r0 $DEADBEEF&lt;br /&gt;
ext r1 r0 8 16 #After execution, r1&#039;s value is $ADBE&lt;br /&gt;
}}&lt;br /&gt;
| syntax = ext r? source(r?{{!}}num) offset(r?{{!}}num) length(r?{{!}}num)&lt;br /&gt;
}}&lt;br /&gt;
{{ICInstruction&lt;br /&gt;
| instruction = ins&lt;br /&gt;
| description = Inserts a bit field into the provided register, beginning at bit offset for length bits. Payload cannot exceed 53 bits in final length.&lt;br /&gt;
| syntax = ins r? field(r?{{!}}num) offset(r?{{!}}num) length(r?{{!}}num)&lt;br /&gt;
| note = Throws a ShiftUnderflow exception if length is smaller than 1 or offset is smaller than 0.&amp;lt;br&amp;gt;&lt;br /&gt;
Throws a ShiftOverflow exception if offset is greater than 53 bits.&amp;lt;br&amp;gt;&lt;br /&gt;
Throws a PayloadOverflow exception if offset+length is greater to or equal to 53 bits.&amp;lt;br&amp;gt;&lt;br /&gt;
| example = {{ICCode|move r0 $DE0000EF&lt;br /&gt;
move r1 $ADBE&lt;br /&gt;
ins r0 r1 8 16 #inserts field r1 at bit 8 for 16 bits, result: $DEADBEEF}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Comparison ==&lt;br /&gt;
&lt;br /&gt;
{{ICInstruction|instruction=select|description=Register = b if a is non-zero, otherwise c|syntax=select r? a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)&lt;br /&gt;
|example=&lt;br /&gt;
&amp;lt;b&amp;gt;1)&amp;lt;/b&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
move r0 &amp;lt;s style=&amp;quot;text-decoration-line:underline;text-decoration-color:red;&amp;quot;&amp;gt;0&amp;lt;/s&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
select &amp;lt;s style=&amp;quot;text-decoration-line:underline;text-decoration-color:red;&amp;gt;r1&amp;lt;/s&amp;gt; r0 10 &amp;lt;s style=&amp;quot;text-decoration-line:underline;text-decoration-color:red;&amp;gt;200&amp;lt;/s&amp;gt;&lt;br /&gt;
{{ICCode|&lt;br /&gt;
move r0 0&lt;br /&gt;
select r1 r0 10 200&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br/&amp;gt;after run, &amp;lt;s style=&amp;quot;text-decoration-line:underline;text-decoration-color:red;&amp;quot;&amp;gt;r1 = 200&amp;lt;/s&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;b&amp;gt;2)&amp;lt;/b&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
move r0 &amp;lt;s style=&amp;quot;text-decoration-line:underline;text-decoration-color:red;&amp;quot;&amp;gt;5&amp;lt;/s&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
select &amp;lt;s style=&amp;quot;text-decoration-line:underline;text-decoration-color:red;&amp;gt;r1&amp;lt;/s&amp;gt; r0 &amp;lt;s style=&amp;quot;text-decoration-line:underline;text-decoration-color:red;&amp;gt;10&amp;lt;/s&amp;gt; 200&lt;br /&gt;
{{ICCode|&lt;br /&gt;
move r0 1&lt;br /&gt;
select r1 r0 10 100&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br/&amp;gt;after run, &amp;lt;s style=&amp;quot;text-decoration-line:underline;text-decoration-color:red;&amp;quot;&amp;gt;r1 = 10&amp;lt;/s&amp;gt;&lt;br /&gt;
|note=&lt;br /&gt;
This operation can be used as a simple ternary condition}}&lt;br /&gt;
&lt;br /&gt;
=== Comparison / Device Pin ===&lt;br /&gt;
&lt;br /&gt;
{{ICInstruction|instruction=sdns|description=Register = 1 if device is not set, otherwise 0|syntax=sdns r? device(d?{{!}}r?{{!}}id)}}&lt;br /&gt;
{{ICInstruction|instruction=sdse|description=Register = 1 if device is set, otherwise 0.|syntax=sdse r? device(d?{{!}}r?{{!}}id)}}&lt;br /&gt;
&lt;br /&gt;
=== Comparison / Value ===&lt;br /&gt;
&lt;br /&gt;
{{ICInstruction|instruction=sap|description=Register = 1 if abs(a - b) &amp;lt;= max(c * max(abs(a), abs(b)), float.epsilon * 8), otherwise 0|syntax=sap r? a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)&lt;br /&gt;
|example=&lt;br /&gt;
Set register to 1 if a and b are close enough to each other with the scaling factor of c. Equivalent to Python [https://docs.python.org/3/library/math.html#math.isclose math.isclose]}}&lt;br /&gt;
{{ICInstruction|instruction=sapz|description=Register = 1 if abs(a) &amp;lt;= max(b * abs(a), float.epsilon * 8), otherwise 0|syntax=sapz r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=seq|description=Register = 1 if a == b, otherwise 0|syntax=seq r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=seqz|description=Register = 1 if a == 0, otherwise 0|syntax=seqz r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=sge|description=Register = 1 if a &amp;gt;= b, otherwise 0|syntax=sge r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=sgez|description=Register = 1 if a &amp;gt;= 0, otherwise 0|syntax=sgez r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=sgt|description=Register = 1 if a &amp;gt; b, otherwise 0|syntax=sgt r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=sgtz|description=Register = 1 if a &amp;gt; 0, otherwise 0|syntax=sgtz r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=sle|description=Register = 1 if a &amp;lt;= b, otherwise 0|syntax=sle r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=slez|description=Register = 1 if a &amp;lt;= 0, otherwise 0|syntax=slez r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=slt|description=Register = 1 if a &amp;lt; b, otherwise 0|syntax=slt r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=sltz|description=Register = 1 if a &amp;lt; 0, otherwise 0|syntax=sltz r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=sna|description=Register = 1 if abs(a - b) &amp;gt; max(c * max(abs(a), abs(b)), float.epsilon * 8), otherwise 0|syntax=sna r? a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=snan|description=Register = 1 if a is NaN, otherwise 0|syntax=snan r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=snanz|description=Register = 0 if a is NaN, otherwise 1|syntax=snanz r? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=snaz|description=Register = 1 if abs(a) &amp;gt; max(b * abs(a), float.epsilon), otherwise 0|syntax=snaz r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=sne|description=Register = 1 if a != b, otherwise 0|syntax=sne r? a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=snez|description=Register = 1 if a != 0, otherwise 0|syntax=snez r? a(r?{{!}}num)}}&lt;br /&gt;
&lt;br /&gt;
== Branching ==&lt;br /&gt;
&lt;br /&gt;
{{ICInstruction|instruction=j|description=Jump execution to line a|syntax=j int&lt;br /&gt;
|example=&lt;br /&gt;
{{ICCode|j 0 # jump line 0}}&lt;br /&gt;
{{ICCode|&lt;br /&gt;
j label # jump to a label&lt;br /&gt;
&lt;br /&gt;
label:&lt;br /&gt;
# your code here&lt;br /&gt;
}}}}&lt;br /&gt;
{{ICInstruction|instruction=jal|description=Jump execution to line a and store next line number in ra|syntax=jal int&lt;br /&gt;
|example=&lt;br /&gt;
jal provides a way to do function calls in IC10 mips&lt;br /&gt;
&lt;br /&gt;
{{ICCode|&lt;br /&gt;
move r0 1000&lt;br /&gt;
move r1 0&lt;br /&gt;
start:&lt;br /&gt;
jal average&lt;br /&gt;
s db Setting r0&lt;br /&gt;
yield&lt;br /&gt;
j start&lt;br /&gt;
&lt;br /&gt;
average:&lt;br /&gt;
add r0 r0 r1&lt;br /&gt;
div r0 r0 2&lt;br /&gt;
j ra # jump back&lt;br /&gt;
}}}}&lt;br /&gt;
{{ICInstruction|instruction=jr|description=Relative jump to line a|syntax=jr int}}&lt;br /&gt;
&lt;br /&gt;
=== Branching / Device Pin ===&lt;br /&gt;
&lt;br /&gt;
{{ICInstruction|instruction=bdnvl|description=Will branch to line a if the provided device not valid for a load instruction for the provided logic type.|syntax=bdnvl device(d?{{!}}r?{{!}}id) logicType a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bdnvs|description=Will branch to line a if the provided device not valid for a store instruction for the provided logic type.|syntax=bdnvs device(d?{{!}}r?{{!}}id) logicType a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bdns|description=Branch to line a if device d isn&#039;t set|syntax=bdns d? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bdnsal|description=Jump execution to line a and store next line number if device is not set|syntax=bdnsal d? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bdse|description=Branch to line a if device d is set|syntax=bdse d? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bdseal|description=Jump execution to line a and store next line number if device is set|syntax=bdseal d? a(r?{{!}}num)&lt;br /&gt;
|example=&lt;br /&gt;
{{ICCode|&lt;br /&gt;
#Store line number and jump to line 32 if d0 is assigned.&lt;br /&gt;
bdseal d0 32&lt;br /&gt;
}}&lt;br /&gt;
{{ICCode|&lt;br /&gt;
#Store line in ra and jump to label HarvestCrop if device d0 is assigned.&lt;br /&gt;
bdseal d0 HarvestCrop&lt;br /&gt;
}}}}&lt;br /&gt;
{{ICInstruction|instruction=brdns|description=Relative branch to line a if device is not set|syntax=brdns d? a(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=brdse|description=Relative branch to line a if device is set|syntax=brdse d? a(r?{{!}}num)}}&lt;br /&gt;
&lt;br /&gt;
=== Branching / Comparison ===&lt;br /&gt;
&lt;br /&gt;
{{ICInstruction|instruction=bap|description=Branch to line d if abs(a - b) &amp;lt;= max(c * max(abs(a), abs(b)), float.epsilon * 8)|syntax=bap a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num) d(r?{{!}}num)&lt;br /&gt;
|example=&lt;br /&gt;
Branch if a and b are close enough to each other with the scaling factor of c. Equivalent to Python [https://docs.python.org/3/library/math.html#math.isclose math.isclose]}}&lt;br /&gt;
{{ICInstruction|instruction=brap|description=Relative branch to line d if abs(a - b) &amp;lt;= max(c * max(abs(a), abs(b)), float.epsilon * 8)|syntax=brap a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num) d(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bapal|description=Branch to line c if a != b and store next line number in ra|syntax=bapal a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num) d(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bapz|description=Branch to line c if abs(a) &amp;lt;= max(b * abs(a), float.epsilon * 8)|syntax=bapz a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=brapz|description=Relative branch to line c if abs(a) &amp;lt;= max(b * abs(a), float.epsilon * 8)|syntax=brapz a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bapzal|description=Branch to line c if abs(a) &amp;lt;= max(b * abs(a), float.epsilon * 8) and store next line number in ra|syntax=bapzal a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=beq|description=Branch to line c if a == b|syntax=beq a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=breq|description=Relative branch to line c if a == b|syntax=breq a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=beqal|description=Branch to line c if a == b and store next line number in ra|syntax=beqal a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=beqz|description=Branch to line b if a == 0|syntax=beqz a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=breqz|description=Relative branch to line b if a == 0|syntax=breqz a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=beqzal|description=Branch to line b if a == 0 and store next line number in ra|syntax=beqzal a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bge|description=Branch to line c if a &amp;gt;= b|syntax=bge a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=brge|description=Relative branch to line c if a &amp;gt;= b|syntax=brge a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bgeal|description=Branch to line c if a &amp;gt;= b and store next line number in ra|syntax=bgeal a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bgez|description=Branch to line b if a &amp;gt;= 0|syntax=bgez a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=brgez|description=Relative branch to line b if a &amp;gt;= 0|syntax=brgez a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bgezal|description=Branch to line b if a &amp;gt;= 0 and store next line number in ra|syntax=bgezal a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bgt|description=Branch to line c if a &amp;gt; b|syntax=bgt a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)&lt;br /&gt;
|example=&lt;br /&gt;
An example of a &#039;&#039;&#039;Schmitt&#039;&#039;&#039; trigger, turning on a device if the temperature is too low, and turning it off if it&#039;s too high and finally&lt;br /&gt;
doing nothing if the temperature is within the desired range.&lt;br /&gt;
{{ICCode|&lt;br /&gt;
alias sensor d0&lt;br /&gt;
alias device d1&lt;br /&gt;
&lt;br /&gt;
define mintemp 293.15&lt;br /&gt;
define maxtemp 298.15&lt;br /&gt;
&lt;br /&gt;
start:&lt;br /&gt;
yield&lt;br /&gt;
l r0 sensor Temperature&lt;br /&gt;
# If the temperature &amp;lt; mintemp, turn on the device&lt;br /&gt;
blt r0 mintemp turnOn&lt;br /&gt;
# If the temperature &amp;gt; maxtemp, turn off the device&lt;br /&gt;
bgt r0 maxtemp turnOff&lt;br /&gt;
j start&lt;br /&gt;
&lt;br /&gt;
turnOn:&lt;br /&gt;
s device On 1&lt;br /&gt;
j start&lt;br /&gt;
turnOff:&lt;br /&gt;
s device On 0&lt;br /&gt;
j start&lt;br /&gt;
}}}}&lt;br /&gt;
{{ICInstruction|instruction=brgt|description=relative branch to line c if a &amp;gt; b|syntax=brgt a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bgtal|description=Branch to line c if a &amp;gt; b and store next line number in ra|syntax=bgtal a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bgtz|description=Branch to line b if a &amp;gt; 0|syntax=bgtz a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=brgtz|description=Relative branch to line b if a &amp;gt; 0|syntax=brgtz a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bgtzal|description=Branch to line b if a &amp;gt; 0 and store next line number in ra|syntax=bgtzal a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=ble|description=Branch to line c if a &amp;lt;= b|syntax=ble a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=brle|description=Relative branch to line c if a &amp;lt;= b|syntax=brle a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bleal|description=Branch to line c if a &amp;lt;= b and store next line number in ra|syntax=bleal a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=blez|description=Branch to line b if a &amp;lt;= 0|syntax=blez a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=brlez|description=Relative branch to line b if a &amp;lt;= 0|syntax=brlez a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=blezal|description=Branch to line b if a &amp;lt;= 0 and store next line number in ra|syntax=blezal a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=blt|description=Branch to line c if a &amp;lt; b|syntax=blt a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)&lt;br /&gt;
|example=&lt;br /&gt;
An example of a &#039;&#039;&#039;Schmitt&#039;&#039;&#039; trigger, turning on a device if the temperature is too low, and turning it off if it&#039;s too high and finally&lt;br /&gt;
doing nothing if the temperature is within the desired range.&lt;br /&gt;
{{ICCode|&lt;br /&gt;
alias sensor d0&lt;br /&gt;
alias device d1&lt;br /&gt;
&lt;br /&gt;
define mintemp 293.15&lt;br /&gt;
define maxtemp 298.15&lt;br /&gt;
&lt;br /&gt;
start:&lt;br /&gt;
yield&lt;br /&gt;
l r0 sensor Temperature&lt;br /&gt;
# If the temperature &amp;lt; mintemp, turn on the device&lt;br /&gt;
blt r0 mintemp turnOn&lt;br /&gt;
# If the temperature &amp;gt; maxtemp, turn off the device&lt;br /&gt;
bgt r0 maxtemp turnOff&lt;br /&gt;
j start&lt;br /&gt;
&lt;br /&gt;
turnOn:&lt;br /&gt;
s device On 1&lt;br /&gt;
j start&lt;br /&gt;
turnOff:&lt;br /&gt;
s device On 0&lt;br /&gt;
j start&lt;br /&gt;
}}}}&lt;br /&gt;
{{ICInstruction|instruction=brlt|description=Relative branch to line c if a &amp;lt; b|syntax=brlt a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bltal|description=Branch to line c if a &amp;lt; b and store next line number in ra|syntax=bltal a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bltz|description=Branch to line b if a &amp;lt; 0|syntax=bltz a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=brltz|description=Relative branch to line b if a &amp;lt; 0|syntax=brltz a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bltzal|description=Branch to line b if a &amp;lt; 0 and store next line number in ra|syntax=bltzal a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bna|description=Branch to line d if abs(a - b) &amp;gt; max(c * max(abs(a), abs(b)), float.epsilon * 8)|syntax=bna a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num) d(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=brna|description=Relative branch to line d if abs(a - b) &amp;gt; max(c * max(abs(a), abs(b)), float.epsilon * 8)|syntax=brna a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num) d(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bnaal|description=Branch to line d if abs(a - b) &amp;lt;= max(c * max(abs(a), abs(b)), float.epsilon * 8) and store next line number in ra|syntax=bnaal a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num) d(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bnan|description=Branch to line b if a is not a number (NaN)|syntax=bnan a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=brnan|description=Relative branch to line b if a is not a number (NaN)|syntax=brnan a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bnaz|description=Branch to line c if abs(a) &amp;gt; max (b * abs(a), float.epsilon * 8)|syntax=bnaz a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=brnaz|description=Relative branch to line c if abs(a) &amp;gt; max(b * abs(a), float.epsilon * 8)|syntax=brnaz a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bnazal|description=Branch to line c if abs(a) &amp;gt; max (b * abs(a), float.epsilon * 8) and store next line number in ra|syntax=bnazal a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bne|description=Branch to line c if a != b|syntax=bne a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=brne|description=Relative branch to line c if a != b|syntax=brne a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bneal|description=Branch to line c if a != b and store next line number in ra|syntax=bneal a(r?{{!}}num) b(r?{{!}}num) c(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bnez|description=branch to line b if a != 0|syntax=bnez a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=brnez|description=Relative branch to line b if a != 0|syntax=brnez a(r?{{!}}num) b(r?{{!}}num)}}&lt;br /&gt;
{{ICInstruction|instruction=bnezal|description=Branch to line b if a != 0 and store next line number in ra|syntax=bnezal a(r?{{!}}num) b(r?{{!}}num)}}&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=User:RA2lover/Sandbox/Thermodynamics_machinery_notes/Combustion_Processors&amp;diff=28144</id>
		<title>User:RA2lover/Sandbox/Thermodynamics machinery notes/Combustion Processors</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=User:RA2lover/Sandbox/Thermodynamics_machinery_notes/Combustion_Processors&amp;diff=28144"/>
		<updated>2026-09-12T07:49:29Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: /* Control theory */ add missing acceleration factor&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Internal Combustion Engine ==&lt;br /&gt;
Both the [[Combustion Centrifuge]] and [[Combustion Deep Miner]] share the same Internal Combustion engine, running these stages each tick:&lt;br /&gt;
&lt;br /&gt;
=== Game Tick Combustion ===&lt;br /&gt;
Performed during game tick before all following actions.&lt;br /&gt;
&lt;br /&gt;
=== Manual Combust ===&lt;br /&gt;
&lt;br /&gt;
* Stores Game Tick combustion energy&lt;br /&gt;
* Force-combusts internal atmosphere on top of existing combustion (Combustion limiter^2 * 75%), clamped between 0.1% and 100%&lt;br /&gt;
** Because maximum combustion limiter setting is 100%, this limits maximum force-combustion to 75% of whatever fuel mix was in the atmosphere after game tick combustion.&lt;br /&gt;
** Because the combustion limiter is clamped into 10% increments, this leads to the following force-combustion percentages:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Force-Combustion Percentages&lt;br /&gt;
!Combustion Limiter setting&lt;br /&gt;
!Combustion Percentage&lt;br /&gt;
|-&lt;br /&gt;
|0%&lt;br /&gt;
|0.1%&lt;br /&gt;
|-&lt;br /&gt;
|10%&lt;br /&gt;
|0.75%&lt;br /&gt;
|-&lt;br /&gt;
|20%&lt;br /&gt;
|3%&lt;br /&gt;
|-&lt;br /&gt;
|30%&lt;br /&gt;
|6.75%&lt;br /&gt;
|-&lt;br /&gt;
|40%&lt;br /&gt;
|12%&lt;br /&gt;
|-&lt;br /&gt;
|50%&lt;br /&gt;
|18.75%&lt;br /&gt;
|-&lt;br /&gt;
|60%&lt;br /&gt;
|27%&lt;br /&gt;
|-&lt;br /&gt;
|70%&lt;br /&gt;
|36.75%&lt;br /&gt;
|-&lt;br /&gt;
|80%&lt;br /&gt;
|48%&lt;br /&gt;
|-&lt;br /&gt;
|90%&lt;br /&gt;
|60.75%&lt;br /&gt;
|-&lt;br /&gt;
|100%&lt;br /&gt;
|75%&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Speed Tick ===&lt;br /&gt;
&lt;br /&gt;
* Target a 4000 kPa internal chamber pressure. Excess pressure is sent into exhaust during gas output stage.&lt;br /&gt;
* If internal atmosphere is above 300°C and total energy combusted combining game tick combustion and manual combustion exceeds 30 J:&lt;br /&gt;
** Increase RPM by Internal atmosphere temperature(in Kelvin) / 5000 K (clamped between 0 and 12 RPM/tick)&lt;br /&gt;
** Remove 30 J * RPM gained from internal atmosphere.&amp;lt;!-- Also Play Combustion Audio. --&amp;gt;&lt;br /&gt;
* Decrease RPM by 1%&lt;br /&gt;
* Check net RPM gain/loss after the previous steps.&lt;br /&gt;
* If RPM difference compared to  is less than 1/ Lerp(0.8, 2, (Current RPM-300) / 1200 ), decrease stress percentage by 0.5, to a minimum of 0.&lt;br /&gt;
** Otherwise, increase stress percentage by (RPM difference - 1) * Lerp(0.8, 2, (Current RPM-300) / 1200 )&lt;br /&gt;
* If stress percentage is at 100% or more, decrease RPM by 40 and enter shutdown state.&lt;br /&gt;
&lt;br /&gt;
=== Shutdown state ===&lt;br /&gt;
(Only runs if the machine is powered off or if it has been overstressed to a shutdown state)&lt;br /&gt;
&lt;br /&gt;
* Decrease RPM by 15.&lt;br /&gt;
* Target a RPM*4 kPa chamber pressure (limited to 4000 kPa). Excess pressure is sent into exhaust during gas output stage.&lt;br /&gt;
&lt;br /&gt;
=== Gas Output Stage ===&lt;br /&gt;
&lt;br /&gt;
* If internal chamber pressure is less than target, skip this stage.&lt;br /&gt;
* Otherwise, remove the smaller of:&lt;br /&gt;
** PressurePerTick * 10 L at chamber temperature&lt;br /&gt;
** 10% of Excess pressure(in kPa) * Internal atmosphere volume at chamber temperature&lt;br /&gt;
* Send removed contents into exhaust network.&lt;br /&gt;
&lt;br /&gt;
=== Gas Input Stage ===&lt;br /&gt;
&lt;br /&gt;
* If on, powered and not in a stress shutdown/error state:&lt;br /&gt;
** Remove 0..0.01 mols from input network and move into combustion network, scaled from 0 to full throttle and add into internal atmosphere, to be combusted during next tick.&lt;br /&gt;
** Note throttle is clamped into 10% increments - without a mol-limited input network you can only feed in fuel mix in multiples of 0.001 mol.&lt;br /&gt;
After the gas input stage, spark internal atmosphere if device is on and powered. This is not a part of the internal combustion engine&#039;s steps, but starts ignition on the next tick.&lt;br /&gt;
&lt;br /&gt;
== Combustion Deep Miner ==&lt;br /&gt;
&lt;br /&gt;
* Process progress during server export tick, adding deltaTime * RPM/200 to progress time for current ore (also applies to regular deep miner)&lt;br /&gt;
* If elapsed progress is greater than the current ore&#039;s spawn time and machine is able to export, spawn a dirty ore chunk into its export slot and elapsed progress to 0, generating a new time until next chunk.&lt;br /&gt;
&lt;br /&gt;
== Combustion Centrifuge ==&lt;br /&gt;
&lt;br /&gt;
* Process progress between shutdown handling state and gas output stage.&lt;br /&gt;
* Add game tick duration * RPM/300 progress time to thing being processed.&lt;br /&gt;
** Base processing time for items is 6 seconds/item for dirty ore/reagent mix, 1 second for regular ores.&lt;br /&gt;
* Assert an error state if total processed reagents exceeds 3000g.&lt;br /&gt;
* If ejecting something during server export tick, increase stress by RPM/10% - 1%, limited to a minimum of 0%, then decrease RPM by 1/10th. &lt;br /&gt;
** Reagents only get ejected if the contents for the respective reagent exceed 1g.&lt;br /&gt;
** The order in which reagents is ejected is fixed. In descending priority:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
|+Reagent Ejection Priority List&lt;br /&gt;
|Flour&lt;br /&gt;
|-&lt;br /&gt;
|Milk&lt;br /&gt;
|-&lt;br /&gt;
|Egg&lt;br /&gt;
|-&lt;br /&gt;
|Iron&lt;br /&gt;
|-&lt;br /&gt;
|Gold&lt;br /&gt;
|-&lt;br /&gt;
|Carbon (Charcoal)&lt;br /&gt;
|-&lt;br /&gt;
|Uranium&lt;br /&gt;
|-&lt;br /&gt;
|Copper&lt;br /&gt;
|-&lt;br /&gt;
|Steel&lt;br /&gt;
|-&lt;br /&gt;
|Hydrocarbon (Coal Ore)&lt;br /&gt;
|-&lt;br /&gt;
|Silver&lt;br /&gt;
|-&lt;br /&gt;
|Nickel&lt;br /&gt;
|-&lt;br /&gt;
|Lead&lt;br /&gt;
|-&lt;br /&gt;
|Electrum&lt;br /&gt;
|-&lt;br /&gt;
|Invar&lt;br /&gt;
|-&lt;br /&gt;
|Constantan&lt;br /&gt;
|-&lt;br /&gt;
|Solder&lt;br /&gt;
|-&lt;br /&gt;
|Plastic&lt;br /&gt;
|-&lt;br /&gt;
|Silicon&lt;br /&gt;
|-&lt;br /&gt;
|Salicylic Acid&lt;br /&gt;
|-&lt;br /&gt;
|Alcohol&lt;br /&gt;
|-&lt;br /&gt;
|Oil (Soy Oil)&lt;br /&gt;
|-&lt;br /&gt;
|Potato&lt;br /&gt;
|-&lt;br /&gt;
|Tomato&lt;br /&gt;
|-&lt;br /&gt;
|Fenoxitone&lt;br /&gt;
|-&lt;br /&gt;
|Coloring (Red)&lt;br /&gt;
|-&lt;br /&gt;
|Coloring (Green)&lt;br /&gt;
|-&lt;br /&gt;
|Coloring (Blue)&lt;br /&gt;
|-&lt;br /&gt;
|Coloring (Yellow)&lt;br /&gt;
|-&lt;br /&gt;
|Coloring (Orange)&lt;br /&gt;
|-&lt;br /&gt;
|Pumpkin&lt;br /&gt;
|-&lt;br /&gt;
|Rice&lt;br /&gt;
|-&lt;br /&gt;
|Waspaloy&lt;br /&gt;
|-&lt;br /&gt;
|Stellite&lt;br /&gt;
|-&lt;br /&gt;
|Inconel&lt;br /&gt;
|-&lt;br /&gt;
|Hastelloy&lt;br /&gt;
|-&lt;br /&gt;
|Astroloy&lt;br /&gt;
|-&lt;br /&gt;
|Cobalt&lt;br /&gt;
|-&lt;br /&gt;
|Corn&lt;br /&gt;
|-&lt;br /&gt;
|Wheat&lt;br /&gt;
|-&lt;br /&gt;
|Biomass&lt;br /&gt;
|-&lt;br /&gt;
|Soy (Soybean)&lt;br /&gt;
|-&lt;br /&gt;
|Mushroom&lt;br /&gt;
|-&lt;br /&gt;
|Sugar&lt;br /&gt;
|-&lt;br /&gt;
|Cocoa&lt;br /&gt;
|-&lt;br /&gt;
|Cheese&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Control theory ==&lt;br /&gt;
The centrifuge needs 30 J/tick of combustion to keep torque production and heat capture. For combustion mechanics, we can refer to Atmosphere.TryCombust. As a reminder, within a combustion processor it happens in two stages: natural combustion and manual combustion.&lt;br /&gt;
&lt;br /&gt;
Natural combustion uses a combustion multiplier curve:&lt;br /&gt;
&lt;br /&gt;
* If less than either 0.3 mmol of fuel or oxidizer and less than 0.3mmol of hypergolics is present, full combustion rate happens.&lt;br /&gt;
* If either nitrous oxide or ozone exceed 10% of the total oxidizers present, combustion rate is 0.05+(1/(0.025*gas temperature in °C)&amp;lt;sup&amp;gt;1.01&amp;lt;/sup&amp;gt;)&lt;br /&gt;
* If not, combustion rate is 0.05+ (1/(0.02*gas temperature in °C)&amp;lt;sup&amp;gt;1.6&amp;lt;/sup&amp;gt;)&lt;br /&gt;
* The combustion rate obtained in the above steps is then clamped between 0 and 1 and divided by 5 to get the combustion&#039;s ratio.&lt;br /&gt;
** With superfuel, full combustion starts dropping off at 42.08°C. With regular fuel, it starts dropping off at 51.63°C.&lt;br /&gt;
** Because the combustion centrifuge needs to be at least at 300°C to operate, natural combustion is fully in the combustion multiplier curve regime.&lt;br /&gt;
&lt;br /&gt;
Starting from ~1371°C on regular fuel and  7591°C on superfuel, this equals the lowest combustion limiter setting. Temperatures lower than this equal to higher settings, but even at the maximum burn rate temperatures it&#039;s only equal to a ~40% combustion limiter setting.&lt;br /&gt;
&lt;br /&gt;
Outside cooling the centrifuge at the absolute fastest rate possible (which does require this minimum fuel management), acceleration can be handled with a simple temperature control loop as temperature controls the centrifuge&#039;s torque production.&lt;br /&gt;
&lt;br /&gt;
The optimal acceleration or deceleration rate for stress reduction is slightly past &amp;lt;code&amp;gt;clamp(1000/(RPM+500), 0.5, 1.25)&amp;lt;/code&amp;gt;. At that point, stress changes at (1-excess RPM)%*&amp;lt;code&amp;gt;clamp(1000/(RPM+500), 0.5, 1.25)&amp;lt;/code&amp;gt;/tick instead of 0.5%/tick, which is always faster than 0.5%/tick when excess RPM is 0. Neutral stress buildup happens with an excess RPM of 1. Because temperature directly controls the engine&#039;s torque, we can map an optimal RPM to temperature curve.&lt;br /&gt;
&lt;br /&gt;
Raw Torque produced is &amp;lt;code&amp;gt;lerp(0,12, Internal Temperature/5000 K)&amp;lt;/code&amp;gt;. Friction then decreases RPM after torque production to 0.99x RPM. After the factors get applied, the temperature required for neutral net torque can be obtained by solving  &amp;lt;code&amp;gt;RPM = (RPM + lerp(0,12,T/5000))*0.99&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;w = (0.99w+(12T/5000)*0.99)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;0.01w = 0.0024T*0.99&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;0.01w = 0.002376T&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;w = 0.2376T&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We can then use stress as a leeway factor in our control loop:{{ICCode|1=alias Engine db&lt;br /&gt;
l r0 Engine RPM&lt;br /&gt;
&lt;br /&gt;
#Calculate minimum-stress acceleration&lt;br /&gt;
add r1 r0 500&lt;br /&gt;
div r1 1000 r1&lt;br /&gt;
clamp r1 0.5 1.25&lt;br /&gt;
&lt;br /&gt;
#Use stress as a proxy to push the acceleration further, targeting 50% stress&lt;br /&gt;
l r2 Engine Stress&lt;br /&gt;
mul r2 r2 0.01&lt;br /&gt;
lerp r2 2 0 r2 #neutral stress buildup at 1&lt;br /&gt;
add r1 r2 r1&lt;br /&gt;
&lt;br /&gt;
#whether to speed up or slow down, this can be omitted&lt;br /&gt;
select r2 Accelerating 99 -99 #also applies acceleration factor.&lt;br /&gt;
mul r1 r1 r2 #416.(6) K offset = 1 RPM/tick. multiplied by 0.2376, we get 99.&lt;br /&gt;
&lt;br /&gt;
#Apply acceleration on top of RPM&lt;br /&gt;
add r1 r0 r1&lt;br /&gt;
&lt;br /&gt;
#convert target RPM to target temperature in Kelvin&lt;br /&gt;
div r1 0.2376 r1}}&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=User:RA2lover/Sandbox/Thermodynamics_machinery_notes/Combustion_Processors&amp;diff=28143</id>
		<title>User:RA2lover/Sandbox/Thermodynamics machinery notes/Combustion Processors</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=User:RA2lover/Sandbox/Thermodynamics_machinery_notes/Combustion_Processors&amp;diff=28143"/>
		<updated>2026-09-12T06:37:35Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: /* Control theory */ rewrite stress-acceleration code to use lerp&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Internal Combustion Engine ==&lt;br /&gt;
Both the [[Combustion Centrifuge]] and [[Combustion Deep Miner]] share the same Internal Combustion engine, running these stages each tick:&lt;br /&gt;
&lt;br /&gt;
=== Game Tick Combustion ===&lt;br /&gt;
Performed during game tick before all following actions.&lt;br /&gt;
&lt;br /&gt;
=== Manual Combust ===&lt;br /&gt;
&lt;br /&gt;
* Stores Game Tick combustion energy&lt;br /&gt;
* Force-combusts internal atmosphere on top of existing combustion (Combustion limiter^2 * 75%), clamped between 0.1% and 100%&lt;br /&gt;
** Because maximum combustion limiter setting is 100%, this limits maximum force-combustion to 75% of whatever fuel mix was in the atmosphere after game tick combustion.&lt;br /&gt;
** Because the combustion limiter is clamped into 10% increments, this leads to the following force-combustion percentages:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Force-Combustion Percentages&lt;br /&gt;
!Combustion Limiter setting&lt;br /&gt;
!Combustion Percentage&lt;br /&gt;
|-&lt;br /&gt;
|0%&lt;br /&gt;
|0.1%&lt;br /&gt;
|-&lt;br /&gt;
|10%&lt;br /&gt;
|0.75%&lt;br /&gt;
|-&lt;br /&gt;
|20%&lt;br /&gt;
|3%&lt;br /&gt;
|-&lt;br /&gt;
|30%&lt;br /&gt;
|6.75%&lt;br /&gt;
|-&lt;br /&gt;
|40%&lt;br /&gt;
|12%&lt;br /&gt;
|-&lt;br /&gt;
|50%&lt;br /&gt;
|18.75%&lt;br /&gt;
|-&lt;br /&gt;
|60%&lt;br /&gt;
|27%&lt;br /&gt;
|-&lt;br /&gt;
|70%&lt;br /&gt;
|36.75%&lt;br /&gt;
|-&lt;br /&gt;
|80%&lt;br /&gt;
|48%&lt;br /&gt;
|-&lt;br /&gt;
|90%&lt;br /&gt;
|60.75%&lt;br /&gt;
|-&lt;br /&gt;
|100%&lt;br /&gt;
|75%&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Speed Tick ===&lt;br /&gt;
&lt;br /&gt;
* Target a 4000 kPa internal chamber pressure. Excess pressure is sent into exhaust during gas output stage.&lt;br /&gt;
* If internal atmosphere is above 300°C and total energy combusted combining game tick combustion and manual combustion exceeds 30 J:&lt;br /&gt;
** Increase RPM by Internal atmosphere temperature(in Kelvin) / 5000 K (clamped between 0 and 12 RPM/tick)&lt;br /&gt;
** Remove 30 J * RPM gained from internal atmosphere.&amp;lt;!-- Also Play Combustion Audio. --&amp;gt;&lt;br /&gt;
* Decrease RPM by 1%&lt;br /&gt;
* Check net RPM gain/loss after the previous steps.&lt;br /&gt;
* If RPM difference compared to  is less than 1/ Lerp(0.8, 2, (Current RPM-300) / 1200 ), decrease stress percentage by 0.5, to a minimum of 0.&lt;br /&gt;
** Otherwise, increase stress percentage by (RPM difference - 1) * Lerp(0.8, 2, (Current RPM-300) / 1200 )&lt;br /&gt;
* If stress percentage is at 100% or more, decrease RPM by 40 and enter shutdown state.&lt;br /&gt;
&lt;br /&gt;
=== Shutdown state ===&lt;br /&gt;
(Only runs if the machine is powered off or if it has been overstressed to a shutdown state)&lt;br /&gt;
&lt;br /&gt;
* Decrease RPM by 15.&lt;br /&gt;
* Target a RPM*4 kPa chamber pressure (limited to 4000 kPa). Excess pressure is sent into exhaust during gas output stage.&lt;br /&gt;
&lt;br /&gt;
=== Gas Output Stage ===&lt;br /&gt;
&lt;br /&gt;
* If internal chamber pressure is less than target, skip this stage.&lt;br /&gt;
* Otherwise, remove the smaller of:&lt;br /&gt;
** PressurePerTick * 10 L at chamber temperature&lt;br /&gt;
** 10% of Excess pressure(in kPa) * Internal atmosphere volume at chamber temperature&lt;br /&gt;
* Send removed contents into exhaust network.&lt;br /&gt;
&lt;br /&gt;
=== Gas Input Stage ===&lt;br /&gt;
&lt;br /&gt;
* If on, powered and not in a stress shutdown/error state:&lt;br /&gt;
** Remove 0..0.01 mols from input network and move into combustion network, scaled from 0 to full throttle and add into internal atmosphere, to be combusted during next tick.&lt;br /&gt;
** Note throttle is clamped into 10% increments - without a mol-limited input network you can only feed in fuel mix in multiples of 0.001 mol.&lt;br /&gt;
After the gas input stage, spark internal atmosphere if device is on and powered. This is not a part of the internal combustion engine&#039;s steps, but starts ignition on the next tick.&lt;br /&gt;
&lt;br /&gt;
== Combustion Deep Miner ==&lt;br /&gt;
&lt;br /&gt;
* Process progress during server export tick, adding deltaTime * RPM/200 to progress time for current ore (also applies to regular deep miner)&lt;br /&gt;
* If elapsed progress is greater than the current ore&#039;s spawn time and machine is able to export, spawn a dirty ore chunk into its export slot and elapsed progress to 0, generating a new time until next chunk.&lt;br /&gt;
&lt;br /&gt;
== Combustion Centrifuge ==&lt;br /&gt;
&lt;br /&gt;
* Process progress between shutdown handling state and gas output stage.&lt;br /&gt;
* Add game tick duration * RPM/300 progress time to thing being processed.&lt;br /&gt;
** Base processing time for items is 6 seconds/item for dirty ore/reagent mix, 1 second for regular ores.&lt;br /&gt;
* Assert an error state if total processed reagents exceeds 3000g.&lt;br /&gt;
* If ejecting something during server export tick, increase stress by RPM/10% - 1%, limited to a minimum of 0%, then decrease RPM by 1/10th. &lt;br /&gt;
** Reagents only get ejected if the contents for the respective reagent exceed 1g.&lt;br /&gt;
** The order in which reagents is ejected is fixed. In descending priority:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
|+Reagent Ejection Priority List&lt;br /&gt;
|Flour&lt;br /&gt;
|-&lt;br /&gt;
|Milk&lt;br /&gt;
|-&lt;br /&gt;
|Egg&lt;br /&gt;
|-&lt;br /&gt;
|Iron&lt;br /&gt;
|-&lt;br /&gt;
|Gold&lt;br /&gt;
|-&lt;br /&gt;
|Carbon (Charcoal)&lt;br /&gt;
|-&lt;br /&gt;
|Uranium&lt;br /&gt;
|-&lt;br /&gt;
|Copper&lt;br /&gt;
|-&lt;br /&gt;
|Steel&lt;br /&gt;
|-&lt;br /&gt;
|Hydrocarbon (Coal Ore)&lt;br /&gt;
|-&lt;br /&gt;
|Silver&lt;br /&gt;
|-&lt;br /&gt;
|Nickel&lt;br /&gt;
|-&lt;br /&gt;
|Lead&lt;br /&gt;
|-&lt;br /&gt;
|Electrum&lt;br /&gt;
|-&lt;br /&gt;
|Invar&lt;br /&gt;
|-&lt;br /&gt;
|Constantan&lt;br /&gt;
|-&lt;br /&gt;
|Solder&lt;br /&gt;
|-&lt;br /&gt;
|Plastic&lt;br /&gt;
|-&lt;br /&gt;
|Silicon&lt;br /&gt;
|-&lt;br /&gt;
|Salicylic Acid&lt;br /&gt;
|-&lt;br /&gt;
|Alcohol&lt;br /&gt;
|-&lt;br /&gt;
|Oil (Soy Oil)&lt;br /&gt;
|-&lt;br /&gt;
|Potato&lt;br /&gt;
|-&lt;br /&gt;
|Tomato&lt;br /&gt;
|-&lt;br /&gt;
|Fenoxitone&lt;br /&gt;
|-&lt;br /&gt;
|Coloring (Red)&lt;br /&gt;
|-&lt;br /&gt;
|Coloring (Green)&lt;br /&gt;
|-&lt;br /&gt;
|Coloring (Blue)&lt;br /&gt;
|-&lt;br /&gt;
|Coloring (Yellow)&lt;br /&gt;
|-&lt;br /&gt;
|Coloring (Orange)&lt;br /&gt;
|-&lt;br /&gt;
|Pumpkin&lt;br /&gt;
|-&lt;br /&gt;
|Rice&lt;br /&gt;
|-&lt;br /&gt;
|Waspaloy&lt;br /&gt;
|-&lt;br /&gt;
|Stellite&lt;br /&gt;
|-&lt;br /&gt;
|Inconel&lt;br /&gt;
|-&lt;br /&gt;
|Hastelloy&lt;br /&gt;
|-&lt;br /&gt;
|Astroloy&lt;br /&gt;
|-&lt;br /&gt;
|Cobalt&lt;br /&gt;
|-&lt;br /&gt;
|Corn&lt;br /&gt;
|-&lt;br /&gt;
|Wheat&lt;br /&gt;
|-&lt;br /&gt;
|Biomass&lt;br /&gt;
|-&lt;br /&gt;
|Soy (Soybean)&lt;br /&gt;
|-&lt;br /&gt;
|Mushroom&lt;br /&gt;
|-&lt;br /&gt;
|Sugar&lt;br /&gt;
|-&lt;br /&gt;
|Cocoa&lt;br /&gt;
|-&lt;br /&gt;
|Cheese&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Control theory ==&lt;br /&gt;
The centrifuge needs 30 J/tick of combustion to keep torque production and heat capture. For combustion mechanics, we can refer to Atmosphere.TryCombust. As a reminder, within a combustion processor it happens in two stages: natural combustion and manual combustion.&lt;br /&gt;
&lt;br /&gt;
Natural combustion uses a combustion multiplier curve:&lt;br /&gt;
&lt;br /&gt;
* If less than either 0.3 mmol of fuel or oxidizer and less than 0.3mmol of hypergolics is present, full combustion rate happens.&lt;br /&gt;
* If either nitrous oxide or ozone exceed 10% of the total oxidizers present, combustion rate is 0.05+(1/(0.025*gas temperature in °C)&amp;lt;sup&amp;gt;1.01&amp;lt;/sup&amp;gt;)&lt;br /&gt;
* If not, combustion rate is 0.05+ (1/(0.02*gas temperature in °C)&amp;lt;sup&amp;gt;1.6&amp;lt;/sup&amp;gt;)&lt;br /&gt;
* The combustion rate obtained in the above steps is then clamped between 0 and 1 and divided by 5 to get the combustion&#039;s ratio.&lt;br /&gt;
** With superfuel, full combustion starts dropping off at 42.08°C. With regular fuel, it starts dropping off at 51.63°C.&lt;br /&gt;
** Because the combustion centrifuge needs to be at least at 300°C to operate, natural combustion is fully in the combustion multiplier curve regime.&lt;br /&gt;
&lt;br /&gt;
Starting from ~1371°C on regular fuel and  7591°C on superfuel, this equals the lowest combustion limiter setting. Temperatures lower than this equal to higher settings, but even at the maximum burn rate temperatures it&#039;s only equal to a ~40% combustion limiter setting.&lt;br /&gt;
&lt;br /&gt;
Outside cooling the centrifuge at the absolute fastest rate possible (which does require this minimum fuel management), acceleration can be handled with a simple temperature control loop as temperature controls the centrifuge&#039;s torque production.&lt;br /&gt;
&lt;br /&gt;
The optimal acceleration or deceleration rate for stress reduction is slightly past &amp;lt;code&amp;gt;clamp(1000/(RPM+500), 0.5, 1.25)&amp;lt;/code&amp;gt;. At that point, stress changes at (1-excess RPM)%*&amp;lt;code&amp;gt;clamp(1000/(RPM+500), 0.5, 1.25)&amp;lt;/code&amp;gt;/tick instead of 0.5%/tick, which is always faster than 0.5%/tick when excess RPM is 0. Neutral stress buildup happens with an excess RPM of 1. Because temperature directly controls the engine&#039;s torque, we can map an optimal RPM to temperature curve.&lt;br /&gt;
&lt;br /&gt;
Raw Torque produced is &amp;lt;code&amp;gt;lerp(0,12, Internal Temperature/5000 K)&amp;lt;/code&amp;gt;. Friction then decreases RPM after torque production to 0.99x RPM. After the factors get applied, the temperature required for neutral net torque can be obtained by solving  &amp;lt;code&amp;gt;RPM = (RPM + lerp(0,12,T/5000))*0.99&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;w = (0.99w+(12T/5000)*0.99)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;0.01w = 0.0024T*0.99&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;0.01w = 0.002376T&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;w = 0.2376T&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We can then use stress as a leeway factor in our control loop:{{ICCode|alias Engine db&lt;br /&gt;
l r0 Engine RPM&lt;br /&gt;
&lt;br /&gt;
#Calculate minimum-stress acceleration&lt;br /&gt;
add r1 r0 500&lt;br /&gt;
div r1 1000 r1&lt;br /&gt;
clamp r1 0.5 1.25&lt;br /&gt;
&lt;br /&gt;
#Use stress as a proxy to push the acceleration further, targeting 50% stress&lt;br /&gt;
l r2 Engine Stress&lt;br /&gt;
mul r2 r2 0.01&lt;br /&gt;
lerp r2 2 0 r2 #neutral stress buildup at 1&lt;br /&gt;
add r1 r2 r1&lt;br /&gt;
&lt;br /&gt;
#whether to speed up or slow down, this can be omitted&lt;br /&gt;
select r2 Accelerating 1 -1&lt;br /&gt;
mul r1 r1 r2&lt;br /&gt;
&lt;br /&gt;
#Apply acceleration on top of RPM&lt;br /&gt;
add r1 r0 r1&lt;br /&gt;
&lt;br /&gt;
#convert target RPM to target temperature in Kelvin&lt;br /&gt;
div r1 0.2376 r1}}&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=User:RA2lover/Sandbox/Thermodynamics_machinery_notes/Combustion_Processors&amp;diff=28142</id>
		<title>User:RA2lover/Sandbox/Thermodynamics machinery notes/Combustion Processors</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=User:RA2lover/Sandbox/Thermodynamics_machinery_notes/Combustion_Processors&amp;diff=28142"/>
		<updated>2026-09-12T06:24:26Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: initial optimal control theory&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Internal Combustion Engine ==&lt;br /&gt;
Both the [[Combustion Centrifuge]] and [[Combustion Deep Miner]] share the same Internal Combustion engine, running these stages each tick:&lt;br /&gt;
&lt;br /&gt;
=== Game Tick Combustion ===&lt;br /&gt;
Performed during game tick before all following actions.&lt;br /&gt;
&lt;br /&gt;
=== Manual Combust ===&lt;br /&gt;
&lt;br /&gt;
* Stores Game Tick combustion energy&lt;br /&gt;
* Force-combusts internal atmosphere on top of existing combustion (Combustion limiter^2 * 75%), clamped between 0.1% and 100%&lt;br /&gt;
** Because maximum combustion limiter setting is 100%, this limits maximum force-combustion to 75% of whatever fuel mix was in the atmosphere after game tick combustion.&lt;br /&gt;
** Because the combustion limiter is clamped into 10% increments, this leads to the following force-combustion percentages:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Force-Combustion Percentages&lt;br /&gt;
!Combustion Limiter setting&lt;br /&gt;
!Combustion Percentage&lt;br /&gt;
|-&lt;br /&gt;
|0%&lt;br /&gt;
|0.1%&lt;br /&gt;
|-&lt;br /&gt;
|10%&lt;br /&gt;
|0.75%&lt;br /&gt;
|-&lt;br /&gt;
|20%&lt;br /&gt;
|3%&lt;br /&gt;
|-&lt;br /&gt;
|30%&lt;br /&gt;
|6.75%&lt;br /&gt;
|-&lt;br /&gt;
|40%&lt;br /&gt;
|12%&lt;br /&gt;
|-&lt;br /&gt;
|50%&lt;br /&gt;
|18.75%&lt;br /&gt;
|-&lt;br /&gt;
|60%&lt;br /&gt;
|27%&lt;br /&gt;
|-&lt;br /&gt;
|70%&lt;br /&gt;
|36.75%&lt;br /&gt;
|-&lt;br /&gt;
|80%&lt;br /&gt;
|48%&lt;br /&gt;
|-&lt;br /&gt;
|90%&lt;br /&gt;
|60.75%&lt;br /&gt;
|-&lt;br /&gt;
|100%&lt;br /&gt;
|75%&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Speed Tick ===&lt;br /&gt;
&lt;br /&gt;
* Target a 4000 kPa internal chamber pressure. Excess pressure is sent into exhaust during gas output stage.&lt;br /&gt;
* If internal atmosphere is above 300°C and total energy combusted combining game tick combustion and manual combustion exceeds 30 J:&lt;br /&gt;
** Increase RPM by Internal atmosphere temperature(in Kelvin) / 5000 K (clamped between 0 and 12 RPM/tick)&lt;br /&gt;
** Remove 30 J * RPM gained from internal atmosphere.&amp;lt;!-- Also Play Combustion Audio. --&amp;gt;&lt;br /&gt;
* Decrease RPM by 1%&lt;br /&gt;
* Check net RPM gain/loss after the previous steps.&lt;br /&gt;
* If RPM difference compared to  is less than 1/ Lerp(0.8, 2, (Current RPM-300) / 1200 ), decrease stress percentage by 0.5, to a minimum of 0.&lt;br /&gt;
** Otherwise, increase stress percentage by (RPM difference - 1) * Lerp(0.8, 2, (Current RPM-300) / 1200 )&lt;br /&gt;
* If stress percentage is at 100% or more, decrease RPM by 40 and enter shutdown state.&lt;br /&gt;
&lt;br /&gt;
=== Shutdown state ===&lt;br /&gt;
(Only runs if the machine is powered off or if it has been overstressed to a shutdown state)&lt;br /&gt;
&lt;br /&gt;
* Decrease RPM by 15.&lt;br /&gt;
* Target a RPM*4 kPa chamber pressure (limited to 4000 kPa). Excess pressure is sent into exhaust during gas output stage.&lt;br /&gt;
&lt;br /&gt;
=== Gas Output Stage ===&lt;br /&gt;
&lt;br /&gt;
* If internal chamber pressure is less than target, skip this stage.&lt;br /&gt;
* Otherwise, remove the smaller of:&lt;br /&gt;
** PressurePerTick * 10 L at chamber temperature&lt;br /&gt;
** 10% of Excess pressure(in kPa) * Internal atmosphere volume at chamber temperature&lt;br /&gt;
* Send removed contents into exhaust network.&lt;br /&gt;
&lt;br /&gt;
=== Gas Input Stage ===&lt;br /&gt;
&lt;br /&gt;
* If on, powered and not in a stress shutdown/error state:&lt;br /&gt;
** Remove 0..0.01 mols from input network and move into combustion network, scaled from 0 to full throttle and add into internal atmosphere, to be combusted during next tick.&lt;br /&gt;
** Note throttle is clamped into 10% increments - without a mol-limited input network you can only feed in fuel mix in multiples of 0.001 mol.&lt;br /&gt;
After the gas input stage, spark internal atmosphere if device is on and powered. This is not a part of the internal combustion engine&#039;s steps, but starts ignition on the next tick.&lt;br /&gt;
&lt;br /&gt;
== Combustion Deep Miner ==&lt;br /&gt;
&lt;br /&gt;
* Process progress during server export tick, adding deltaTime * RPM/200 to progress time for current ore (also applies to regular deep miner)&lt;br /&gt;
* If elapsed progress is greater than the current ore&#039;s spawn time and machine is able to export, spawn a dirty ore chunk into its export slot and elapsed progress to 0, generating a new time until next chunk.&lt;br /&gt;
&lt;br /&gt;
== Combustion Centrifuge ==&lt;br /&gt;
&lt;br /&gt;
* Process progress between shutdown handling state and gas output stage.&lt;br /&gt;
* Add game tick duration * RPM/300 progress time to thing being processed.&lt;br /&gt;
** Base processing time for items is 6 seconds/item for dirty ore/reagent mix, 1 second for regular ores.&lt;br /&gt;
* Assert an error state if total processed reagents exceeds 3000g.&lt;br /&gt;
* If ejecting something during server export tick, increase stress by RPM/10% - 1%, limited to a minimum of 0%, then decrease RPM by 1/10th. &lt;br /&gt;
** Reagents only get ejected if the contents for the respective reagent exceed 1g.&lt;br /&gt;
** The order in which reagents is ejected is fixed. In descending priority:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
|+Reagent Ejection Priority List&lt;br /&gt;
|Flour&lt;br /&gt;
|-&lt;br /&gt;
|Milk&lt;br /&gt;
|-&lt;br /&gt;
|Egg&lt;br /&gt;
|-&lt;br /&gt;
|Iron&lt;br /&gt;
|-&lt;br /&gt;
|Gold&lt;br /&gt;
|-&lt;br /&gt;
|Carbon (Charcoal)&lt;br /&gt;
|-&lt;br /&gt;
|Uranium&lt;br /&gt;
|-&lt;br /&gt;
|Copper&lt;br /&gt;
|-&lt;br /&gt;
|Steel&lt;br /&gt;
|-&lt;br /&gt;
|Hydrocarbon (Coal Ore)&lt;br /&gt;
|-&lt;br /&gt;
|Silver&lt;br /&gt;
|-&lt;br /&gt;
|Nickel&lt;br /&gt;
|-&lt;br /&gt;
|Lead&lt;br /&gt;
|-&lt;br /&gt;
|Electrum&lt;br /&gt;
|-&lt;br /&gt;
|Invar&lt;br /&gt;
|-&lt;br /&gt;
|Constantan&lt;br /&gt;
|-&lt;br /&gt;
|Solder&lt;br /&gt;
|-&lt;br /&gt;
|Plastic&lt;br /&gt;
|-&lt;br /&gt;
|Silicon&lt;br /&gt;
|-&lt;br /&gt;
|Salicylic Acid&lt;br /&gt;
|-&lt;br /&gt;
|Alcohol&lt;br /&gt;
|-&lt;br /&gt;
|Oil (Soy Oil)&lt;br /&gt;
|-&lt;br /&gt;
|Potato&lt;br /&gt;
|-&lt;br /&gt;
|Tomato&lt;br /&gt;
|-&lt;br /&gt;
|Fenoxitone&lt;br /&gt;
|-&lt;br /&gt;
|Coloring (Red)&lt;br /&gt;
|-&lt;br /&gt;
|Coloring (Green)&lt;br /&gt;
|-&lt;br /&gt;
|Coloring (Blue)&lt;br /&gt;
|-&lt;br /&gt;
|Coloring (Yellow)&lt;br /&gt;
|-&lt;br /&gt;
|Coloring (Orange)&lt;br /&gt;
|-&lt;br /&gt;
|Pumpkin&lt;br /&gt;
|-&lt;br /&gt;
|Rice&lt;br /&gt;
|-&lt;br /&gt;
|Waspaloy&lt;br /&gt;
|-&lt;br /&gt;
|Stellite&lt;br /&gt;
|-&lt;br /&gt;
|Inconel&lt;br /&gt;
|-&lt;br /&gt;
|Hastelloy&lt;br /&gt;
|-&lt;br /&gt;
|Astroloy&lt;br /&gt;
|-&lt;br /&gt;
|Cobalt&lt;br /&gt;
|-&lt;br /&gt;
|Corn&lt;br /&gt;
|-&lt;br /&gt;
|Wheat&lt;br /&gt;
|-&lt;br /&gt;
|Biomass&lt;br /&gt;
|-&lt;br /&gt;
|Soy (Soybean)&lt;br /&gt;
|-&lt;br /&gt;
|Mushroom&lt;br /&gt;
|-&lt;br /&gt;
|Sugar&lt;br /&gt;
|-&lt;br /&gt;
|Cocoa&lt;br /&gt;
|-&lt;br /&gt;
|Cheese&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Control theory ==&lt;br /&gt;
The centrifuge needs 30 J/tick of combustion to keep torque production and heat capture. For combustion mechanics, we can refer to Atmosphere.TryCombust. As a reminder, within a combustion processor it happens in two stages: natural combustion and manual combustion.&lt;br /&gt;
&lt;br /&gt;
Natural combustion uses a combustion multiplier curve:&lt;br /&gt;
&lt;br /&gt;
* If less than either 0.3 mmol of fuel or oxidizer and less than 0.3mmol of hypergolics is present, full combustion rate happens.&lt;br /&gt;
* If either nitrous oxide or ozone exceed 10% of the total oxidizers present, combustion rate is 0.05+(1/(0.025*gas temperature in °C)&amp;lt;sup&amp;gt;1.01&amp;lt;/sup&amp;gt;)&lt;br /&gt;
* If not, combustion rate is 0.05+ (1/(0.02*gas temperature in °C)&amp;lt;sup&amp;gt;1.6&amp;lt;/sup&amp;gt;)&lt;br /&gt;
* The combustion rate obtained in the above steps is then clamped between 0 and 1 and divided by 5 to get the combustion&#039;s ratio.&lt;br /&gt;
** With superfuel, full combustion starts dropping off at 42.08°C. With regular fuel, it starts dropping off at 51.63°C.&lt;br /&gt;
** Because the combustion centrifuge needs to be at least at 300°C to operate, natural combustion is fully in the combustion multiplier curve regime.&lt;br /&gt;
&lt;br /&gt;
Starting from ~1371°C on regular fuel and  7591°C on superfuel, this equals the lowest combustion limiter setting. Temperatures lower than this equal to higher settings, but even at the maximum burn rate temperatures it&#039;s only equal to a ~40% combustion limiter setting.&lt;br /&gt;
&lt;br /&gt;
Outside cooling the centrifuge at the absolute fastest rate possible (which does require this minimum fuel management), acceleration can be handled with a simple temperature control loop as temperature controls the centrifuge&#039;s torque production.&lt;br /&gt;
&lt;br /&gt;
The optimal acceleration or deceleration rate for stress reduction is slightly past &amp;lt;code&amp;gt;clamp(1000/(RPM+500), 0.5, 1.25)&amp;lt;/code&amp;gt;. At that point, stress changes at (1-excess RPM)%*&amp;lt;code&amp;gt;clamp(1000/(RPM+500), 0.5, 1.25)&amp;lt;/code&amp;gt;/tick instead of 0.5%/tick, which is always faster than 0.5%/tick when excess RPM is 0. Neutral stress buildup happens with an excess RPM of 1. Because temperature directly controls the engine&#039;s torque, we can map an optimal RPM to temperature curve.&lt;br /&gt;
&lt;br /&gt;
Raw Torque produced is &amp;lt;code&amp;gt;lerp(0,12, Internal Temperature/5000 K)&amp;lt;/code&amp;gt;. Friction then decreases RPM after torque production to 0.99x RPM. After the factors get applied, the temperature required for neutral net torque can be obtained by solving  &amp;lt;code&amp;gt;RPM = (RPM + lerp(0,12,T/5000))*0.99&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;w = (0.99w+(12T/5000)*0.99)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;0.01w = 0.0024T*0.99&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;0.01w = 0.002376T&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;w = 0.2376T&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We can then use stress as a leeway factor in our control loop:{{ICCode|alias Engine db&lt;br /&gt;
l r0 Engine RPM&lt;br /&gt;
&lt;br /&gt;
#Calculate minimum-stress acceleration&lt;br /&gt;
add r1 r0 500&lt;br /&gt;
div r1 1000 r1&lt;br /&gt;
clamp r1 0.5 1.25&lt;br /&gt;
&lt;br /&gt;
#Use stress as a proxy to push the acceleration further, targeting 50% stress&lt;br /&gt;
l r2 Engine Stress&lt;br /&gt;
sub r2 r2 50&lt;br /&gt;
mul r2 r2 0.01&lt;br /&gt;
add r1 r2 r1&lt;br /&gt;
&lt;br /&gt;
#whether to speed up or slow down, this can be omitted&lt;br /&gt;
select r2 Accelerating 1 -1&lt;br /&gt;
mul r1 r1 r2&lt;br /&gt;
&lt;br /&gt;
#Apply acceleration on top of RPM&lt;br /&gt;
add r1 r0 r1&lt;br /&gt;
&lt;br /&gt;
#convert target RPM to target temperature in Kelvin&lt;br /&gt;
div r1 0.2376 r1}}&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=User:RA2lover/Sandbox/Satellite_Dish_Automation&amp;diff=28119</id>
		<title>User:RA2lover/Sandbox/Satellite Dish Automation</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=User:RA2lover/Sandbox/Satellite_Dish_Automation&amp;diff=28119"/>
		<updated>2026-09-11T07:37:09Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: add landing pad connector parameters. not sure if they fit this page&amp;#039;s purpose in its current name, might change it to landing pad automation later&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*  No information on signal strength is provided until a signal is resolved.&lt;br /&gt;
*  No info on resolution progress is provided in a way accessible to logic automation. This is likely because resolution progress rate could be used to estimate contact angle indirectly resulting in resolution exploits.&lt;br /&gt;
*  Once resolution is complete, the signal strength value is updated from -1 to the angle between the dish and its contact in degrees. Unlike pre-terrain-update guides, lower signal strength values after resolution result in faster resolution times.&lt;br /&gt;
*  Contact celestial positions can be triangulated by taking scans from different orientations:&lt;br /&gt;
** 1 resolution constrains the target&#039;s position at a given timeframe to a [https://en.wikipedia.org/wiki/Spherical_circle spherical circle] in the sky.&lt;br /&gt;
** 2 resolutions from different orientations constrain the target&#039;s position to 2 points in the sky (assuming the circles from both resolutions intersect).&lt;br /&gt;
** 3 resolutions from different orientations constrain the target&#039;s position to a point in the sky (assuming resolution orientations are not coplanar).&lt;br /&gt;
&lt;br /&gt;
Math can be used to track down those points. Our goal is to calculate the celestial angles at which the circumferences intersect, and point the dish at them. Even though the contact moves, as the error gets smaller resolutions can be made faster.&lt;br /&gt;
&lt;br /&gt;
== 1 resolution tracking ==&lt;br /&gt;
&lt;br /&gt;
With 1 resolution, the contact is constrained to a plane normal to our celestial reference point. This can be thought as a unit-hypotenuse right-angled triangle where the hypotenuse goes between our celestial reference point and the contact, the side adjacent to the celestial reference point is offset at an angle equal to our signal strength angle, has a length of cos(said angle), and the opposite side has a length of sin(said angle).&lt;br /&gt;
&lt;br /&gt;
Once the resolution is complete, we know how far the dish is from the contact, but we do not know which direction to point the dish towards. The next step in triangulation is to point the dish into a random direction and pray we&#039;ve pointed it closer, which may not always be the case.&lt;br /&gt;
&lt;br /&gt;
== 2 resolution tracking ==&lt;br /&gt;
&lt;br /&gt;
With 2 resolutions from different directions, the contact is constrained to 2 planes, whose intersection results in a line. The intersection of this line with the celestial circle results in 2 possible points that the target may be in. Which of these still has to be picked at random, however - with the special exception of one of the points being below the horizon and discardable by virtue of being unpointable.&lt;br /&gt;
&lt;br /&gt;
== 3 resolution tracking ==&lt;br /&gt;
&lt;br /&gt;
With 3 resolutions from different directions, the contact would be constrained to 3 lines resulting from 3 different 2-resolution tracking systems. This can be converted into a point by solving a least-squares problem, but an approximation reusing existing code for the 2 resolution tracking problem can be made by picking one of the two potential points from the 2 latest resolutions and using the first resolution to ignore the least-likely point.&lt;br /&gt;
&lt;br /&gt;
== Medium Satellite Dish Stack Operations ==&lt;br /&gt;
On every logic tick:&lt;br /&gt;
&lt;br /&gt;
* Sweep the entire stack memory, erasing stack addresses which contain a &amp;lt;code&amp;gt;TraderBuyThingData&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;TraderSellThingData&amp;lt;/code&amp;gt; opcode.&lt;br /&gt;
* Initialize &amp;lt;code&amp;gt;LastWriteAddress&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Sweep the entire stack memory, looking for the following instructions and executing them: &amp;lt;code&amp;gt;WriteTraderData&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WriteTraderBuyData&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WriteTraderSellData&amp;lt;/code&amp;gt;.&lt;br /&gt;
* After execution of each instruction, set LastWriteAddress to the instruction&#039;s address. &lt;br /&gt;
&lt;br /&gt;
=== Medium Satellite Dish Stack Instructions ===&lt;br /&gt;
&lt;br /&gt;
==== WriteTraderData (1) ====&lt;br /&gt;
&lt;br /&gt;
* Read &amp;lt;code&amp;gt;WRITE_INDEX&amp;lt;/code&amp;gt; byte.&lt;br /&gt;
* Get strongest contact.&lt;br /&gt;
* Write &amp;lt;code&amp;gt;StrongestContactIdHash&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;WRITE_INDEX&amp;lt;/code&amp;gt;&lt;br /&gt;
* Write &amp;lt;code&amp;gt;StrongestContactMetadata&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;WRITE_INDEX+1&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Write &amp;lt;code&amp;gt;StrongestContactSignalData&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;WRITE_INDEX+2&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== WriteTraderBuyData (5) ===&lt;br /&gt;
&lt;br /&gt;
* Try getting the strongest contact. If it can&#039;t be found, finish instruction without writing anything.&lt;br /&gt;
* Read &amp;lt;code&amp;gt;WRITE_INDEX&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;WRITE_COUNT&amp;lt;/code&amp;gt; bytes.&lt;br /&gt;
* check if &amp;lt;code&amp;gt;WRITE_INDEX&amp;lt;/code&amp;gt; is past the stack memory and finish instruction early if so.&lt;br /&gt;
* For each Trader Buy Data instance:&lt;br /&gt;
** Get the item corresponding to that Trader Buy Data.&lt;br /&gt;
** If trader wants at least 1, &lt;br /&gt;
** For Thing trades:&lt;br /&gt;
*** Check if the item being traded meets filters:&lt;br /&gt;
**** look for &amp;lt;code&amp;gt;FilterPrefabHashEquals&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FilterPrefabHashNotEquals&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FilterSortingClassCompare&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;FilterQuantityCompare&amp;lt;/code&amp;gt; modifiers from &amp;lt;code&amp;gt;LastWrite+1&amp;lt;/code&amp;gt; up to the end of the stack or the first write instruction it finds (which may not be the same as the executing instruction if the instruction is being executed from address 0 or if the instruction has been overwritten during execution). If any filter criteria evaluate to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, skip to the next item.&lt;br /&gt;
**** Write &amp;lt;code&amp;gt;TradeBuyThingData&amp;lt;/code&amp;gt; For the Thing being traded.&lt;br /&gt;
**** For each child item:&lt;br /&gt;
***** Check for &amp;lt;code&amp;gt;PrefabHashEquals&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PrefabHashNotEquals&amp;lt;/code&amp;gt; using the same filtering rules as above. If none are invalid, write &amp;lt;code&amp;gt;TraderBuyThingChildData&amp;lt;/code&amp;gt; for the child item.&lt;br /&gt;
****** Note that executable instructions may have been overwritten by previous writes.&lt;br /&gt;
***** If outside the write range for the instruction, finish instruction early.&lt;br /&gt;
** For Gas trades:&lt;br /&gt;
*** Look for &amp;lt;code&amp;gt;FilterGasContains&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;FilterGasNotContains&amp;lt;/code&amp;gt; instructions from &amp;lt;code&amp;gt;LastWrite+1&amp;lt;/code&amp;gt; up to the end of the stack or the first write instruction it finds (keep in mind write instructions can be overwritten during execution).&lt;br /&gt;
**** If no filter rules evaluate to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, write &amp;lt;code&amp;gt;TraderBuyGasData&amp;lt;/code&amp;gt; for the corresponding gas.&lt;br /&gt;
**** Note &amp;lt;code&amp;gt;FilterQuantityCompare&amp;lt;/code&amp;gt; does not filter out gas trades. &#039;&#039;&#039;&#039;&#039;This may be a bug.&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
** Check if past the write range for the instruction, finishing it early if so.&lt;br /&gt;
&lt;br /&gt;
=== WriteTraderSellData (6) ===&lt;br /&gt;
&lt;br /&gt;
* Try getting the strongest contact. If it can&#039;t be found, finish instruction without writing anything.&lt;br /&gt;
* Read &amp;lt;code&amp;gt;WRITE_INDEX&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;WRITE_COUNT&amp;lt;/code&amp;gt; bytes.&lt;br /&gt;
* check if &amp;lt;code&amp;gt;WRITE_INDEX&amp;lt;/code&amp;gt; is past the stack memory and finish instruction early if so.&lt;br /&gt;
* For each Trader Sell Data instance:&lt;br /&gt;
** Get the item corresponding to that Trader Sell Data.&lt;br /&gt;
** If trader offers at least 1, &lt;br /&gt;
** For Thing trades:&lt;br /&gt;
*** Check if the item being traded meets filters:&lt;br /&gt;
**** look for &amp;lt;code&amp;gt;FilterPrefabHashEquals&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FilterPrefabHashNotEquals&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FilterSortingClassCompare&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;FilterQuantityCompare&amp;lt;/code&amp;gt; modifiers from &amp;lt;code&amp;gt;LastWrite+1&amp;lt;/code&amp;gt; up to the end of the stack or the first write instruction it finds (which may not be the same as the executing instruction if the instruction is being executed from address 0 or if the instruction has been overwritten during execution). If any filter criteria evaluate to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, skip to the next item.&lt;br /&gt;
**** Write &amp;lt;code&amp;gt;TradeSellThingData&amp;lt;/code&amp;gt; For the Thing being traded.&lt;br /&gt;
**** For each child item:&lt;br /&gt;
***** Check for &amp;lt;code&amp;gt;PrefabHashEquals&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PrefabHashNotEquals&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FilterSortingClassCompare&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;FIlterQuantityCompare&amp;lt;/code&amp;gt; using the same filtering rules as above. If none are invalid, write &amp;lt;code&amp;gt;TraderSellThingChildData&amp;lt;/code&amp;gt; for the child item.&lt;br /&gt;
****** Note that executable instructions may have been overwritten by previous writes.&lt;br /&gt;
****** Note the criteria for children are interpreted differently than &amp;lt;code&amp;gt;WriteTraderBuyData&amp;lt;/code&amp;gt;. &#039;&#039;&#039;&#039;&#039;This may be a bug.&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
***** If outside the write range for the instruction, finish instruction early.&lt;br /&gt;
** For Gas trades:&lt;br /&gt;
*** Look for &amp;lt;code&amp;gt;FilterGasContains&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;FilterGasNotContains&amp;lt;/code&amp;gt; instructions from &amp;lt;code&amp;gt;LastWrite+1&amp;lt;/code&amp;gt; up to the end of the stack or the first write instruction it finds (keep in mind write instructions can be overwritten during execution).&lt;br /&gt;
**** If no filter rules evaluate to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, write &amp;lt;code&amp;gt;TraderSellGasData&amp;lt;/code&amp;gt; for the corresponding gas.&lt;br /&gt;
**** Note &amp;lt;code&amp;gt;FilterQuantityCompare&amp;lt;/code&amp;gt; does not filter out gas trades. &#039;&#039;&#039;&#039;&#039;This may be a bug.&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
** Check if past the write range for the instruction, finishing it early if so.&lt;br /&gt;
&lt;br /&gt;
=== Medium Satellite Dish Stack data ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+TRADER_ID_HASH&lt;br /&gt;
!Trader ID&lt;br /&gt;
!Hash value&lt;br /&gt;
!Trader Slot Type&lt;br /&gt;
|-&lt;br /&gt;
|OreTrader&lt;br /&gt;
| -1374574351&lt;br /&gt;
|Basic, Medium, Large&lt;br /&gt;
|-&lt;br /&gt;
|AlloyTrader&lt;br /&gt;
|54412100&lt;br /&gt;
|Basic, Medium, Large&lt;br /&gt;
|-&lt;br /&gt;
|HydroponicsTrader&lt;br /&gt;
| -1077922067&lt;br /&gt;
|Basic, Medium&lt;br /&gt;
|-&lt;br /&gt;
|GasTrader&lt;br /&gt;
| -470575659&lt;br /&gt;
|Basic, Medium, Large&lt;br /&gt;
|-&lt;br /&gt;
|Construction Trader&amp;lt;sub&amp;gt;(space is included)&amp;lt;/sub&amp;gt;&lt;br /&gt;
|175935584&lt;br /&gt;
|Basic, Medium, Large&lt;br /&gt;
|-&lt;br /&gt;
|LiquidTrader&lt;br /&gt;
|135244511&lt;br /&gt;
|Medium, Large&lt;br /&gt;
|-&lt;br /&gt;
|FoodTrader&lt;br /&gt;
| -82964957&lt;br /&gt;
|Utility&lt;br /&gt;
|-&lt;br /&gt;
|HardwareTrader&lt;br /&gt;
|1325142661&lt;br /&gt;
|Utility&lt;br /&gt;
|-&lt;br /&gt;
|ConsumablesTrader&lt;br /&gt;
| -1650376125&lt;br /&gt;
|Utility&lt;br /&gt;
|-&lt;br /&gt;
|MedicalTrader&lt;br /&gt;
| -1012213572&lt;br /&gt;
|Utility&lt;br /&gt;
|-&lt;br /&gt;
|ApplianceTrader&lt;br /&gt;
| -1590718013&lt;br /&gt;
|Utility&lt;br /&gt;
|-&lt;br /&gt;
|GeneticsTrader&lt;br /&gt;
| -188927486&lt;br /&gt;
|Exotics&lt;br /&gt;
|-&lt;br /&gt;
|RareItemsTrader&lt;br /&gt;
|649254485&lt;br /&gt;
|Exotics&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+SHUTTLE_TYPE&lt;br /&gt;
!Shuttle Type&lt;br /&gt;
!ID&lt;br /&gt;
!Size&lt;br /&gt;
!Runway Length&lt;br /&gt;
|-&lt;br /&gt;
|None&lt;br /&gt;
|0&lt;br /&gt;
|3x3&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Small&lt;br /&gt;
|1&lt;br /&gt;
|3x3&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SmallGas&lt;br /&gt;
|2&lt;br /&gt;
|3x3&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Medium&lt;br /&gt;
|3&lt;br /&gt;
|5x5&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|MediumGas&lt;br /&gt;
|4&lt;br /&gt;
|5x5&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Large&lt;br /&gt;
|5&lt;br /&gt;
|6x6&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|LargeGas&lt;br /&gt;
|6&lt;br /&gt;
|6x6&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|MediumPlane&lt;br /&gt;
|7&lt;br /&gt;
|7x7&lt;br /&gt;
|15&lt;br /&gt;
|-&lt;br /&gt;
|LargePlane&lt;br /&gt;
|8&lt;br /&gt;
|9x9&lt;br /&gt;
|20&lt;br /&gt;
|}&lt;br /&gt;
Gas traders always use SmallGas/MediumGas/LargeGas.&lt;br /&gt;
&lt;br /&gt;
== Landing Pad Connectors ==&lt;br /&gt;
Liquid I/O connectors move liquid by volume at Setting L / tick, behaving like volume pumps.&lt;br /&gt;
&lt;br /&gt;
Gas I/O connectors move gas by volume (Setting L / tick), but have a minimum movement rate equal to Setting mol/tick making them faster than volume pumps at low pressures (starting from ~2400 kPa at room temperature).&lt;br /&gt;
&lt;br /&gt;
Gas I/O Connector Setting defaults to 50 and can be adjusted from 0-50.&lt;br /&gt;
&lt;br /&gt;
Liquid I/O Connector Setting defaults to 9 L/tick and can be adjusted from 0-10L / tick.&lt;br /&gt;
&lt;br /&gt;
Landing Pad I/O connector pressure/temperature/ratio data performs reads on the landing pad network, not the I/O network, requiring either a separate sensor or limited network pressure/temperature for fine input rate adjustments.&lt;br /&gt;
&lt;br /&gt;
Gas/Liquid Tank connector setting is hardcoded at 20 (L|Mol) / tick and 5 L / tick, respectively.&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=Pill_(Stun)&amp;diff=28118</id>
		<title>Pill (Stun)</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=Pill_(Stun)&amp;diff=28118"/>
		<updated>2026-09-09T13:31:10Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: s/paralysis/stun, move quote to stationpedia template&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Stationpedia|Through rarely publicized, the existence of this pill is an open secret. For use when all else has failed, the Sayonara Suppository immobilizes and rapidly ends the average [[Stationeer]]. The delivery mode ensures that if a Stationeer chooses to take this pill, they really have to want it.}}{{Itembox&lt;br /&gt;
| name = Pill (Stun)&lt;br /&gt;
| image = [[File:ItemPillStun.png]] &lt;br /&gt;
| prefabhash = 418958601&lt;br /&gt;
| prefabname = ItemPillStun&lt;br /&gt;
| stacks = 10&lt;br /&gt;
| slot_class = SlotClass.None&lt;br /&gt;
| sorting_class = SortingClass.Food&lt;br /&gt;
| recipe_machine1 = Chemistry Station&lt;br /&gt;
| recipe_cost1 = 4 x [[Charcoal]], 10 x [[Fern]]&lt;br /&gt;
}}&lt;br /&gt;
== Description ==&lt;br /&gt;
The Stun Pill can be used to knock yourself unconscious by providing 200% stun instantly, followed by a total of 1000% stun over the next 120 seconds.&lt;br /&gt;
&lt;br /&gt;
It can also be force-fed to other players, allowing equipment to be placed into offline players recently revived out of a [[Cryo Tube]], and allowing offline players to be moved to a [[Bed]] or [[Sleeper]]. In Normal/Stationeer difficulty, players with a closed helmet can&#039;t be force-fed, making the use of a much more expensive Stun [[Auto-injector]] necessary instead.&lt;br /&gt;
&lt;br /&gt;
== Obtaining ==&lt;br /&gt;
The stun pill is made in the [[Chemistry Station]] with the ingredients listed below.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Ingredient !! Quantity&lt;br /&gt;
|-&lt;br /&gt;
| [[Charcoal]] || 4&lt;br /&gt;
|-&lt;br /&gt;
| [[Fern]] || 10&lt;br /&gt;
|}&lt;br /&gt;
Alternatively, it can be bought from Medical [[Trader|Traders]] for 150 credits.&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=User:RA2lover/Sandbox/Satellite_Dish_Automation&amp;diff=28117</id>
		<title>User:RA2lover/Sandbox/Satellite Dish Automation</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=User:RA2lover/Sandbox/Satellite_Dish_Automation&amp;diff=28117"/>
		<updated>2026-09-09T11:05:25Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: Medium Satellite Dish stack documentation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*  No information on signal strength is provided until a signal is resolved.&lt;br /&gt;
*  No info on resolution progress is provided in a way accessible to logic automation. This is likely because resolution progress rate could be used to estimate contact angle indirectly resulting in resolution exploits.&lt;br /&gt;
*  Once resolution is complete, the signal strength value is updated from -1 to the angle between the dish and its contact in degrees. Unlike pre-terrain-update guides, lower signal strength values after resolution result in faster resolution times.&lt;br /&gt;
*  Contact celestial positions can be triangulated by taking scans from different orientations:&lt;br /&gt;
** 1 resolution constrains the target&#039;s position at a given timeframe to a [https://en.wikipedia.org/wiki/Spherical_circle spherical circle] in the sky.&lt;br /&gt;
** 2 resolutions from different orientations constrain the target&#039;s position to 2 points in the sky (assuming the circles from both resolutions intersect).&lt;br /&gt;
** 3 resolutions from different orientations constrain the target&#039;s position to a point in the sky (assuming resolution orientations are not coplanar).&lt;br /&gt;
&lt;br /&gt;
Math can be used to track down those points. Our goal is to calculate the celestial angles at which the circumferences intersect, and point the dish at them. Even though the contact moves, as the error gets smaller resolutions can be made faster.&lt;br /&gt;
&lt;br /&gt;
== 1 resolution tracking ==&lt;br /&gt;
&lt;br /&gt;
With 1 resolution, the contact is constrained to a plane normal to our celestial reference point. This can be thought as a unit-hypotenuse right-angled triangle where the hypotenuse goes between our celestial reference point and the contact, the side adjacent to the celestial reference point is offset at an angle equal to our signal strength angle, has a length of cos(said angle), and the opposite side has a length of sin(said angle).&lt;br /&gt;
&lt;br /&gt;
Once the resolution is complete, we know how far the dish is from the contact, but we do not know which direction to point the dish towards. The next step in triangulation is to point the dish into a random direction and pray we&#039;ve pointed it closer, which may not always be the case.&lt;br /&gt;
&lt;br /&gt;
== 2 resolution tracking ==&lt;br /&gt;
&lt;br /&gt;
With 2 resolutions from different directions, the contact is constrained to 2 planes, whose intersection results in a line. The intersection of this line with the celestial circle results in 2 possible points that the target may be in. Which of these still has to be picked at random, however - with the special exception of one of the points being below the horizon and discardable by virtue of being unpointable.&lt;br /&gt;
&lt;br /&gt;
== 3 resolution tracking ==&lt;br /&gt;
&lt;br /&gt;
With 3 resolutions from different directions, the contact would be constrained to 3 lines resulting from 3 different 2-resolution tracking systems. This can be converted into a point by solving a least-squares problem, but an approximation reusing existing code for the 2 resolution tracking problem can be made by picking one of the two potential points from the 2 latest resolutions and using the first resolution to ignore the least-likely point.&lt;br /&gt;
&lt;br /&gt;
== Medium Satellite Dish Stack Operations ==&lt;br /&gt;
On every logic tick:&lt;br /&gt;
&lt;br /&gt;
* Sweep the entire stack memory, erasing stack addresses which contain a &amp;lt;code&amp;gt;TraderBuyThingData&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;TraderSellThingData&amp;lt;/code&amp;gt; opcode.&lt;br /&gt;
* Initialize &amp;lt;code&amp;gt;LastWriteAddress&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Sweep the entire stack memory, looking for the following instructions and executing them: &amp;lt;code&amp;gt;WriteTraderData&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WriteTraderBuyData&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WriteTraderSellData&amp;lt;/code&amp;gt;.&lt;br /&gt;
* After execution of each instruction, set LastWriteAddress to the instruction&#039;s address. &lt;br /&gt;
&lt;br /&gt;
=== Medium Satellite Dish Stack Instructions ===&lt;br /&gt;
&lt;br /&gt;
==== WriteTraderData (1) ====&lt;br /&gt;
&lt;br /&gt;
* Read &amp;lt;code&amp;gt;WRITE_INDEX&amp;lt;/code&amp;gt; byte.&lt;br /&gt;
* Get strongest contact.&lt;br /&gt;
* Write &amp;lt;code&amp;gt;StrongestContactIdHash&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;WRITE_INDEX&amp;lt;/code&amp;gt;&lt;br /&gt;
* Write &amp;lt;code&amp;gt;StrongestContactMetadata&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;WRITE_INDEX+1&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Write &amp;lt;code&amp;gt;StrongestContactSignalData&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;WRITE_INDEX+2&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== WriteTraderBuyData (5) ===&lt;br /&gt;
&lt;br /&gt;
* Try getting the strongest contact. If it can&#039;t be found, finish instruction without writing anything.&lt;br /&gt;
* Read &amp;lt;code&amp;gt;WRITE_INDEX&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;WRITE_COUNT&amp;lt;/code&amp;gt; bytes.&lt;br /&gt;
* check if &amp;lt;code&amp;gt;WRITE_INDEX&amp;lt;/code&amp;gt; is past the stack memory and finish instruction early if so.&lt;br /&gt;
* For each Trader Buy Data instance:&lt;br /&gt;
** Get the item corresponding to that Trader Buy Data.&lt;br /&gt;
** If trader wants at least 1, &lt;br /&gt;
** For Thing trades:&lt;br /&gt;
*** Check if the item being traded meets filters:&lt;br /&gt;
**** look for &amp;lt;code&amp;gt;FilterPrefabHashEquals&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FilterPrefabHashNotEquals&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FilterSortingClassCompare&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;FilterQuantityCompare&amp;lt;/code&amp;gt; modifiers from &amp;lt;code&amp;gt;LastWrite+1&amp;lt;/code&amp;gt; up to the end of the stack or the first write instruction it finds (which may not be the same as the executing instruction if the instruction is being executed from address 0 or if the instruction has been overwritten during execution). If any filter criteria evaluate to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, skip to the next item.&lt;br /&gt;
**** Write &amp;lt;code&amp;gt;TradeBuyThingData&amp;lt;/code&amp;gt; For the Thing being traded.&lt;br /&gt;
**** For each child item:&lt;br /&gt;
***** Check for &amp;lt;code&amp;gt;PrefabHashEquals&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PrefabHashNotEquals&amp;lt;/code&amp;gt; using the same filtering rules as above. If none are invalid, write &amp;lt;code&amp;gt;TraderBuyThingChildData&amp;lt;/code&amp;gt; for the child item.&lt;br /&gt;
****** Note that executable instructions may have been overwritten by previous writes.&lt;br /&gt;
***** If outside the write range for the instruction, finish instruction early.&lt;br /&gt;
** For Gas trades:&lt;br /&gt;
*** Look for &amp;lt;code&amp;gt;FilterGasContains&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;FilterGasNotContains&amp;lt;/code&amp;gt; instructions from &amp;lt;code&amp;gt;LastWrite+1&amp;lt;/code&amp;gt; up to the end of the stack or the first write instruction it finds (keep in mind write instructions can be overwritten during execution).&lt;br /&gt;
**** If no filter rules evaluate to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, write &amp;lt;code&amp;gt;TraderBuyGasData&amp;lt;/code&amp;gt; for the corresponding gas.&lt;br /&gt;
**** Note &amp;lt;code&amp;gt;FilterQuantityCompare&amp;lt;/code&amp;gt; does not filter out gas trades. &#039;&#039;&#039;&#039;&#039;This may be a bug.&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
** Check if past the write range for the instruction, finishing it early if so.&lt;br /&gt;
&lt;br /&gt;
=== WriteTraderSellData (6) ===&lt;br /&gt;
&lt;br /&gt;
* Try getting the strongest contact. If it can&#039;t be found, finish instruction without writing anything.&lt;br /&gt;
* Read &amp;lt;code&amp;gt;WRITE_INDEX&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;WRITE_COUNT&amp;lt;/code&amp;gt; bytes.&lt;br /&gt;
* check if &amp;lt;code&amp;gt;WRITE_INDEX&amp;lt;/code&amp;gt; is past the stack memory and finish instruction early if so.&lt;br /&gt;
* For each Trader Sell Data instance:&lt;br /&gt;
** Get the item corresponding to that Trader Sell Data.&lt;br /&gt;
** If trader offers at least 1, &lt;br /&gt;
** For Thing trades:&lt;br /&gt;
*** Check if the item being traded meets filters:&lt;br /&gt;
**** look for &amp;lt;code&amp;gt;FilterPrefabHashEquals&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FilterPrefabHashNotEquals&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FilterSortingClassCompare&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;FilterQuantityCompare&amp;lt;/code&amp;gt; modifiers from &amp;lt;code&amp;gt;LastWrite+1&amp;lt;/code&amp;gt; up to the end of the stack or the first write instruction it finds (which may not be the same as the executing instruction if the instruction is being executed from address 0 or if the instruction has been overwritten during execution). If any filter criteria evaluate to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, skip to the next item.&lt;br /&gt;
**** Write &amp;lt;code&amp;gt;TradeSellThingData&amp;lt;/code&amp;gt; For the Thing being traded.&lt;br /&gt;
**** For each child item:&lt;br /&gt;
***** Check for &amp;lt;code&amp;gt;PrefabHashEquals&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PrefabHashNotEquals&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FilterSortingClassCompare&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;FIlterQuantityCompare&amp;lt;/code&amp;gt; using the same filtering rules as above. If none are invalid, write &amp;lt;code&amp;gt;TraderSellThingChildData&amp;lt;/code&amp;gt; for the child item.&lt;br /&gt;
****** Note that executable instructions may have been overwritten by previous writes.&lt;br /&gt;
****** Note the criteria for children are interpreted differently than &amp;lt;code&amp;gt;WriteTraderBuyData&amp;lt;/code&amp;gt;. &#039;&#039;&#039;&#039;&#039;This may be a bug.&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
***** If outside the write range for the instruction, finish instruction early.&lt;br /&gt;
** For Gas trades:&lt;br /&gt;
*** Look for &amp;lt;code&amp;gt;FilterGasContains&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;FilterGasNotContains&amp;lt;/code&amp;gt; instructions from &amp;lt;code&amp;gt;LastWrite+1&amp;lt;/code&amp;gt; up to the end of the stack or the first write instruction it finds (keep in mind write instructions can be overwritten during execution).&lt;br /&gt;
**** If no filter rules evaluate to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, write &amp;lt;code&amp;gt;TraderSellGasData&amp;lt;/code&amp;gt; for the corresponding gas.&lt;br /&gt;
**** Note &amp;lt;code&amp;gt;FilterQuantityCompare&amp;lt;/code&amp;gt; does not filter out gas trades. &#039;&#039;&#039;&#039;&#039;This may be a bug.&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
** Check if past the write range for the instruction, finishing it early if so.&lt;br /&gt;
&lt;br /&gt;
=== Medium Satellite Dish Stack data ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+TRADER_ID_HASH&lt;br /&gt;
!Trader ID&lt;br /&gt;
!Hash value&lt;br /&gt;
!Trader Slot Type&lt;br /&gt;
|-&lt;br /&gt;
|OreTrader&lt;br /&gt;
| -1374574351&lt;br /&gt;
|Basic, Medium, Large&lt;br /&gt;
|-&lt;br /&gt;
|AlloyTrader&lt;br /&gt;
|54412100&lt;br /&gt;
|Basic, Medium, Large&lt;br /&gt;
|-&lt;br /&gt;
|HydroponicsTrader&lt;br /&gt;
| -1077922067&lt;br /&gt;
|Basic, Medium&lt;br /&gt;
|-&lt;br /&gt;
|GasTrader&lt;br /&gt;
| -470575659&lt;br /&gt;
|Basic, Medium, Large&lt;br /&gt;
|-&lt;br /&gt;
|Construction Trader&amp;lt;sub&amp;gt;(space is included)&amp;lt;/sub&amp;gt;&lt;br /&gt;
|175935584&lt;br /&gt;
|Basic, Medium, Large&lt;br /&gt;
|-&lt;br /&gt;
|LiquidTrader&lt;br /&gt;
|135244511&lt;br /&gt;
|Medium, Large&lt;br /&gt;
|-&lt;br /&gt;
|FoodTrader&lt;br /&gt;
| -82964957&lt;br /&gt;
|Utility&lt;br /&gt;
|-&lt;br /&gt;
|HardwareTrader&lt;br /&gt;
|1325142661&lt;br /&gt;
|Utility&lt;br /&gt;
|-&lt;br /&gt;
|ConsumablesTrader&lt;br /&gt;
| -1650376125&lt;br /&gt;
|Utility&lt;br /&gt;
|-&lt;br /&gt;
|MedicalTrader&lt;br /&gt;
| -1012213572&lt;br /&gt;
|Utility&lt;br /&gt;
|-&lt;br /&gt;
|ApplianceTrader&lt;br /&gt;
| -1590718013&lt;br /&gt;
|Utility&lt;br /&gt;
|-&lt;br /&gt;
|GeneticsTrader&lt;br /&gt;
| -188927486&lt;br /&gt;
|Exotics&lt;br /&gt;
|-&lt;br /&gt;
|RareItemsTrader&lt;br /&gt;
|649254485&lt;br /&gt;
|Exotics&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+SHUTTLE_TYPE&lt;br /&gt;
!Shuttle Type&lt;br /&gt;
!ID&lt;br /&gt;
!Size&lt;br /&gt;
!Runway Length&lt;br /&gt;
|-&lt;br /&gt;
|None&lt;br /&gt;
|0&lt;br /&gt;
|3x3&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Small&lt;br /&gt;
|1&lt;br /&gt;
|3x3&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SmallGas&lt;br /&gt;
|2&lt;br /&gt;
|3x3&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Medium&lt;br /&gt;
|3&lt;br /&gt;
|5x5&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|MediumGas&lt;br /&gt;
|4&lt;br /&gt;
|5x5&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Large&lt;br /&gt;
|5&lt;br /&gt;
|6x6&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|LargeGas&lt;br /&gt;
|6&lt;br /&gt;
|6x6&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|MediumPlane&lt;br /&gt;
|7&lt;br /&gt;
|7x7&lt;br /&gt;
|15&lt;br /&gt;
|-&lt;br /&gt;
|LargePlane&lt;br /&gt;
|8&lt;br /&gt;
|9x9&lt;br /&gt;
|20&lt;br /&gt;
|}&lt;br /&gt;
Gas traders always use SmallGas/MediumGas/LargeGas.&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=Pill_(Stun)&amp;diff=28116</id>
		<title>Pill (Stun)</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=Pill_(Stun)&amp;diff=28116"/>
		<updated>2026-09-08T23:51:21Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Itembox&lt;br /&gt;
| name = Pill (Stun)&lt;br /&gt;
| image = [[File:ItemPillStun.png]] &lt;br /&gt;
| prefabhash = 418958601&lt;br /&gt;
| prefabname = ItemPillStun&lt;br /&gt;
| stacks = 10&lt;br /&gt;
| slot_class = SlotClass.None&lt;br /&gt;
| sorting_class = SortingClass.Food&lt;br /&gt;
| recipe_machine1 = Chemistry Station&lt;br /&gt;
| recipe_cost1 = 4 x [[Charcoal]], 10 x [[Fern]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;q&amp;gt;Through rarely publicized, the existence of this pill is an open secret.  For use when all else has failed, the Sayonara Suppository immobilizes and rapidly ends the average Stationeer. The delivery mode ensures that if a Stationeer chooses to take this pill, they really have to want it.&amp;lt;/q&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;- Stationpedia&#039;&#039;&#039;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
== Description ==&lt;br /&gt;
The paralysis pill can be used to knock yourself unconscious by providing 200% stun instantly, followed by a total of 1000% stun over the next 120 seconds.&lt;br /&gt;
&lt;br /&gt;
It can also be force-fed to other players, allowing equipment to be placed into offline players recently revived out of a [[Cryo Tube]], and allowing offline players to be moved to a [[Bed]] or [[Sleeper]]. In Normal/Stationeer difficulty, players with a closed helmet can&#039;t be force-fed, making the use of a much more expensive Stun [[Auto-injector]] necessary instead.&lt;br /&gt;
&lt;br /&gt;
== Obtaining ==&lt;br /&gt;
The paralysis pill is made in the [[Chemistry Station]] with the ingredients listed below.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Ingredient !! Quantity&lt;br /&gt;
|-&lt;br /&gt;
| [[Charcoal]] || 4&lt;br /&gt;
|-&lt;br /&gt;
| [[Fern]] || 10&lt;br /&gt;
|}&lt;br /&gt;
Alternatively, it can be bought from Medical [[Trader|Traders]] for 150 credits.&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=Pill_(Stun)&amp;diff=28115</id>
		<title>Pill (Stun)</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=Pill_(Stun)&amp;diff=28115"/>
		<updated>2026-09-08T23:49:15Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: /* Description */ mention trading acquisition route, force-feeding to other players&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Itembox&lt;br /&gt;
| name = Pill (Paralysis)&lt;br /&gt;
| image = [[File:ItemPillStun.png]] &lt;br /&gt;
| prefabhash = 418958601&lt;br /&gt;
| prefabname = ItemPillStun&lt;br /&gt;
| stacks = 10&lt;br /&gt;
| slot_class = SlotClass.None&lt;br /&gt;
| sorting_class = SortingClass.Food&lt;br /&gt;
| recipe_machine1 = Chemistry Station&lt;br /&gt;
| recipe_cost1 = 4 x [[Charcoal]], 10 x [[Fern]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;q&amp;gt;Through rarely publicized, the existence of this pill is an open secret.  For use when all else has failed, the Sayonara Suppository immobilizes and rapidly ends the average Stationeer. The delivery mode ensures that if a Stationeer chooses to take this pill, they really have to want it.&amp;lt;/q&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;- Stationpedia&#039;&#039;&#039;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
== Description ==&lt;br /&gt;
The paralysis pill can be used to knock yourself unconscious by providing 200% stun instantly, followed by a total of 1000% stun over the next 120 seconds.&lt;br /&gt;
&lt;br /&gt;
It can also be force-fed to other players, allowing equipment to be placed into offline players recently revived out of a [[Cryo Tube]], and allowing offline players to be moved to a [[Bed]] or [[Sleeper]]. In Normal/Stationeer difficulty, players with a closed helmet can&#039;t be force-fed, making the use of a much more expensive Stun [[Auto-injector]] necessary instead.&lt;br /&gt;
&lt;br /&gt;
== Obtaining ==&lt;br /&gt;
The paralysis pill is made in the [[Chemistry Station]] with the ingredients listed below.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Ingredient !! Quantity&lt;br /&gt;
|-&lt;br /&gt;
| [[Charcoal]] || 4&lt;br /&gt;
|-&lt;br /&gt;
| [[Fern]] || 10&lt;br /&gt;
|}&lt;br /&gt;
Alternatively, it can be bought from Medical [[Trader|Traders]] for 150 credits.&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=Pill_(Paralysis)&amp;diff=28114</id>
		<title>Pill (Paralysis)</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=Pill_(Paralysis)&amp;diff=28114"/>
		<updated>2026-09-08T23:30:21Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: RA2lover moved page Pill (Paralysis) to Pill (Stun): Title name ingame mismatch&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Pill (Stun)]]&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=Pill_(Stun)&amp;diff=28113</id>
		<title>Pill (Stun)</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=Pill_(Stun)&amp;diff=28113"/>
		<updated>2026-09-08T23:30:21Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: RA2lover moved page Pill (Paralysis) to Pill (Stun): Title name ingame mismatch&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Itembox&lt;br /&gt;
| name = Pill (Paralysis)&lt;br /&gt;
| image = [[File:ItemPillStun.png]] &lt;br /&gt;
| prefabhash = 418958601&lt;br /&gt;
| prefabname = ItemPillStun&lt;br /&gt;
| stacks = 10&lt;br /&gt;
| slot_class = SlotClass.None&lt;br /&gt;
| sorting_class = SortingClass.Food&lt;br /&gt;
| recipe_machine1 = Chemistry Station&lt;br /&gt;
| recipe_cost1 = 4 x [[Charcoal]], 10 x [[Fern]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;q&amp;gt;Through rarely publicized, the existence of this pill is an open secret.  For use when all else has failed, the Sayonara Suppository immobilizes and rapidly ends the average Stationeer. The delivery mode ensures that if a Stationeer chooses to take this pill, they really have to want it.&amp;lt;/q&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;- Stationpedia&#039;&#039;&#039;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
== Description ==&lt;br /&gt;
The paralysis pill can be used to knock yourself unconscious by providing 200% stun, which takes about 26 seconds to recover from.&lt;br /&gt;
&lt;br /&gt;
== Obtaining ==&lt;br /&gt;
The paralysis pill is made in the [[Chemistry Station]] with the ingredients listed below.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Ingredient !! Quantity&lt;br /&gt;
|-&lt;br /&gt;
| [[Charcoal]] || 4&lt;br /&gt;
|-&lt;br /&gt;
| [[Fern]] || 10&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=User_talk:DootDoot&amp;diff=28112</id>
		<title>User talk:DootDoot</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=User_talk:DootDoot&amp;diff=28112"/>
		<updated>2026-09-08T18:10:16Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Welcome to Stationeers Community Wiki, Stationeer!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You&#039;re now part of the crew. A few tips to get started:&lt;br /&gt;
* Browse [[Special:RecentChanges|recent changes]] to see what the community is working on&lt;br /&gt;
* Read the [[https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents|help pages]] if you&#039;re new to wiki editing&lt;br /&gt;
* Don&#039;t hesitate to jump in, every edit helps [[User:RA2lover|RA2lover]] ([[User talk:RA2lover|talk]]) 08:01, 2 September 2026 (UTC)&lt;br /&gt;
&lt;br /&gt;
== LArRE fertilizer reading ==&lt;br /&gt;
&lt;br /&gt;
Can the cargo larre take fertilizer already applied into a tray (loading it into slot 0) then perform logic reads on slot 0 instead? Seems like a way to bypass the logic error from trying to read the proxy slot directly.--[[User:RA2lover|RA2lover]] ([[User talk:RA2lover|talk]]) 18:10, 8 September 2026 (UTC)&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=User_talk:DootDoot&amp;diff=28111</id>
		<title>User talk:DootDoot</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=User_talk:DootDoot&amp;diff=28111"/>
		<updated>2026-09-08T18:09:45Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: /* LArRE fertilizer reading */ new section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Welcome to Stationeers Community Wiki, Stationeer!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You&#039;re now part of the crew. A few tips to get started:&lt;br /&gt;
* Browse [[Special:RecentChanges|recent changes]] to see what the community is working on&lt;br /&gt;
* Read the [[https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents|help pages]] if you&#039;re new to wiki editing&lt;br /&gt;
* Don&#039;t hesitate to jump in, every edit helps [[User:RA2lover|RA2lover]] ([[User talk:RA2lover|talk]]) 08:01, 2 September 2026 (UTC)&lt;br /&gt;
&lt;br /&gt;
== LArRE fertilizer reading ==&lt;br /&gt;
&lt;br /&gt;
Can the cargo larre take fertilizer already applied into a tray (loading it into slot 0) then perform logic reads on slot 0 instead? Seems like a way to bypass the logic error from trying to read the proxy slot directly.&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=Combustion_Centrifuge&amp;diff=28110</id>
		<title>Combustion Centrifuge</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=Combustion_Centrifuge&amp;diff=28110"/>
		<updated>2026-09-08T17:44:55Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: /* Engine Speed / Stress */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{Itembox&lt;br /&gt;
| name = Kit (Combustion Centrifuge)&lt;br /&gt;
| image = [[File:KitStructureCombustionCentrifuge.png]]&lt;br /&gt;
| prefabhash = 231903234&lt;br /&gt;
| prefabname = KitStructureCombustionCentrifuge&lt;br /&gt;
| stacks = 1&lt;br /&gt;
| slot_class = SlotClass.None&lt;br /&gt;
| sorting_class = SortingClass.Kits&lt;br /&gt;
| recipe_machine1 = Autolathe (Tier Two)&lt;br /&gt;
| recipe_cost1 = 20g [[Steel]], 10g [[Invar]], 5g [[Constantan]]&lt;br /&gt;
| constructs = [[Combustion Centrifuge]]&lt;br /&gt;
}}&lt;br /&gt;
{{Structurebox&lt;br /&gt;
 | name             = Combustion Centrifuge&lt;br /&gt;
 | image            = [[File:StructureCombustionCentrifuge.png]]&lt;br /&gt;
 | power_usage      = 50W&lt;br /&gt;
 | placed_with_item = [[Kit (Combustion Centrifuge)]]&lt;br /&gt;
 | placed_on_grid   = Small Grid&lt;br /&gt;
 | stage_image1     = [[File:StructureCombustionCentrifuge_BuildState0.png]]&lt;br /&gt;
 | decon_with_tool1 = [[Hand Drill]]&lt;br /&gt;
 | item_rec1        = [[Kit (Combustion Centrifuge)]]&lt;br /&gt;
 | const_with_tool2 = [[Welder]]&lt;br /&gt;
 | const_with_item2 = 2x [[Steel Sheets]]&lt;br /&gt;
 | stage_image2     = [[File:StructureCombustionCentrifuge_BuildState1.png]]&lt;br /&gt;
 | decon_with_tool2 = [[Angle Grinder]]&lt;br /&gt;
 | item_rec2        = 2x [[Steel Sheets]]&lt;br /&gt;
 | const_with_item3 = 1x [[Cable Coil]]&lt;br /&gt;
 | decon_with_tool3 = [[Wire Cutters]]&lt;br /&gt;
 | item_rec3        = 1x [[Cable Coil]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Stationpedia|The Combustion Centrifuge is a gas powered version of the [[Centrifuge]]. If a [[Recycler]] or unbalanced [[Furnace]] outputs reagent mixture rather than the desired [[:Category:Ingot|ingots]], a centrifuge allows you to reclaim the raw [[Ores|ore]].&lt;br /&gt;
&lt;br /&gt;
It also refines [[Dirty Ore]] produced from the [[Deep Miner]] and [[Dirty Ore]] produced from the [[Rocket Miner]]. A combustible fuel mix should be supplied to the gas input, and waste gasses should be vented from the output.&lt;br /&gt;
&lt;br /&gt;
The machine&#039;s RPMs must be controlled via the throttle and combustion limiter levers. If the Combustion Centrifuge gains, or loses, RPMs too fast it will experience stress, and eventually grind to a halt.  Higher RPMs directly result in faster processing speeds.&lt;br /&gt;
&lt;br /&gt;
The throttle lever controls the amount of fuel being pulled into the machine, increasing the temperature inside the engine, and leading to an increase in RPM. The limiter lever influences the speed of the combustion, and how much uncombusted gas is in the exhaust.&lt;br /&gt;
&lt;br /&gt;
Ejecting ore from the Combustion Centrifuge while it is at high RPMs will result in additional stress build up.  If turned off while not stressed, the machine will automatically start to brake, and reduce RPMs in a controlled manner.}}&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
The Combustion Centrifuge is a version of the [[Centrifuge]] containing an internal combustion engine whose fuel consumption is adjustable by the throttle lever in 10% increments. Higher engine temperatures result in additional torque which allows it to reach higher speeds, but accelerating (or deccelerating) the engine too quickly results in stress buildup, which causes the engine to grind to a halt if the stress is allowed to reach 100%. It comes with a combustion limiter which allows the rate of combustion to be adjusted.&lt;br /&gt;
&lt;br /&gt;
Ejecting ore from the Combustion Centrifuge while it is spinning will result in 0.1% additional stress buildup/RPM , as well as a 10% reduction in current RPM.&lt;br /&gt;
&lt;br /&gt;
If turned off while not stressed, the machine will automatically start to brake, reduce its drum speed by 15 RPM/tick, and start flushing stored internal gases into its exhaust.&lt;br /&gt;
&lt;br /&gt;
The Combustion Centrifuge can hold 3000g processed ore in its internal storage, allowing it to run for multiple hours before being emptied if processing low-purity ore.&lt;br /&gt;
&lt;br /&gt;
The Combustion Centrifuge has a socket for an [[Integrated Circuit (IC10)|IC10 chip]], similar to the [[Atmospherics]] machine. It comes with two device ports, d0 and d1, for connecting to other devices. To change or set a device, use a [[screwdriver]] to cycle through devices found on the machine&#039;s data network. Code does not run while the centrifuge is turned off, somewhat limiting the centrifuge&#039;s usefulness as turning it off can be necessary to recover from an overstressed state. &lt;br /&gt;
== Throttle ==&lt;br /&gt;
Every [[tick]] up to 0.01 moles of gas will be pulled in to the machine from the input [[pipe]] network. The Throttle parameter linearly controls how much gas to pull in - &amp;lt;code&amp;gt;inputMoles = 0.01*Throttle/100&amp;lt;/code&amp;gt;. The Throttle value is rounded to the nearest 10% increment when set.&lt;br /&gt;
&lt;br /&gt;
== Combustion Limiter ==&lt;br /&gt;
&lt;br /&gt;
The combustion limiter speeds up combustion by forcing an additional percentage of fuel present in the engine to combust &#039;&#039;&#039;after&#039;&#039;&#039; normal combustion takes place. The percentage is quadratically dependent on the combustion limiter lever position:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Force-Combustion Percentages&lt;br /&gt;
!Combustion Limiter setting&lt;br /&gt;
!Combustion Percentage&lt;br /&gt;
|-&lt;br /&gt;
|0% &amp;lt;small&amp;gt;(minimum setting is 3.65%)&amp;lt;/small&amp;gt;&lt;br /&gt;
|0.1%&lt;br /&gt;
|-&lt;br /&gt;
|10%&lt;br /&gt;
|0.75%&lt;br /&gt;
|-&lt;br /&gt;
|20%&lt;br /&gt;
|3%&lt;br /&gt;
|-&lt;br /&gt;
|30%&lt;br /&gt;
|6.75%&lt;br /&gt;
|-&lt;br /&gt;
|40%&lt;br /&gt;
|12%&lt;br /&gt;
|-&lt;br /&gt;
|50%&lt;br /&gt;
|18.75%&lt;br /&gt;
|-&lt;br /&gt;
|60%&lt;br /&gt;
|27%&lt;br /&gt;
|-&lt;br /&gt;
|70%&lt;br /&gt;
|36.75%&lt;br /&gt;
|-&lt;br /&gt;
|80%&lt;br /&gt;
|48%&lt;br /&gt;
|-&lt;br /&gt;
|90%&lt;br /&gt;
|60.75%&lt;br /&gt;
|-&lt;br /&gt;
|100%&lt;br /&gt;
|75%&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Exhaust ==&lt;br /&gt;
The engine pushes gas from its engine into the output pipe network once its internal pressure exceeds 4 MPa. This results in some unburned fuel being present in the exhaust. If the centrifuge is powered off, the centrifuge slows down at 15rpm/tick(as long as no stress is being accrued from excess torque) and hot gas stored inside the engine is slowly flushed out to the exhaust down to 0 kPa. &lt;br /&gt;
&lt;br /&gt;
== Engine Speed / Stress ==&lt;br /&gt;
If the engine&#039;s temperature is above 300°C and was capable of combusting at least 30 J during the current tick, the engine produces torque, speeding up by 1 RPM/tick for every {{Overline|416.|6}} K of temperature (up to a maximum of 12 RPM/tick at 5000 K) in a frictionless environment, consuming 30 J*RPM gained from its internal atmosphere in the process. Friction slows the engine down by 1%/tick afterwards, making the engine reach a steady-state speed directly dependent on its temperature.&lt;br /&gt;
&lt;br /&gt;
If the engine speeds up or slows down at a rate slower than &amp;lt;code&amp;gt;min(1000/(RPM+500), 1.25)&amp;lt;/code&amp;gt; &amp;lt;!-- technically, clamp(1000/RPM+500, 0.5,1.25), but the minimum value is unreachable as it only takes place at 1500 RPM but the engine is unable to exceed 1188 RPM. https://www.desmos.com/calculator/vfkabhoxt5 --&amp;gt;RPM/tick, its stress is reduced by 0.5%/tick. Otherwise, its stress is increased by &amp;lt;code&amp;gt;(abs(RPM delta) - 1) * min(1000/(RPM+500), 1.25)&amp;lt;/code&amp;gt; %/tick (which can go negative reducing stress faster than the 0.5%/tick you&#039;d get otherwise). The optimal acceleration/decceleration rate is 1 RPM/tick beyond the 0.5% stress/tick reduction curve, at which point no stress is gained or lost.&lt;br /&gt;
&lt;br /&gt;
If stress is at 100% or more, the centrifuge slows down by a whopping 40 RPM/tick. This can put the centrifuge&#039;s engine into a death spiral as the lower RPM leads to a higher net torque which can increase the stress rate even further, with the only way to resume operation being reducing the engine&#039;s internal temperature to a point it can start accelerating again in a controlled fashion. Because the engine only cools down if it has at least 30 J/tick of combustion still occuring within it, this can be difficult to achieve without turning the centrifuge off and waiting for all hot gas to be flushed into the exhaust.&lt;br /&gt;
&lt;br /&gt;
== Processing Speed ==&lt;br /&gt;
The speed at which the centrifuge processes items is directly proportional to how fast it is rotating. At 300 RPM, it process pure ores are refined at a rate of 1 second/item and [[Dirty Ore]] / [[Reagent Mix]] at a rate of 6 seconds/item. Excess progress is carried over to the next item processed.&lt;br /&gt;
&lt;br /&gt;
Using regular [[Fuel]], the Combustion Centrifuge can reach a bit higher than 500 RPM, making it just over 5 times faster than the regular [[Centrifuge]] at its max speed. The regular electric centrifuge will take 18 seconds to process a single piece of [[Dirty Ore]], while a Combustion Centrifuge at 515 RPM will take just 3.5 seconds. At full throttle, the centrifuge will take approximately 6.5 hours to deplete a [[Gas Canister (Smart)|Smart Canister]] filled with fuel.&amp;lt;!-- 18 MPa @ 20°C * 64 L = 472 mol = 6.555 h --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The speed of the Combustion Centrifuge can be boosted significantly by replacing the fuel mixture with a [[Fuel|Superfuel]] mixture. Using superfuel can boost the centrifuge to a steady-state maximum of 1188 RPM, processing ore at more than double the speed. This comes at the cost of ease of use, as storing Superfuel mixtures and [[Nitrous Oxide]] itself is difficult, the centrifuge can no longer safely eject items at that speed, and starting up the centrifuge also becomes more complex due to faster and hotter combustion.&lt;br /&gt;
&lt;br /&gt;
{{Data Network Header}}&lt;br /&gt;
{{Data Parameters|&lt;br /&gt;
{{Data Parameters/row|Power|Boolean|w=0|Can be read to return if the Combustion Centrifuge is correctly powered or not, set via the power system, return 1 if powered and 0 if not|multiple=2|0|Unpowered|1|Powered}}&lt;br /&gt;
{{Data Parameters/row|Open|Integer|1 if device is open, otherwise 0|multiple=2|0|Closed|1|Open}}&lt;br /&gt;
{{Data Parameters/row|Error|Boolean|w=0|1 if device is in error state, otherwise 0|multiple=2|0|&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;|1|Error}}&lt;br /&gt;
{{Data Parameters/row|Pressure|Float|w=0|The current pressure reading of the Combustion Centrifuge}}&lt;br /&gt;
{{Data Parameters/row|Temperature|Integer|w=0|The current temperature reading of the Combustion Centrifuge}}&lt;br /&gt;
{{Data Parameters/row|Lock|Boolean|Disable manual operation of the Combustion Centrifuge.|multiple=2|0|Unlocked|1|Locked}}&lt;br /&gt;
{{Data Parameters/row|Reagents|Integer|w=0|Total number of reagents recorded by the Combustion Centrifuge.  Max reagent capacity is 3000, at which time centrifuge will spin down and flash an error. IC/Logic required for automation, otherwise manual operation.}}&lt;br /&gt;
{{Data Parameters/row|RatioOxygen|Float|w=0|The ratio of [[Oxygen]] in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioCarbonDioxide|Float|w=0|The ratio of Carbon Dioxide in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioNitrogen|Float|w=0|The ratio of [[Nitrogen]] in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioPollutant|Float|w=0|The ratio of [[Pollutant]] in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioVolatiles|Float|w=0|The ratio of [[Volatiles]] in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioWater|Float|w=0|The ratio of [[Water]] in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|On|Boolean|The current state of the Combustion Centrifuge.|multiple=2|0|Off|1|On}}&lt;br /&gt;
{{Data Parameters/row|RequiredPower|Integer|w=0|Idle operating power quantity, does not necessarily include extra demand power}}&lt;br /&gt;
{{Data Parameters/row|ClearMemory|Integer|r=0|When set to 1, clears the counter memory (e.g. ExportCount). Will set itself back to 0 when actioned}}&lt;br /&gt;
{{Data Parameters/row|ExportCount|Integer|w=0|How many items exported since last ClearMemory}}&lt;br /&gt;
{{Data Parameters/row|ImportCount|Integer|w=0|How many items imported since last ClearMemory}}&lt;br /&gt;
{{Data Parameters/row|TotalMoles|Float|w=0|Returns the total moles of the Combustion Centrifuge}}&lt;br /&gt;
{{Data Parameters/row|RatioNitrousOxide|Float|w=0|The ratio of Nitrous Oxide in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|PrefabHash|Integer|w=0|The hash of the structure}}&lt;br /&gt;
{{Data Parameters/row|Combustion|Boolean|w=0|Assess if the atmosphere is on fire. Returns 1 if atmosphere is on fire, 0 if not.|0 or 1}}&lt;br /&gt;
{{Data Parameters/row|PressureInput|Float|w=0|The current pressure reading of the Combustion Centrifuge&#039;s Input Network}}&lt;br /&gt;
{{Data Parameters/row|TemperatureInput|Float|w=0|The current temperature reading of the Combustion Centrifuge&#039;s Input Network}}&lt;br /&gt;
{{Data Parameters/row|RatioOxygenInput|Float|w=0|The ratio of [[Oxygen]] in device&#039;s input network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioCarbonDioxideInput|Float|w=0|The ratio of Carbon Dioxide in device&#039;s input network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioNitrogenInput|Float|w=0|The ratio of [[Nitrogen]] in device&#039;s input network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioPollutantInput|Float|w=0|The ratio of [[Pollutant]] in device&#039;s input network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioVolatilesInput|Float|w=0|The ratio of [[Volatiles]] in device&#039;s input network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioWaterInput|Float|w=0|The ratio of [[Water]] in device&#039;s input network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioNitrousOxideInput|Float|w=0|The ratio of Nitrous Oxide in device&#039;s input network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|TotalMolesInput|Float|w=0|Returns the total moles of the Combustion Centrifuge&#039;s Input Network}}&lt;br /&gt;
{{Data Parameters/row|PressureOutput|Float|w=0|The current pressure reading of the Combustion Centrifuge&#039;s Output Network}}&lt;br /&gt;
{{Data Parameters/row|TemperatureOutput|Float|w=0|The current temperature reading of the Combustion Centrifuge&#039;s Output Network}}&lt;br /&gt;
{{Data Parameters/row|RatioOxygenOutput|Float|w=0|The ratio of [[Oxygen]] in device&#039;s Output network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioCarbonDioxideOutput|Float|w=0|The ratio of Carbon Dioxide in device&#039;s Output network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioNitrogenOutput|Float|w=0|The ratio of [[Nitrogen]] in device&#039;s Output network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioPollutantOutput|Float|w=0|The ratio of [[Pollutant]] in device&#039;s Output network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioVolatilesOutput|Float|w=0|The ratio of [[Volatiles]] in device&#039;s Output network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioWaterOutput|Float|w=0|The ratio of [[Water]] in device&#039;s Output network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioNitrousOxideOutput|Float|w=0|The ratio of Nitrous Oxide in device&#039;s Output network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|TotalMolesOutput|Float|w=0|Returns the total moles of the Combustion Centrifuge&#039;s Output Network}}&lt;br /&gt;
{{Data Parameters/row|CombustionInput|Boolean|w=0|Assess if the atmosphere is on fire. Returns 1 if device&#039;s input network is on fire, 0 if not.|0 or 1}}&lt;br /&gt;
{{Data Parameters/row|CombustionOutput|Boolean|w=0|Assess if the atmosphere is on fire. Returns 1 if device&#039;s Output network is on fire, 0 if not.|0 or 1}}&lt;br /&gt;
{{Data Parameters/row|CombustionLimiter|Integer|Retards the rate of combustion inside the machine (range: 0-100), with 0 being the slowest rate of combustion and 100 being the fastest}}&lt;br /&gt;
{{Data Parameters/row|Throttle|Integer|Increases the rate at which the machine works (range: 0-100)}}&lt;br /&gt;
{{Data Parameters/row|Rpm|Integer|w=0|The number of revolutions per minute that the Combustion Centrifuge&#039;s spinning mechanism is doing}}&lt;br /&gt;
{{Data Parameters/row|Stress|Integer|w=0|Machines get stressed when working hard. When Stress reaches 100 the machine will automatically shut down}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidNitrogen|Float|w=0|The ratio of Liquid Nitrogen in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidNitrogenInput|Float|w=0|The ratio of Liquid Nitrogen in device&#039;s input network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidNitrogenOutput|Float|w=0|The ratio of Liquid Nitrogen in device&#039;s Output network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidOxygen|Float|w=0|The ratio of Liquid Oxygen in device&#039;s Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidOxygenInput|Float|w=0|The ratio of Liquid Oxygen in device&#039;s Input Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidOxygenOutput|Float|w=0|The ratio of Liquid Oxygen in Combustion Centrifuge&#039;s Output Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidVolatiles|Float|w=0|The ratio of Liquid Volatiles in device&#039;s Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidVolatilesInput|Float|w=0|The ratio of Liquid Volatiles in device&#039;s Input Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidVolatilesOutput|Float|w=0|The ratio of Liquid Volatiles in Combustion Centrifuge&#039;s Output Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioSteam|Float|w=0|The ratio of Steam in device&#039;s Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioSteamInput|Float|w=0|The ratio of Steam in device&#039;s Input Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioSteamOutput|Float|w=0|The ratio of Steam in Combustion Centrifuge&#039;s Output Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidCarbonDioxide|Float|w=0|The ratio of Liquid Carbon Dioxide in device&#039;s Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidCarbonDioxideInput|Float|w=0|The ratio of Liquid Carbon Dioxide in device&#039;s Input Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidCarbonDioxideOutput|Float|w=0|The ratio of Liquid Carbon Dioxide in Combustion Centrifuge&#039;s Output Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidPollutant|Float|w=0|The ratio of Liquid Pollutant in device&#039;s Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidPollutantInput|Float|w=0|The ratio of Liquid Pollutant in device&#039;s Input Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidPollutantOutput|Float|w=0|The ratio of Liquid Pollutant in Combustion Centrifuge&#039;s Output Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidNitrousOxide|Float|w=0|The ratio of Liquid Nitrous Oxide in device&#039;s Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidNitrousOxideInput|Float|w=0|The ratio of Liquid Nitrous Oxide in device&#039;s Input Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidNitrousOxideOutput|Float|w=0|The ratio of Liquid Nitrous Oxide in Combustion Centrifuge&#039;s Output Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|ReferenceId|Integer|w=0|Unique Reference Identifier for this object}}&lt;br /&gt;
{{Data Parameters/row|RatioHydrogen|Float|w=0|DEPRECATED|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidHydrogen|Float|w=0|DEPRECATED|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioPollutedWater|Float|w=0|The ratio of polluted water in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|NameHash|Integer|w=0|Provides the hash value for the name of the object as a 32 bit integer.}}&lt;br /&gt;
}}&lt;br /&gt;
{{Slots|logic=1&lt;br /&gt;
|{{Slots/row|name=Import|type=None}}&lt;br /&gt;
|{{Slots/row|name=Export|type=None}}&lt;br /&gt;
||{{Slots/row|name=Programmable Chip|type=ProgrammableChip}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Connections}}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Connection Name !! Index&lt;br /&gt;
|-&lt;br /&gt;
| [[Chute]] Input || 0&lt;br /&gt;
|-&lt;br /&gt;
| Chute Output || 1&lt;br /&gt;
|-&lt;br /&gt;
| Data || 2&lt;br /&gt;
|-&lt;br /&gt;
| [[Power]] || 3&lt;br /&gt;
|-&lt;br /&gt;
| Pipe Input || 4&lt;br /&gt;
|-&lt;br /&gt;
| Pipe Input || 5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
[https://steamcommunity.com/sharedfiles/filedetails/?id=3448074160 reference automation implementation by lisnaz]&lt;br /&gt;
[[Category:Machines]]&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=Combustion_Centrifuge&amp;diff=28109</id>
		<title>Combustion Centrifuge</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=Combustion_Centrifuge&amp;diff=28109"/>
		<updated>2026-09-08T17:43:49Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: /* Engine Speed / Stress */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{Itembox&lt;br /&gt;
| name = Kit (Combustion Centrifuge)&lt;br /&gt;
| image = [[File:KitStructureCombustionCentrifuge.png]]&lt;br /&gt;
| prefabhash = 231903234&lt;br /&gt;
| prefabname = KitStructureCombustionCentrifuge&lt;br /&gt;
| stacks = 1&lt;br /&gt;
| slot_class = SlotClass.None&lt;br /&gt;
| sorting_class = SortingClass.Kits&lt;br /&gt;
| recipe_machine1 = Autolathe (Tier Two)&lt;br /&gt;
| recipe_cost1 = 20g [[Steel]], 10g [[Invar]], 5g [[Constantan]]&lt;br /&gt;
| constructs = [[Combustion Centrifuge]]&lt;br /&gt;
}}&lt;br /&gt;
{{Structurebox&lt;br /&gt;
 | name             = Combustion Centrifuge&lt;br /&gt;
 | image            = [[File:StructureCombustionCentrifuge.png]]&lt;br /&gt;
 | power_usage      = 50W&lt;br /&gt;
 | placed_with_item = [[Kit (Combustion Centrifuge)]]&lt;br /&gt;
 | placed_on_grid   = Small Grid&lt;br /&gt;
 | stage_image1     = [[File:StructureCombustionCentrifuge_BuildState0.png]]&lt;br /&gt;
 | decon_with_tool1 = [[Hand Drill]]&lt;br /&gt;
 | item_rec1        = [[Kit (Combustion Centrifuge)]]&lt;br /&gt;
 | const_with_tool2 = [[Welder]]&lt;br /&gt;
 | const_with_item2 = 2x [[Steel Sheets]]&lt;br /&gt;
 | stage_image2     = [[File:StructureCombustionCentrifuge_BuildState1.png]]&lt;br /&gt;
 | decon_with_tool2 = [[Angle Grinder]]&lt;br /&gt;
 | item_rec2        = 2x [[Steel Sheets]]&lt;br /&gt;
 | const_with_item3 = 1x [[Cable Coil]]&lt;br /&gt;
 | decon_with_tool3 = [[Wire Cutters]]&lt;br /&gt;
 | item_rec3        = 1x [[Cable Coil]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Stationpedia|The Combustion Centrifuge is a gas powered version of the [[Centrifuge]]. If a [[Recycler]] or unbalanced [[Furnace]] outputs reagent mixture rather than the desired [[:Category:Ingot|ingots]], a centrifuge allows you to reclaim the raw [[Ores|ore]].&lt;br /&gt;
&lt;br /&gt;
It also refines [[Dirty Ore]] produced from the [[Deep Miner]] and [[Dirty Ore]] produced from the [[Rocket Miner]]. A combustible fuel mix should be supplied to the gas input, and waste gasses should be vented from the output.&lt;br /&gt;
&lt;br /&gt;
The machine&#039;s RPMs must be controlled via the throttle and combustion limiter levers. If the Combustion Centrifuge gains, or loses, RPMs too fast it will experience stress, and eventually grind to a halt.  Higher RPMs directly result in faster processing speeds.&lt;br /&gt;
&lt;br /&gt;
The throttle lever controls the amount of fuel being pulled into the machine, increasing the temperature inside the engine, and leading to an increase in RPM. The limiter lever influences the speed of the combustion, and how much uncombusted gas is in the exhaust.&lt;br /&gt;
&lt;br /&gt;
Ejecting ore from the Combustion Centrifuge while it is at high RPMs will result in additional stress build up.  If turned off while not stressed, the machine will automatically start to brake, and reduce RPMs in a controlled manner.}}&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
The Combustion Centrifuge is a version of the [[Centrifuge]] containing an internal combustion engine whose fuel consumption is adjustable by the throttle lever in 10% increments. Higher engine temperatures result in additional torque which allows it to reach higher speeds, but accelerating (or deccelerating) the engine too quickly results in stress buildup, which causes the engine to grind to a halt if the stress is allowed to reach 100%. It comes with a combustion limiter which allows the rate of combustion to be adjusted.&lt;br /&gt;
&lt;br /&gt;
Ejecting ore from the Combustion Centrifuge while it is spinning will result in 0.1% additional stress buildup/RPM , as well as a 10% reduction in current RPM.&lt;br /&gt;
&lt;br /&gt;
If turned off while not stressed, the machine will automatically start to brake, reduce its drum speed by 15 RPM/tick, and start flushing stored internal gases into its exhaust.&lt;br /&gt;
&lt;br /&gt;
The Combustion Centrifuge can hold 3000g processed ore in its internal storage, allowing it to run for multiple hours before being emptied if processing low-purity ore.&lt;br /&gt;
&lt;br /&gt;
The Combustion Centrifuge has a socket for an [[Integrated Circuit (IC10)|IC10 chip]], similar to the [[Atmospherics]] machine. It comes with two device ports, d0 and d1, for connecting to other devices. To change or set a device, use a [[screwdriver]] to cycle through devices found on the machine&#039;s data network. Code does not run while the centrifuge is turned off, somewhat limiting the centrifuge&#039;s usefulness as turning it off can be necessary to recover from an overstressed state. &lt;br /&gt;
== Throttle ==&lt;br /&gt;
Every [[tick]] up to 0.01 moles of gas will be pulled in to the machine from the input [[pipe]] network. The Throttle parameter linearly controls how much gas to pull in - &amp;lt;code&amp;gt;inputMoles = 0.01*Throttle/100&amp;lt;/code&amp;gt;. The Throttle value is rounded to the nearest 10% increment when set.&lt;br /&gt;
&lt;br /&gt;
== Combustion Limiter ==&lt;br /&gt;
&lt;br /&gt;
The combustion limiter speeds up combustion by forcing an additional percentage of fuel present in the engine to combust &#039;&#039;&#039;after&#039;&#039;&#039; normal combustion takes place. The percentage is quadratically dependent on the combustion limiter lever position:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Force-Combustion Percentages&lt;br /&gt;
!Combustion Limiter setting&lt;br /&gt;
!Combustion Percentage&lt;br /&gt;
|-&lt;br /&gt;
|0% &amp;lt;small&amp;gt;(minimum setting is 3.65%)&amp;lt;/small&amp;gt;&lt;br /&gt;
|0.1%&lt;br /&gt;
|-&lt;br /&gt;
|10%&lt;br /&gt;
|0.75%&lt;br /&gt;
|-&lt;br /&gt;
|20%&lt;br /&gt;
|3%&lt;br /&gt;
|-&lt;br /&gt;
|30%&lt;br /&gt;
|6.75%&lt;br /&gt;
|-&lt;br /&gt;
|40%&lt;br /&gt;
|12%&lt;br /&gt;
|-&lt;br /&gt;
|50%&lt;br /&gt;
|18.75%&lt;br /&gt;
|-&lt;br /&gt;
|60%&lt;br /&gt;
|27%&lt;br /&gt;
|-&lt;br /&gt;
|70%&lt;br /&gt;
|36.75%&lt;br /&gt;
|-&lt;br /&gt;
|80%&lt;br /&gt;
|48%&lt;br /&gt;
|-&lt;br /&gt;
|90%&lt;br /&gt;
|60.75%&lt;br /&gt;
|-&lt;br /&gt;
|100%&lt;br /&gt;
|75%&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Exhaust ==&lt;br /&gt;
The engine pushes gas from its engine into the output pipe network once its internal pressure exceeds 4 MPa. This results in some unburned fuel being present in the exhaust. If the centrifuge is powered off, the centrifuge slows down at 15rpm/tick(as long as no stress is being accrued from excess torque) and hot gas stored inside the engine is slowly flushed out to the exhaust down to 0 kPa. &lt;br /&gt;
&lt;br /&gt;
== Engine Speed / Stress ==&lt;br /&gt;
If the engine&#039;s temperature is above 300°C and was capable of combusting at least 30 J during the current tick, the engine produces torque, speeding up by 1 RPM/tick for every {{Overline|416.|6}} K of temperature (up to a maximum of 12 RPM/tick at 5000 K) in a frictionless environment, consuming 30 J*RPM gained from its internal atmosphere in the process. Friction slows the engine down by 1%/tick afterwards, making the engine reach a steady-state speed directly dependent on its temperature.&lt;br /&gt;
&lt;br /&gt;
If the engine speeds up or slows down at a rate slower than &amp;lt;code&amp;gt;min(1000/(RPM+500), 1.25)&amp;lt;/code&amp;gt; &amp;lt;!-- technically, clamp(1000/RPM+500, 0.5,1.25), but the minimum value is unreachable as it only takes place at 1500 RPM but the engine is unable to exceed 1188 RPM. --&amp;gt;RPM/tick, its stress is reduced by 0.5%/tick. Otherwise, its stress is increased by &amp;lt;code&amp;gt;(abs(RPM delta) - 1) * min(1000/(RPM+500), 1.25)&amp;lt;/code&amp;gt; %/tick (which can go negative reducing stress faster than the 0.5%/tick you&#039;d get otherwise). The optimal acceleration/decceleration rate is 1 RPM/tick beyond the 0.5% stress/tick reduction curve, at which point no stress is gained or lost.&lt;br /&gt;
&lt;br /&gt;
If stress is at 100% or more, the centrifuge slows down by a whopping 40 RPM/tick. This can put the centrifuge&#039;s engine into a death spiral as the lower RPM leads to a higher net torque which can increase the stress rate even further, with the only way to resume operation being reducing the engine&#039;s internal temperature to a point it can start accelerating again in a controlled fashion. Because the engine only cools down if it has at least 30 J/tick of combustion still occuring within it, this can be difficult to achieve without turning the centrifuge off and waiting for all hot gas to be flushed into the exhaust.&lt;br /&gt;
&lt;br /&gt;
== Processing Speed ==&lt;br /&gt;
The speed at which the centrifuge processes items is directly proportional to how fast it is rotating. At 300 RPM, it process pure ores are refined at a rate of 1 second/item and [[Dirty Ore]] / [[Reagent Mix]] at a rate of 6 seconds/item. Excess progress is carried over to the next item processed.&lt;br /&gt;
&lt;br /&gt;
Using regular [[Fuel]], the Combustion Centrifuge can reach a bit higher than 500 RPM, making it just over 5 times faster than the regular [[Centrifuge]] at its max speed. The regular electric centrifuge will take 18 seconds to process a single piece of [[Dirty Ore]], while a Combustion Centrifuge at 515 RPM will take just 3.5 seconds. At full throttle, the centrifuge will take approximately 6.5 hours to deplete a [[Gas Canister (Smart)|Smart Canister]] filled with fuel.&amp;lt;!-- 18 MPa @ 20°C * 64 L = 472 mol = 6.555 h --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The speed of the Combustion Centrifuge can be boosted significantly by replacing the fuel mixture with a [[Fuel|Superfuel]] mixture. Using superfuel can boost the centrifuge to a steady-state maximum of 1188 RPM, processing ore at more than double the speed. This comes at the cost of ease of use, as storing Superfuel mixtures and [[Nitrous Oxide]] itself is difficult, the centrifuge can no longer safely eject items at that speed, and starting up the centrifuge also becomes more complex due to faster and hotter combustion.&lt;br /&gt;
&lt;br /&gt;
{{Data Network Header}}&lt;br /&gt;
{{Data Parameters|&lt;br /&gt;
{{Data Parameters/row|Power|Boolean|w=0|Can be read to return if the Combustion Centrifuge is correctly powered or not, set via the power system, return 1 if powered and 0 if not|multiple=2|0|Unpowered|1|Powered}}&lt;br /&gt;
{{Data Parameters/row|Open|Integer|1 if device is open, otherwise 0|multiple=2|0|Closed|1|Open}}&lt;br /&gt;
{{Data Parameters/row|Error|Boolean|w=0|1 if device is in error state, otherwise 0|multiple=2|0|&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;|1|Error}}&lt;br /&gt;
{{Data Parameters/row|Pressure|Float|w=0|The current pressure reading of the Combustion Centrifuge}}&lt;br /&gt;
{{Data Parameters/row|Temperature|Integer|w=0|The current temperature reading of the Combustion Centrifuge}}&lt;br /&gt;
{{Data Parameters/row|Lock|Boolean|Disable manual operation of the Combustion Centrifuge.|multiple=2|0|Unlocked|1|Locked}}&lt;br /&gt;
{{Data Parameters/row|Reagents|Integer|w=0|Total number of reagents recorded by the Combustion Centrifuge.  Max reagent capacity is 3000, at which time centrifuge will spin down and flash an error. IC/Logic required for automation, otherwise manual operation.}}&lt;br /&gt;
{{Data Parameters/row|RatioOxygen|Float|w=0|The ratio of [[Oxygen]] in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioCarbonDioxide|Float|w=0|The ratio of Carbon Dioxide in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioNitrogen|Float|w=0|The ratio of [[Nitrogen]] in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioPollutant|Float|w=0|The ratio of [[Pollutant]] in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioVolatiles|Float|w=0|The ratio of [[Volatiles]] in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioWater|Float|w=0|The ratio of [[Water]] in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|On|Boolean|The current state of the Combustion Centrifuge.|multiple=2|0|Off|1|On}}&lt;br /&gt;
{{Data Parameters/row|RequiredPower|Integer|w=0|Idle operating power quantity, does not necessarily include extra demand power}}&lt;br /&gt;
{{Data Parameters/row|ClearMemory|Integer|r=0|When set to 1, clears the counter memory (e.g. ExportCount). Will set itself back to 0 when actioned}}&lt;br /&gt;
{{Data Parameters/row|ExportCount|Integer|w=0|How many items exported since last ClearMemory}}&lt;br /&gt;
{{Data Parameters/row|ImportCount|Integer|w=0|How many items imported since last ClearMemory}}&lt;br /&gt;
{{Data Parameters/row|TotalMoles|Float|w=0|Returns the total moles of the Combustion Centrifuge}}&lt;br /&gt;
{{Data Parameters/row|RatioNitrousOxide|Float|w=0|The ratio of Nitrous Oxide in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|PrefabHash|Integer|w=0|The hash of the structure}}&lt;br /&gt;
{{Data Parameters/row|Combustion|Boolean|w=0|Assess if the atmosphere is on fire. Returns 1 if atmosphere is on fire, 0 if not.|0 or 1}}&lt;br /&gt;
{{Data Parameters/row|PressureInput|Float|w=0|The current pressure reading of the Combustion Centrifuge&#039;s Input Network}}&lt;br /&gt;
{{Data Parameters/row|TemperatureInput|Float|w=0|The current temperature reading of the Combustion Centrifuge&#039;s Input Network}}&lt;br /&gt;
{{Data Parameters/row|RatioOxygenInput|Float|w=0|The ratio of [[Oxygen]] in device&#039;s input network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioCarbonDioxideInput|Float|w=0|The ratio of Carbon Dioxide in device&#039;s input network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioNitrogenInput|Float|w=0|The ratio of [[Nitrogen]] in device&#039;s input network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioPollutantInput|Float|w=0|The ratio of [[Pollutant]] in device&#039;s input network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioVolatilesInput|Float|w=0|The ratio of [[Volatiles]] in device&#039;s input network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioWaterInput|Float|w=0|The ratio of [[Water]] in device&#039;s input network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioNitrousOxideInput|Float|w=0|The ratio of Nitrous Oxide in device&#039;s input network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|TotalMolesInput|Float|w=0|Returns the total moles of the Combustion Centrifuge&#039;s Input Network}}&lt;br /&gt;
{{Data Parameters/row|PressureOutput|Float|w=0|The current pressure reading of the Combustion Centrifuge&#039;s Output Network}}&lt;br /&gt;
{{Data Parameters/row|TemperatureOutput|Float|w=0|The current temperature reading of the Combustion Centrifuge&#039;s Output Network}}&lt;br /&gt;
{{Data Parameters/row|RatioOxygenOutput|Float|w=0|The ratio of [[Oxygen]] in device&#039;s Output network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioCarbonDioxideOutput|Float|w=0|The ratio of Carbon Dioxide in device&#039;s Output network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioNitrogenOutput|Float|w=0|The ratio of [[Nitrogen]] in device&#039;s Output network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioPollutantOutput|Float|w=0|The ratio of [[Pollutant]] in device&#039;s Output network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioVolatilesOutput|Float|w=0|The ratio of [[Volatiles]] in device&#039;s Output network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioWaterOutput|Float|w=0|The ratio of [[Water]] in device&#039;s Output network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioNitrousOxideOutput|Float|w=0|The ratio of Nitrous Oxide in device&#039;s Output network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|TotalMolesOutput|Float|w=0|Returns the total moles of the Combustion Centrifuge&#039;s Output Network}}&lt;br /&gt;
{{Data Parameters/row|CombustionInput|Boolean|w=0|Assess if the atmosphere is on fire. Returns 1 if device&#039;s input network is on fire, 0 if not.|0 or 1}}&lt;br /&gt;
{{Data Parameters/row|CombustionOutput|Boolean|w=0|Assess if the atmosphere is on fire. Returns 1 if device&#039;s Output network is on fire, 0 if not.|0 or 1}}&lt;br /&gt;
{{Data Parameters/row|CombustionLimiter|Integer|Retards the rate of combustion inside the machine (range: 0-100), with 0 being the slowest rate of combustion and 100 being the fastest}}&lt;br /&gt;
{{Data Parameters/row|Throttle|Integer|Increases the rate at which the machine works (range: 0-100)}}&lt;br /&gt;
{{Data Parameters/row|Rpm|Integer|w=0|The number of revolutions per minute that the Combustion Centrifuge&#039;s spinning mechanism is doing}}&lt;br /&gt;
{{Data Parameters/row|Stress|Integer|w=0|Machines get stressed when working hard. When Stress reaches 100 the machine will automatically shut down}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidNitrogen|Float|w=0|The ratio of Liquid Nitrogen in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidNitrogenInput|Float|w=0|The ratio of Liquid Nitrogen in device&#039;s input network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidNitrogenOutput|Float|w=0|The ratio of Liquid Nitrogen in device&#039;s Output network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidOxygen|Float|w=0|The ratio of Liquid Oxygen in device&#039;s Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidOxygenInput|Float|w=0|The ratio of Liquid Oxygen in device&#039;s Input Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidOxygenOutput|Float|w=0|The ratio of Liquid Oxygen in Combustion Centrifuge&#039;s Output Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidVolatiles|Float|w=0|The ratio of Liquid Volatiles in device&#039;s Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidVolatilesInput|Float|w=0|The ratio of Liquid Volatiles in device&#039;s Input Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidVolatilesOutput|Float|w=0|The ratio of Liquid Volatiles in Combustion Centrifuge&#039;s Output Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioSteam|Float|w=0|The ratio of Steam in device&#039;s Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioSteamInput|Float|w=0|The ratio of Steam in device&#039;s Input Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioSteamOutput|Float|w=0|The ratio of Steam in Combustion Centrifuge&#039;s Output Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidCarbonDioxide|Float|w=0|The ratio of Liquid Carbon Dioxide in device&#039;s Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidCarbonDioxideInput|Float|w=0|The ratio of Liquid Carbon Dioxide in device&#039;s Input Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidCarbonDioxideOutput|Float|w=0|The ratio of Liquid Carbon Dioxide in Combustion Centrifuge&#039;s Output Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidPollutant|Float|w=0|The ratio of Liquid Pollutant in device&#039;s Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidPollutantInput|Float|w=0|The ratio of Liquid Pollutant in device&#039;s Input Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidPollutantOutput|Float|w=0|The ratio of Liquid Pollutant in Combustion Centrifuge&#039;s Output Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidNitrousOxide|Float|w=0|The ratio of Liquid Nitrous Oxide in device&#039;s Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidNitrousOxideInput|Float|w=0|The ratio of Liquid Nitrous Oxide in device&#039;s Input Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidNitrousOxideOutput|Float|w=0|The ratio of Liquid Nitrous Oxide in Combustion Centrifuge&#039;s Output Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|ReferenceId|Integer|w=0|Unique Reference Identifier for this object}}&lt;br /&gt;
{{Data Parameters/row|RatioHydrogen|Float|w=0|DEPRECATED|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidHydrogen|Float|w=0|DEPRECATED|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioPollutedWater|Float|w=0|The ratio of polluted water in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|NameHash|Integer|w=0|Provides the hash value for the name of the object as a 32 bit integer.}}&lt;br /&gt;
}}&lt;br /&gt;
{{Slots|logic=1&lt;br /&gt;
|{{Slots/row|name=Import|type=None}}&lt;br /&gt;
|{{Slots/row|name=Export|type=None}}&lt;br /&gt;
||{{Slots/row|name=Programmable Chip|type=ProgrammableChip}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Connections}}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Connection Name !! Index&lt;br /&gt;
|-&lt;br /&gt;
| [[Chute]] Input || 0&lt;br /&gt;
|-&lt;br /&gt;
| Chute Output || 1&lt;br /&gt;
|-&lt;br /&gt;
| Data || 2&lt;br /&gt;
|-&lt;br /&gt;
| [[Power]] || 3&lt;br /&gt;
|-&lt;br /&gt;
| Pipe Input || 4&lt;br /&gt;
|-&lt;br /&gt;
| Pipe Input || 5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
[https://steamcommunity.com/sharedfiles/filedetails/?id=3448074160 reference automation implementation by lisnaz]&lt;br /&gt;
[[Category:Machines]]&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=Kit_(Landing_Pad)&amp;diff=28107</id>
		<title>Kit (Landing Pad)</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=Kit_(Landing_Pad)&amp;diff=28107"/>
		<updated>2026-09-08T03:07:37Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: Add landing pad virtual waypoint&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Machines]]&lt;br /&gt;
[[Category:Items]]&lt;br /&gt;
{{Itembox&lt;br /&gt;
 | name        = Kit (Landing Pad Basic)&lt;br /&gt;
 | image       = [[File:ItemKitLandingPad.png]]&lt;br /&gt;
 | recipe_machine1 = Electronics Printer&lt;br /&gt;
 | recipe_cost1 = 1g [[Copper]], 5g [[Steel]]&lt;br /&gt;
 | constructs  = [[Landing Pad]],[[Landingpad Data And Power]]&lt;br /&gt;
 | stacks      = 10&lt;br /&gt;
}}&lt;br /&gt;
{{Structurebox&lt;br /&gt;
 | name             = Landing Pad&lt;br /&gt;
 | image            = [[File:ItemLandingPad.png|thumb|Smallest Landing Pad needed for a [[Trader]] to land]]&lt;br /&gt;
 | placed_with_item = [[Kit(Landing Pad Basic)]]&lt;br /&gt;
 | placed_on_grid   = Large Grid&lt;br /&gt;
 | const_with_item1 = [[Kit (Landing Pad Basic)]]&lt;br /&gt;
 | decon_with_tool1 = [[Angle Grinder]]&lt;br /&gt;
 | item_rec1        = [[Kit (Landing Pad Basic)]]&lt;br /&gt;
 | decon_with_tool2 = [[Wrench]]&lt;br /&gt;
 | item_rec2        = 1x [[Steel Sheets]]&lt;br /&gt;
 | const_with_tool1 = [[Welding Torch]]&lt;br /&gt;
 | const_with_item1 = 1 x [[Steel Sheets]]&lt;br /&gt;
 | requires_frames  = True&lt;br /&gt;
 | airtight         = False&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Note==&lt;br /&gt;
&#039;&#039;&#039;This page is out of date including the recipe, and under revision. For now please refer to the ingame stationpedia.&#039;&#039;&#039;&lt;br /&gt;
==Purpose==&lt;br /&gt;
The [[Landing Pad]] provides a place for [[Trader]] shuttles to land.  It can be placed on any support structures and must be outside.&lt;br /&gt;
&lt;br /&gt;
The smallest Landing Pad that works is a 3x3 square, and it needs a centrepiece in the middle. When a Trader shuttle arrives, it lands right in the middle of the centrepiece. The centrepiece has an arrow showing which way the shuttles come and go. It&#039;s really important to make sure nothing blocks the arrow&#039;s path. That way, the shuttles can move smoothly without any problems. The shuttles usually land and take off at an angle of about 30 degrees.&lt;br /&gt;
&lt;br /&gt;
Once your Landing Pad is ready, you can check the computer terminal to see what size landing pad each available shuttle needs.&lt;br /&gt;
&lt;br /&gt;
There are six types of shuttles, including small, medium, and large ones, with normal and gas options. Shuttles can either use a runway or make a vertical descent to land. Small shuttles need a 3x3 pad, medium shuttles need a 5x5 pad, and larger shuttles needing up to a 9x9 pad. Having different pad sizes lets you trade with more Traders who visit your station.&lt;br /&gt;
&lt;br /&gt;
The [[Trader Waypoint]] allow the Trader&#039;s planes to not crash while landing. It can be configured so that planes do not crash into buildings or mountains while descending or ascending.&lt;br /&gt;
&lt;br /&gt;
If you want to trade with human Traders, you&#039;ll need to create a hangar with air they can breathe. Large shuttles and planes sometimes have human Traders inside. These Traders won&#039;t come out and trade unless there&#039;s air in the hangar. So, make sure you build a pressurized hangar to accommodate them. Landing pad sections are not airtight, so need to be built on a sealed frame floor. A landing pad needs to be one contiguous structure, and walls cannot separate them. However, Hangar doors across extra &#039;bridging&#039; landing pad pieces can be used to have ancillary equipment such as storage tanks, power and data, and gas/liquid input/output, outside of the pressurised space.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Data Parameters}}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter Name !! Data Type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Activate || Boolean || Activates the Landing Pad when set to 1.&lt;br /&gt;
|-&lt;br /&gt;
| On || Boolean || Turns the Landing Pad on when set to 1. Turns the Landing Pad off when set to 0.&lt;br /&gt;
|-&lt;br /&gt;
| Vertical || Float || Sets the height of a virtual waypoint used during approach. Without a Trader Waypoint in place, this waypoint is directly above the landing pad center piece. Valid values range from 0 to 50m.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Data Outputs}}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Output Name !! Data Type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Power || Boolean || Returns whether the Landing Pad is turned on and receiving power. (0 for no, 1 for yes)&lt;br /&gt;
|-&lt;br /&gt;
| On || Boolean || Returns whether the Landing Pad is turned on. (0 for no, 1 for yes)&lt;br /&gt;
|-&lt;br /&gt;
| RequiredPower || Integer || Returns the current watts of power required by the Landing Pad.&lt;br /&gt;
|-&lt;br /&gt;
| Error || Boolean || Returns whether the Landing Pad is currently flashing an error.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=Combustion_Centrifuge&amp;diff=28105</id>
		<title>Combustion Centrifuge</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=Combustion_Centrifuge&amp;diff=28105"/>
		<updated>2026-09-07T09:03:48Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: patch up a few brainfarts&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{Itembox&lt;br /&gt;
| name = Kit (Combustion Centrifuge)&lt;br /&gt;
| image = [[File:KitStructureCombustionCentrifuge.png]]&lt;br /&gt;
| prefabhash = 231903234&lt;br /&gt;
| prefabname = KitStructureCombustionCentrifuge&lt;br /&gt;
| stacks = 1&lt;br /&gt;
| slot_class = SlotClass.None&lt;br /&gt;
| sorting_class = SortingClass.Kits&lt;br /&gt;
| recipe_machine1 = Autolathe (Tier Two)&lt;br /&gt;
| recipe_cost1 = 20g [[Steel]], 10g [[Invar]], 5g [[Constantan]]&lt;br /&gt;
| constructs = [[Combustion Centrifuge]]&lt;br /&gt;
}}&lt;br /&gt;
{{Structurebox&lt;br /&gt;
 | name             = Combustion Centrifuge&lt;br /&gt;
 | image            = [[File:StructureCombustionCentrifuge.png]]&lt;br /&gt;
 | power_usage      = 50W&lt;br /&gt;
 | placed_with_item = [[Kit (Combustion Centrifuge)]]&lt;br /&gt;
 | placed_on_grid   = Small Grid&lt;br /&gt;
 | stage_image1     = [[File:StructureCombustionCentrifuge_BuildState0.png]]&lt;br /&gt;
 | decon_with_tool1 = [[Hand Drill]]&lt;br /&gt;
 | item_rec1        = [[Kit (Combustion Centrifuge)]]&lt;br /&gt;
 | const_with_tool2 = [[Welder]]&lt;br /&gt;
 | const_with_item2 = 2x [[Steel Sheets]]&lt;br /&gt;
 | stage_image2     = [[File:StructureCombustionCentrifuge_BuildState1.png]]&lt;br /&gt;
 | decon_with_tool2 = [[Angle Grinder]]&lt;br /&gt;
 | item_rec2        = 2x [[Steel Sheets]]&lt;br /&gt;
 | const_with_item3 = 1x [[Cable Coil]]&lt;br /&gt;
 | decon_with_tool3 = [[Wire Cutters]]&lt;br /&gt;
 | item_rec3        = 1x [[Cable Coil]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Stationpedia|The Combustion Centrifuge is a gas powered version of the [[Centrifuge]]. If a [[Recycler]] or unbalanced [[Furnace]] outputs reagent mixture rather than the desired [[:Category:Ingot|ingots]], a centrifuge allows you to reclaim the raw [[Ores|ore]].&lt;br /&gt;
&lt;br /&gt;
It also refines [[Dirty Ore]] produced from the [[Deep Miner]] and [[Dirty Ore]] produced from the [[Rocket Miner]]. A combustible fuel mix should be supplied to the gas input, and waste gasses should be vented from the output.&lt;br /&gt;
&lt;br /&gt;
The machine&#039;s RPMs must be controlled via the throttle and combustion limiter levers. If the Combustion Centrifuge gains, or loses, RPMs too fast it will experience stress, and eventually grind to a halt.  Higher RPMs directly result in faster processing speeds.&lt;br /&gt;
&lt;br /&gt;
The throttle lever controls the amount of fuel being pulled into the machine, increasing the temperature inside the engine, and leading to an increase in RPM. The limiter lever influences the speed of the combustion, and how much uncombusted gas is in the exhaust.&lt;br /&gt;
&lt;br /&gt;
Ejecting ore from the Combustion Centrifuge while it is at high RPMs will result in additional stress build up.  If turned off while not stressed, the machine will automatically start to brake, and reduce RPMs in a controlled manner.}}&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
The Combustion Centrifuge is a version of the [[Centrifuge]] containing an internal combustion engine whose fuel consumption is adjustable by the throttle lever in 10% increments. Higher engine temperatures result in additional torque which allows it to reach higher speeds, but accelerating (or deccelerating) the engine too quickly results in stress buildup, which causes the engine to grind to a halt if the stress is allowed to reach 100%. It comes with a combustion limiter which allows the rate of combustion to be adjusted.&lt;br /&gt;
&lt;br /&gt;
Ejecting ore from the Combustion Centrifuge while it is spinning will result in 0.1% additional stress buildup/RPM , as well as a 10% reduction in current RPM.&lt;br /&gt;
&lt;br /&gt;
If turned off while not stressed, the machine will automatically start to brake, reduce its drum speed by 15 RPM/tick, and start flushing stored internal gases into its exhaust.&lt;br /&gt;
&lt;br /&gt;
The Combustion Centrifuge can hold 3000g processed ore in its internal storage, allowing it to run for multiple hours before being emptied if processing low-purity ore.&lt;br /&gt;
&lt;br /&gt;
The Combustion Centrifuge has a socket for an [[Integrated Circuit (IC10)|IC10 chip]], similar to the [[Atmospherics]] machine. It comes with two device ports, d0 and d1, for connecting to other devices. To change or set a device, use a [[screwdriver]] to cycle through devices found on the machine&#039;s data network. Code does not run while the centrifuge is turned off, somewhat limiting the centrifuge&#039;s usefulness as turning it off can be necessary to recover from an overstressed state. &lt;br /&gt;
== Throttle ==&lt;br /&gt;
Every [[tick]] up to 0.01 moles of gas will be pulled in to the machine from the input [[pipe]] network. The Throttle parameter linearly controls how much gas to pull in - &amp;lt;code&amp;gt;inputMoles = 0.01*Throttle/100&amp;lt;/code&amp;gt;. The Throttle value is rounded to the nearest 10% increment when set.&lt;br /&gt;
&lt;br /&gt;
== Combustion Limiter ==&lt;br /&gt;
&lt;br /&gt;
The combustion limiter speeds up combustion by forcing an additional percentage of fuel present in the engine to combust &#039;&#039;&#039;after&#039;&#039;&#039; normal combustion takes place. The percentage is quadratically dependent on the combustion limiter lever position:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Force-Combustion Percentages&lt;br /&gt;
!Combustion Limiter setting&lt;br /&gt;
!Combustion Percentage&lt;br /&gt;
|-&lt;br /&gt;
|0% &amp;lt;small&amp;gt;(minimum setting is 3.65%)&amp;lt;/small&amp;gt;&lt;br /&gt;
|0.1%&lt;br /&gt;
|-&lt;br /&gt;
|10%&lt;br /&gt;
|0.75%&lt;br /&gt;
|-&lt;br /&gt;
|20%&lt;br /&gt;
|3%&lt;br /&gt;
|-&lt;br /&gt;
|30%&lt;br /&gt;
|6.75%&lt;br /&gt;
|-&lt;br /&gt;
|40%&lt;br /&gt;
|12%&lt;br /&gt;
|-&lt;br /&gt;
|50%&lt;br /&gt;
|18.75%&lt;br /&gt;
|-&lt;br /&gt;
|60%&lt;br /&gt;
|27%&lt;br /&gt;
|-&lt;br /&gt;
|70%&lt;br /&gt;
|36.75%&lt;br /&gt;
|-&lt;br /&gt;
|80%&lt;br /&gt;
|48%&lt;br /&gt;
|-&lt;br /&gt;
|90%&lt;br /&gt;
|60.75%&lt;br /&gt;
|-&lt;br /&gt;
|100%&lt;br /&gt;
|75%&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Exhaust ==&lt;br /&gt;
The engine pushes gas from its engine into the output pipe network once its internal pressure exceeds 4 MPa. This results in some unburned fuel being present in the exhaust. If the centrifuge is powered off, the centrifuge slows down at 15rpm/tick(as long as no stress is being accrued from excess torque) and hot gas stored inside the engine is slowly flushed out to the exhaust down to 0 kPa. &lt;br /&gt;
&lt;br /&gt;
== Engine Speed / Stress ==&lt;br /&gt;
If the engine&#039;s temperature is above 300°C and was capable of combusting at least 30 J during the current tick, the engine produces torque, speeding up by 1 RPM/tick for every {{Overline|416.|6}} K of temperature (up to a maximum of 12 RPM/tick at 5000 K) in a frictionless environment, consuming 30 J*RPM gained from its internal atmosphere in the process. Friction slows the engine down by 1%/tick afterwards, making the engine reach a steady-state speed directly dependent on its temperature.&lt;br /&gt;
&lt;br /&gt;
If the engine speeds up or slows down at a rate slower than &amp;lt;code&amp;gt;min(1000/(RPM+500), 1.25)&amp;lt;/code&amp;gt; RPM/tick, its stress is reduced by 0.5%/tick. Otherwise, its stress is increased by &amp;lt;code&amp;gt;(abs(RPM delta) - 1) * min(1000/(RPM+500), 1.25)&amp;lt;/code&amp;gt; %/tick (which can go negative reducing stress faster than the 0.5%/tick you&#039;d get otherwise). The optimal acceleration/decceleration rate is 1 RPM/tick beyond the 0.5% stress/tick reduction curve, at which point no stress is gained or lost.&lt;br /&gt;
&lt;br /&gt;
If stress is at 100% or more, the centrifuge slows down by a whopping 40 RPM/tick. This can put the centrifuge&#039;s engine into a death spiral as the lower RPM leads to a higher net torque which can increase the stress rate even further, with the only way to resume operation being reducing the engine&#039;s internal temperature to a point it can start accelerating again in a controlled fashion. Because the engine only cools down if it has at least 30 J/tick of combustion still occuring within it, this can be difficult to achieve without turning the centrifuge off and waiting for all hot gas to be flushed into the exhaust.&lt;br /&gt;
&lt;br /&gt;
== Processing Speed ==&lt;br /&gt;
The speed at which the centrifuge processes items is directly proportional to how fast it is rotating. At 300 RPM, it process pure ores are refined at a rate of 1 second/item and [[Dirty Ore]] / [[Reagent Mix]] at a rate of 6 seconds/item. Excess progress is carried over to the next item processed.&lt;br /&gt;
&lt;br /&gt;
Using regular [[Fuel]], the Combustion Centrifuge can reach a bit higher than 500 RPM, making it just over 5 times faster than the regular [[Centrifuge]] at its max speed. The regular electric centrifuge will take 18 seconds to process a single piece of [[Dirty Ore]], while a Combustion Centrifuge at 515 RPM will take just 3.5 seconds. At full throttle, the centrifuge will take approximately 6.5 hours to deplete a [[Gas Canister (Smart)|Smart Canister]] filled with fuel.&amp;lt;!-- 18 MPa @ 20°C * 64 L = 472 mol = 6.555 h --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The speed of the Combustion Centrifuge can be boosted significantly by replacing the fuel mixture with a [[Fuel|Superfuel]] mixture. Using superfuel can boost the centrifuge to a steady-state maximum of 1188 RPM, processing ore at more than double the speed. This comes at the cost of ease of use, as storing Superfuel mixtures and [[Nitrous Oxide]] itself is difficult, the centrifuge can no longer safely eject items at that speed, and starting up the centrifuge also becomes more complex due to faster and hotter combustion.&lt;br /&gt;
&lt;br /&gt;
{{Data Network Header}}&lt;br /&gt;
{{Data Parameters|&lt;br /&gt;
{{Data Parameters/row|Power|Boolean|w=0|Can be read to return if the Combustion Centrifuge is correctly powered or not, set via the power system, return 1 if powered and 0 if not|multiple=2|0|Unpowered|1|Powered}}&lt;br /&gt;
{{Data Parameters/row|Open|Integer|1 if device is open, otherwise 0|multiple=2|0|Closed|1|Open}}&lt;br /&gt;
{{Data Parameters/row|Error|Boolean|w=0|1 if device is in error state, otherwise 0|multiple=2|0|&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;|1|Error}}&lt;br /&gt;
{{Data Parameters/row|Pressure|Float|w=0|The current pressure reading of the Combustion Centrifuge}}&lt;br /&gt;
{{Data Parameters/row|Temperature|Integer|w=0|The current temperature reading of the Combustion Centrifuge}}&lt;br /&gt;
{{Data Parameters/row|Lock|Boolean|Disable manual operation of the Combustion Centrifuge.|multiple=2|0|Unlocked|1|Locked}}&lt;br /&gt;
{{Data Parameters/row|Reagents|Integer|w=0|Total number of reagents recorded by the Combustion Centrifuge.  Max reagent capacity is 3000, at which time centrifuge will spin down and flash an error. IC/Logic required for automation, otherwise manual operation.}}&lt;br /&gt;
{{Data Parameters/row|RatioOxygen|Float|w=0|The ratio of [[Oxygen]] in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioCarbonDioxide|Float|w=0|The ratio of Carbon Dioxide in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioNitrogen|Float|w=0|The ratio of [[Nitrogen]] in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioPollutant|Float|w=0|The ratio of [[Pollutant]] in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioVolatiles|Float|w=0|The ratio of [[Volatiles]] in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioWater|Float|w=0|The ratio of [[Water]] in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|On|Boolean|The current state of the Combustion Centrifuge.|multiple=2|0|Off|1|On}}&lt;br /&gt;
{{Data Parameters/row|RequiredPower|Integer|w=0|Idle operating power quantity, does not necessarily include extra demand power}}&lt;br /&gt;
{{Data Parameters/row|ClearMemory|Integer|r=0|When set to 1, clears the counter memory (e.g. ExportCount). Will set itself back to 0 when actioned}}&lt;br /&gt;
{{Data Parameters/row|ExportCount|Integer|w=0|How many items exported since last ClearMemory}}&lt;br /&gt;
{{Data Parameters/row|ImportCount|Integer|w=0|How many items imported since last ClearMemory}}&lt;br /&gt;
{{Data Parameters/row|TotalMoles|Float|w=0|Returns the total moles of the Combustion Centrifuge}}&lt;br /&gt;
{{Data Parameters/row|RatioNitrousOxide|Float|w=0|The ratio of Nitrous Oxide in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|PrefabHash|Integer|w=0|The hash of the structure}}&lt;br /&gt;
{{Data Parameters/row|Combustion|Boolean|w=0|Assess if the atmosphere is on fire. Returns 1 if atmosphere is on fire, 0 if not.|0 or 1}}&lt;br /&gt;
{{Data Parameters/row|PressureInput|Float|w=0|The current pressure reading of the Combustion Centrifuge&#039;s Input Network}}&lt;br /&gt;
{{Data Parameters/row|TemperatureInput|Float|w=0|The current temperature reading of the Combustion Centrifuge&#039;s Input Network}}&lt;br /&gt;
{{Data Parameters/row|RatioOxygenInput|Float|w=0|The ratio of [[Oxygen]] in device&#039;s input network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioCarbonDioxideInput|Float|w=0|The ratio of Carbon Dioxide in device&#039;s input network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioNitrogenInput|Float|w=0|The ratio of [[Nitrogen]] in device&#039;s input network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioPollutantInput|Float|w=0|The ratio of [[Pollutant]] in device&#039;s input network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioVolatilesInput|Float|w=0|The ratio of [[Volatiles]] in device&#039;s input network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioWaterInput|Float|w=0|The ratio of [[Water]] in device&#039;s input network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioNitrousOxideInput|Float|w=0|The ratio of Nitrous Oxide in device&#039;s input network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|TotalMolesInput|Float|w=0|Returns the total moles of the Combustion Centrifuge&#039;s Input Network}}&lt;br /&gt;
{{Data Parameters/row|PressureOutput|Float|w=0|The current pressure reading of the Combustion Centrifuge&#039;s Output Network}}&lt;br /&gt;
{{Data Parameters/row|TemperatureOutput|Float|w=0|The current temperature reading of the Combustion Centrifuge&#039;s Output Network}}&lt;br /&gt;
{{Data Parameters/row|RatioOxygenOutput|Float|w=0|The ratio of [[Oxygen]] in device&#039;s Output network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioCarbonDioxideOutput|Float|w=0|The ratio of Carbon Dioxide in device&#039;s Output network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioNitrogenOutput|Float|w=0|The ratio of [[Nitrogen]] in device&#039;s Output network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioPollutantOutput|Float|w=0|The ratio of [[Pollutant]] in device&#039;s Output network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioVolatilesOutput|Float|w=0|The ratio of [[Volatiles]] in device&#039;s Output network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioWaterOutput|Float|w=0|The ratio of [[Water]] in device&#039;s Output network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioNitrousOxideOutput|Float|w=0|The ratio of Nitrous Oxide in device&#039;s Output network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|TotalMolesOutput|Float|w=0|Returns the total moles of the Combustion Centrifuge&#039;s Output Network}}&lt;br /&gt;
{{Data Parameters/row|CombustionInput|Boolean|w=0|Assess if the atmosphere is on fire. Returns 1 if device&#039;s input network is on fire, 0 if not.|0 or 1}}&lt;br /&gt;
{{Data Parameters/row|CombustionOutput|Boolean|w=0|Assess if the atmosphere is on fire. Returns 1 if device&#039;s Output network is on fire, 0 if not.|0 or 1}}&lt;br /&gt;
{{Data Parameters/row|CombustionLimiter|Integer|Retards the rate of combustion inside the machine (range: 0-100), with 0 being the slowest rate of combustion and 100 being the fastest}}&lt;br /&gt;
{{Data Parameters/row|Throttle|Integer|Increases the rate at which the machine works (range: 0-100)}}&lt;br /&gt;
{{Data Parameters/row|Rpm|Integer|w=0|The number of revolutions per minute that the Combustion Centrifuge&#039;s spinning mechanism is doing}}&lt;br /&gt;
{{Data Parameters/row|Stress|Integer|w=0|Machines get stressed when working hard. When Stress reaches 100 the machine will automatically shut down}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidNitrogen|Float|w=0|The ratio of Liquid Nitrogen in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidNitrogenInput|Float|w=0|The ratio of Liquid Nitrogen in device&#039;s input network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidNitrogenOutput|Float|w=0|The ratio of Liquid Nitrogen in device&#039;s Output network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidOxygen|Float|w=0|The ratio of Liquid Oxygen in device&#039;s Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidOxygenInput|Float|w=0|The ratio of Liquid Oxygen in device&#039;s Input Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidOxygenOutput|Float|w=0|The ratio of Liquid Oxygen in Combustion Centrifuge&#039;s Output Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidVolatiles|Float|w=0|The ratio of Liquid Volatiles in device&#039;s Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidVolatilesInput|Float|w=0|The ratio of Liquid Volatiles in device&#039;s Input Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidVolatilesOutput|Float|w=0|The ratio of Liquid Volatiles in Combustion Centrifuge&#039;s Output Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioSteam|Float|w=0|The ratio of Steam in device&#039;s Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioSteamInput|Float|w=0|The ratio of Steam in device&#039;s Input Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioSteamOutput|Float|w=0|The ratio of Steam in Combustion Centrifuge&#039;s Output Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidCarbonDioxide|Float|w=0|The ratio of Liquid Carbon Dioxide in device&#039;s Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidCarbonDioxideInput|Float|w=0|The ratio of Liquid Carbon Dioxide in device&#039;s Input Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidCarbonDioxideOutput|Float|w=0|The ratio of Liquid Carbon Dioxide in Combustion Centrifuge&#039;s Output Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidPollutant|Float|w=0|The ratio of Liquid Pollutant in device&#039;s Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidPollutantInput|Float|w=0|The ratio of Liquid Pollutant in device&#039;s Input Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidPollutantOutput|Float|w=0|The ratio of Liquid Pollutant in Combustion Centrifuge&#039;s Output Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidNitrousOxide|Float|w=0|The ratio of Liquid Nitrous Oxide in device&#039;s Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidNitrousOxideInput|Float|w=0|The ratio of Liquid Nitrous Oxide in device&#039;s Input Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidNitrousOxideOutput|Float|w=0|The ratio of Liquid Nitrous Oxide in Combustion Centrifuge&#039;s Output Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|ReferenceId|Integer|w=0|Unique Reference Identifier for this object}}&lt;br /&gt;
{{Data Parameters/row|RatioHydrogen|Float|w=0|DEPRECATED|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidHydrogen|Float|w=0|DEPRECATED|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioPollutedWater|Float|w=0|The ratio of polluted water in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|NameHash|Integer|w=0|Provides the hash value for the name of the object as a 32 bit integer.}}&lt;br /&gt;
}}&lt;br /&gt;
{{Slots|logic=1&lt;br /&gt;
|{{Slots/row|name=Import|type=None}}&lt;br /&gt;
|{{Slots/row|name=Export|type=None}}&lt;br /&gt;
||{{Slots/row|name=Programmable Chip|type=ProgrammableChip}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Connections}}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Connection Name !! Index&lt;br /&gt;
|-&lt;br /&gt;
| [[Chute]] Input || 0&lt;br /&gt;
|-&lt;br /&gt;
| Chute Output || 1&lt;br /&gt;
|-&lt;br /&gt;
| Data || 2&lt;br /&gt;
|-&lt;br /&gt;
| [[Power]] || 3&lt;br /&gt;
|-&lt;br /&gt;
| Pipe Input || 4&lt;br /&gt;
|-&lt;br /&gt;
| Pipe Input || 5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
[https://steamcommunity.com/sharedfiles/filedetails/?id=3448074160 reference automation implementation by lisnaz]&lt;br /&gt;
[[Category:Machines]]&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=Combustion_Centrifuge&amp;diff=28104</id>
		<title>Combustion Centrifuge</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=Combustion_Centrifuge&amp;diff=28104"/>
		<updated>2026-09-07T08:55:52Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: rewrite sections using notes from User:RA2lover/Sandbox/Thermodynamics_machinery_notes/Combustion_Processors&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{Itembox&lt;br /&gt;
| name = Kit (Combustion Centrifuge)&lt;br /&gt;
| image = [[File:KitStructureCombustionCentrifuge.png]]&lt;br /&gt;
| prefabhash = 231903234&lt;br /&gt;
| prefabname = KitStructureCombustionCentrifuge&lt;br /&gt;
| stacks = 1&lt;br /&gt;
| slot_class = SlotClass.None&lt;br /&gt;
| sorting_class = SortingClass.Kits&lt;br /&gt;
| recipe_machine1 = Autolathe (Tier Two)&lt;br /&gt;
| recipe_cost1 = 20g [[Steel]], 10g [[Invar]], 5g [[Constantan]]&lt;br /&gt;
| constructs = [[Combustion Centrifuge]]&lt;br /&gt;
}}&lt;br /&gt;
{{Structurebox&lt;br /&gt;
 | name             = Combustion Centrifuge&lt;br /&gt;
 | image            = [[File:StructureCombustionCentrifuge.png]]&lt;br /&gt;
 | power_usage      = 50W&lt;br /&gt;
 | placed_with_item = [[Kit (Combustion Centrifuge)]]&lt;br /&gt;
 | placed_on_grid   = Small Grid&lt;br /&gt;
 | stage_image1     = [[File:StructureCombustionCentrifuge_BuildState0.png]]&lt;br /&gt;
 | decon_with_tool1 = [[Hand Drill]]&lt;br /&gt;
 | item_rec1        = [[Kit (Combustion Centrifuge)]]&lt;br /&gt;
 | const_with_tool2 = [[Welder]]&lt;br /&gt;
 | const_with_item2 = 2x [[Steel Sheets]]&lt;br /&gt;
 | stage_image2     = [[File:StructureCombustionCentrifuge_BuildState1.png]]&lt;br /&gt;
 | decon_with_tool2 = [[Angle Grinder]]&lt;br /&gt;
 | item_rec2        = 2x [[Steel Sheets]]&lt;br /&gt;
 | const_with_item3 = 1x [[Cable Coil]]&lt;br /&gt;
 | decon_with_tool3 = [[Wire Cutters]]&lt;br /&gt;
 | item_rec3        = 1x [[Cable Coil]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Stationpedia|The Combustion Centrifuge is a gas powered version of the [[Centrifuge]]. If a [[Recycler]] or unbalanced [[Furnace]] outputs reagent mixture rather than the desired [[:Category:Ingot|ingots]], a centrifuge allows you to reclaim the raw [[Ores|ore]].&lt;br /&gt;
&lt;br /&gt;
It also refines [[Dirty Ore]] produced from the [[Deep Miner]] and [[Dirty Ore]] produced from the [[Rocket Miner]]. A combustible fuel mix should be supplied to the gas input, and waste gasses should be vented from the output.&lt;br /&gt;
&lt;br /&gt;
The machine&#039;s RPMs must be controlled via the throttle and combustion limiter levers. If the Combustion Centrifuge gains, or loses, RPMs too fast it will experience stress, and eventually grind to a halt.  Higher RPMs directly result in faster processing speeds.&lt;br /&gt;
&lt;br /&gt;
The throttle lever controls the amount of fuel being pulled into the machine, increasing the temperature inside the engine, and leading to an increase in RPM. The limiter lever influences the speed of the combustion, and how much uncombusted gas is in the exhaust.&lt;br /&gt;
&lt;br /&gt;
Ejecting ore from the Combustion Centrifuge while it is at high RPMs will result in additional stress build up.  If turned off while not stressed, the machine will automatically start to brake, and reduce RPMs in a controlled manner.}}&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
The Combustion Centrifuge is version of the [[Centrifuge]] containing an internal combustion engine whose fuel consumption is adjustable by the throttle lever in 10% increments. Higher engine temperatures result in additional torque which allows it to reach higher speeds, but accelerating (or deccelerating) the engine too quickly results in stress buildup, which causes the engine to grind to a halt if the stress is allowed to reach 100%. It comes with a combustion limiter which allows the rate of combustion to be adjusted.&lt;br /&gt;
&lt;br /&gt;
Ejecting ore from the Combustion Centrifuge while it is spinning will result in 0.1% additional stress buildup/RPM , as well as a 10% reduction in current RPM.&lt;br /&gt;
&lt;br /&gt;
If turned off while not stressed, the machine will automatically start to brake, reduce its drum speed by 15 RPM/tick, and start dumping stored internal gases into its exhaust.&lt;br /&gt;
&lt;br /&gt;
The Combustion Centrifuge can hold 3000g processed ore in its internal storage, allowing it to run for multiple hours before being emptied if processing low-purity ore.&lt;br /&gt;
&lt;br /&gt;
The Combustion Centrifuge has a socket for an [[Integrated Circuit (IC10)|IC10 chip]], similar to the [[Atmospherics]] machine. It comes with two device ports, d0 and d1, for connecting to other devices. To change or set a device, use a [[screwdriver]] to cycle through devices found on the machine&#039;s data network. Code does not run while the centrifuge is turned off, somewhat limiting the centrifuge&#039;s usefulness as turning it off &lt;br /&gt;
== Throttle ==&lt;br /&gt;
Every [[tick]] up to 0.01 moles of gas will be pulled in to the machine from the input [[pipe]] network. The Throttle parameter linearly controls how much gas to pull in - &amp;lt;code&amp;gt;inputMoles = 0.01*Throttle/100&amp;lt;/code&amp;gt;. The Throttle value is rounded to the nearest 10% increment when set.&lt;br /&gt;
&lt;br /&gt;
== Combustion Limiter ==&lt;br /&gt;
&lt;br /&gt;
The combustion limiter speeds up combustion by forcing an additional percentage of fuel present in the engine to combust &#039;&#039;&#039;after&#039;&#039;&#039; normal combustion takes place. The percentage is quadratically dependent on the combustion limiter lever position:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Force-Combustion Percentages&lt;br /&gt;
!Combustion Limiter setting&lt;br /&gt;
!Combustion Percentage&lt;br /&gt;
|-&lt;br /&gt;
|0% &amp;lt;small&amp;gt;(minimum setting is 3.65%)&amp;lt;/small&amp;gt;&lt;br /&gt;
|0.1%&lt;br /&gt;
|-&lt;br /&gt;
|10%&lt;br /&gt;
|0.75%&lt;br /&gt;
|-&lt;br /&gt;
|20%&lt;br /&gt;
|3%&lt;br /&gt;
|-&lt;br /&gt;
|30%&lt;br /&gt;
|6.75%&lt;br /&gt;
|-&lt;br /&gt;
|40%&lt;br /&gt;
|12%&lt;br /&gt;
|-&lt;br /&gt;
|50%&lt;br /&gt;
|18.75%&lt;br /&gt;
|-&lt;br /&gt;
|60%&lt;br /&gt;
|27%&lt;br /&gt;
|-&lt;br /&gt;
|70%&lt;br /&gt;
|36.75%&lt;br /&gt;
|-&lt;br /&gt;
|80%&lt;br /&gt;
|48%&lt;br /&gt;
|-&lt;br /&gt;
|90%&lt;br /&gt;
|60.75%&lt;br /&gt;
|-&lt;br /&gt;
|100%&lt;br /&gt;
|75%&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Exhaust ==&lt;br /&gt;
The engine pushes gas from its engine into the output pipe network once its internal pressure exceeds 4 MPa. This results in some unburned fuel being present in the exhaust. If the centrifuge is powered off, the centrifuge slows down at 15rpm/tick(as long as no stress is being accrued from excess torque) and hot gas stored inside the engine is slowly flushed out to the exhaust down to 0 kPa. &lt;br /&gt;
&lt;br /&gt;
== Engine Speed / Stress ==&lt;br /&gt;
If the engine&#039;s temperature is above 300°C and was capable of combusting at least 30 J during the current tick, the engine produces torque, speeding up by 1 RPM/tick for every {{Overline|416.|6}} K of temperature (up to a maximum of 12 RPM/tick at 5000 K) in a frictionless environment, consuming 30 J*RPM gained from its internal atmosphere in the process. Friction slows the engine down by 1%/tick afterwards, making the engine reach a steady-state speed directly dependent on its temperature.&lt;br /&gt;
&lt;br /&gt;
If the engine speeds up or slows down at a rate slower than &amp;lt;code&amp;gt;min(1000/(RPM+500), 1.25)&amp;lt;/code&amp;gt; RPM/tick, its stress is reduced by 0.5%/tick. Otherwise, its stress is increased by &amp;lt;code&amp;gt;(abs(RPM delta) - 1) * min(1000/(RPM+500), 1.25)&amp;lt;/code&amp;gt; %/tick (which can go negative reducing stress faster than the 0.5%/tick you&#039;d get otherwise). The optimal acceleration/decceleration rate is 1 RPM/tick beyond the 0.5% stress/tick reduction curve, at which point no stress is gained or lost.&lt;br /&gt;
&lt;br /&gt;
If stress is at 100% or more, the centrifuge slows down by a whopping 40 RPM/tick. This can put the centrifuge&#039;s engine into a death spiral as the lower RPM leads to a higher net torque which can increase the stress rate even further, with the only way to resume operation being reducing the engine&#039;s internal temperature to a point it can start accelerating again in a controlled fashion. Because the engine only cools down if it has at least 30 J/tick of combustion still occuring within it, this can be difficult to achieve without turning the centrifuge off and waiting for all hot gas to be flushed into the exhaust.&lt;br /&gt;
&lt;br /&gt;
== Processing Speed ==&lt;br /&gt;
The speed at which the centrifuge processes items is directly proportional to how fast it is rotating. At 300 RPM, it process pure ores are refined at a rate of 1 second/item and [[Dirty Ore]] / [[Reagent Mix]] at a rate of 6 seconds/item. Excess progress is carried over to the next item processed.&lt;br /&gt;
&lt;br /&gt;
Using regular [[Fuel]], the Combustion Centrifuge can reach a bit higher than 500 RPM, making it just over 5 times faster than the regular [[Centrifuge]] at its max speed. The regular electric centrifuge will take 18 seconds to process a single piece of [[Dirty Ore]], while a Combustion Centrifuge at 515 RPM will take just 3.5 seconds. At full throttle, the centrifuge will take approximately 6.5 hours to deplete a [[Gas Canister (Smart)|Smart Canister]] filled with fuel.&amp;lt;!-- 18 MPa @ 20°C * 64 L = 472 mol = 6.555 h --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The speed of the Combustion Centrifuge can be boosted significantly by replacing the fuel mixture with a [[Fuel|Superfuel]] mixture. Using superfuel can boost the centrifuge to a steady-state maximum of 1188 RPM, processing ore at more than double the speed. This comes at the cost of ease of use, as storing Superfuel mixtures and [[Nitrous Oxide]] itself is difficult, the centrifuge can no longer safely eject items at that speed, and starting up the centrifuge also becomes more complex due to faster combustion.&lt;br /&gt;
&lt;br /&gt;
{{Data Network Header}}&lt;br /&gt;
{{Data Parameters|&lt;br /&gt;
{{Data Parameters/row|Power|Boolean|w=0|Can be read to return if the Combustion Centrifuge is correctly powered or not, set via the power system, return 1 if powered and 0 if not|multiple=2|0|Unpowered|1|Powered}}&lt;br /&gt;
{{Data Parameters/row|Open|Integer|1 if device is open, otherwise 0|multiple=2|0|Closed|1|Open}}&lt;br /&gt;
{{Data Parameters/row|Error|Boolean|w=0|1 if device is in error state, otherwise 0|multiple=2|0|&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;|1|Error}}&lt;br /&gt;
{{Data Parameters/row|Pressure|Float|w=0|The current pressure reading of the Combustion Centrifuge}}&lt;br /&gt;
{{Data Parameters/row|Temperature|Integer|w=0|The current temperature reading of the Combustion Centrifuge}}&lt;br /&gt;
{{Data Parameters/row|Lock|Boolean|Disable manual operation of the Combustion Centrifuge.|multiple=2|0|Unlocked|1|Locked}}&lt;br /&gt;
{{Data Parameters/row|Reagents|Integer|w=0|Total number of reagents recorded by the Combustion Centrifuge.  Max reagent capacity is 3000, at which time centrifuge will spin down and flash an error. IC/Logic required for automation, otherwise manual operation.}}&lt;br /&gt;
{{Data Parameters/row|RatioOxygen|Float|w=0|The ratio of [[Oxygen]] in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioCarbonDioxide|Float|w=0|The ratio of Carbon Dioxide in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioNitrogen|Float|w=0|The ratio of [[Nitrogen]] in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioPollutant|Float|w=0|The ratio of [[Pollutant]] in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioVolatiles|Float|w=0|The ratio of [[Volatiles]] in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioWater|Float|w=0|The ratio of [[Water]] in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|On|Boolean|The current state of the Combustion Centrifuge.|multiple=2|0|Off|1|On}}&lt;br /&gt;
{{Data Parameters/row|RequiredPower|Integer|w=0|Idle operating power quantity, does not necessarily include extra demand power}}&lt;br /&gt;
{{Data Parameters/row|ClearMemory|Integer|r=0|When set to 1, clears the counter memory (e.g. ExportCount). Will set itself back to 0 when actioned}}&lt;br /&gt;
{{Data Parameters/row|ExportCount|Integer|w=0|How many items exported since last ClearMemory}}&lt;br /&gt;
{{Data Parameters/row|ImportCount|Integer|w=0|How many items imported since last ClearMemory}}&lt;br /&gt;
{{Data Parameters/row|TotalMoles|Float|w=0|Returns the total moles of the Combustion Centrifuge}}&lt;br /&gt;
{{Data Parameters/row|RatioNitrousOxide|Float|w=0|The ratio of Nitrous Oxide in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|PrefabHash|Integer|w=0|The hash of the structure}}&lt;br /&gt;
{{Data Parameters/row|Combustion|Boolean|w=0|Assess if the atmosphere is on fire. Returns 1 if atmosphere is on fire, 0 if not.|0 or 1}}&lt;br /&gt;
{{Data Parameters/row|PressureInput|Float|w=0|The current pressure reading of the Combustion Centrifuge&#039;s Input Network}}&lt;br /&gt;
{{Data Parameters/row|TemperatureInput|Float|w=0|The current temperature reading of the Combustion Centrifuge&#039;s Input Network}}&lt;br /&gt;
{{Data Parameters/row|RatioOxygenInput|Float|w=0|The ratio of [[Oxygen]] in device&#039;s input network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioCarbonDioxideInput|Float|w=0|The ratio of Carbon Dioxide in device&#039;s input network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioNitrogenInput|Float|w=0|The ratio of [[Nitrogen]] in device&#039;s input network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioPollutantInput|Float|w=0|The ratio of [[Pollutant]] in device&#039;s input network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioVolatilesInput|Float|w=0|The ratio of [[Volatiles]] in device&#039;s input network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioWaterInput|Float|w=0|The ratio of [[Water]] in device&#039;s input network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioNitrousOxideInput|Float|w=0|The ratio of Nitrous Oxide in device&#039;s input network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|TotalMolesInput|Float|w=0|Returns the total moles of the Combustion Centrifuge&#039;s Input Network}}&lt;br /&gt;
{{Data Parameters/row|PressureOutput|Float|w=0|The current pressure reading of the Combustion Centrifuge&#039;s Output Network}}&lt;br /&gt;
{{Data Parameters/row|TemperatureOutput|Float|w=0|The current temperature reading of the Combustion Centrifuge&#039;s Output Network}}&lt;br /&gt;
{{Data Parameters/row|RatioOxygenOutput|Float|w=0|The ratio of [[Oxygen]] in device&#039;s Output network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioCarbonDioxideOutput|Float|w=0|The ratio of Carbon Dioxide in device&#039;s Output network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioNitrogenOutput|Float|w=0|The ratio of [[Nitrogen]] in device&#039;s Output network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioPollutantOutput|Float|w=0|The ratio of [[Pollutant]] in device&#039;s Output network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioVolatilesOutput|Float|w=0|The ratio of [[Volatiles]] in device&#039;s Output network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioWaterOutput|Float|w=0|The ratio of [[Water]] in device&#039;s Output network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioNitrousOxideOutput|Float|w=0|The ratio of Nitrous Oxide in device&#039;s Output network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|TotalMolesOutput|Float|w=0|Returns the total moles of the Combustion Centrifuge&#039;s Output Network}}&lt;br /&gt;
{{Data Parameters/row|CombustionInput|Boolean|w=0|Assess if the atmosphere is on fire. Returns 1 if device&#039;s input network is on fire, 0 if not.|0 or 1}}&lt;br /&gt;
{{Data Parameters/row|CombustionOutput|Boolean|w=0|Assess if the atmosphere is on fire. Returns 1 if device&#039;s Output network is on fire, 0 if not.|0 or 1}}&lt;br /&gt;
{{Data Parameters/row|CombustionLimiter|Integer|Retards the rate of combustion inside the machine (range: 0-100), with 0 being the slowest rate of combustion and 100 being the fastest}}&lt;br /&gt;
{{Data Parameters/row|Throttle|Integer|Increases the rate at which the machine works (range: 0-100)}}&lt;br /&gt;
{{Data Parameters/row|Rpm|Integer|w=0|The number of revolutions per minute that the Combustion Centrifuge&#039;s spinning mechanism is doing}}&lt;br /&gt;
{{Data Parameters/row|Stress|Integer|w=0|Machines get stressed when working hard. When Stress reaches 100 the machine will automatically shut down}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidNitrogen|Float|w=0|The ratio of Liquid Nitrogen in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidNitrogenInput|Float|w=0|The ratio of Liquid Nitrogen in device&#039;s input network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidNitrogenOutput|Float|w=0|The ratio of Liquid Nitrogen in device&#039;s Output network|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidOxygen|Float|w=0|The ratio of Liquid Oxygen in device&#039;s Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidOxygenInput|Float|w=0|The ratio of Liquid Oxygen in device&#039;s Input Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidOxygenOutput|Float|w=0|The ratio of Liquid Oxygen in Combustion Centrifuge&#039;s Output Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidVolatiles|Float|w=0|The ratio of Liquid Volatiles in device&#039;s Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidVolatilesInput|Float|w=0|The ratio of Liquid Volatiles in device&#039;s Input Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidVolatilesOutput|Float|w=0|The ratio of Liquid Volatiles in Combustion Centrifuge&#039;s Output Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioSteam|Float|w=0|The ratio of Steam in device&#039;s Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioSteamInput|Float|w=0|The ratio of Steam in device&#039;s Input Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioSteamOutput|Float|w=0|The ratio of Steam in Combustion Centrifuge&#039;s Output Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidCarbonDioxide|Float|w=0|The ratio of Liquid Carbon Dioxide in device&#039;s Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidCarbonDioxideInput|Float|w=0|The ratio of Liquid Carbon Dioxide in device&#039;s Input Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidCarbonDioxideOutput|Float|w=0|The ratio of Liquid Carbon Dioxide in Combustion Centrifuge&#039;s Output Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidPollutant|Float|w=0|The ratio of Liquid Pollutant in device&#039;s Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidPollutantInput|Float|w=0|The ratio of Liquid Pollutant in device&#039;s Input Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidPollutantOutput|Float|w=0|The ratio of Liquid Pollutant in Combustion Centrifuge&#039;s Output Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidNitrousOxide|Float|w=0|The ratio of Liquid Nitrous Oxide in device&#039;s Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidNitrousOxideInput|Float|w=0|The ratio of Liquid Nitrous Oxide in device&#039;s Input Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidNitrousOxideOutput|Float|w=0|The ratio of Liquid Nitrous Oxide in Combustion Centrifuge&#039;s Output Atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|ReferenceId|Integer|w=0|Unique Reference Identifier for this object}}&lt;br /&gt;
{{Data Parameters/row|RatioHydrogen|Float|w=0|DEPRECATED|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioLiquidHydrogen|Float|w=0|DEPRECATED|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|RatioPollutedWater|Float|w=0|The ratio of polluted water in device atmosphere|0.0 to 1.0}}&lt;br /&gt;
{{Data Parameters/row|NameHash|Integer|w=0|Provides the hash value for the name of the object as a 32 bit integer.}}&lt;br /&gt;
}}&lt;br /&gt;
{{Slots|logic=1&lt;br /&gt;
|{{Slots/row|name=Import|type=None}}&lt;br /&gt;
|{{Slots/row|name=Export|type=None}}&lt;br /&gt;
||{{Slots/row|name=Programmable Chip|type=ProgrammableChip}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Connections}}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Connection Name !! Index&lt;br /&gt;
|-&lt;br /&gt;
| [[Chute]] Input || 0&lt;br /&gt;
|-&lt;br /&gt;
| Chute Output || 1&lt;br /&gt;
|-&lt;br /&gt;
| Data || 2&lt;br /&gt;
|-&lt;br /&gt;
| [[Power]] || 3&lt;br /&gt;
|-&lt;br /&gt;
| Pipe Input || 4&lt;br /&gt;
|-&lt;br /&gt;
| Pipe Input || 5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
[https://steamcommunity.com/sharedfiles/filedetails/?id=3448074160 reference automation implementation by lisnaz]&lt;br /&gt;
[[Category:Machines]]&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=Biomass&amp;diff=28103</id>
		<title>Biomass</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=Biomass&amp;diff=28103"/>
		<updated>2026-09-07T04:33:52Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: update itembox template, replace quote with stationpedia template&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
{{Itembox&lt;br /&gt;
| name = Biomass&lt;br /&gt;
| image = [[File:ItemBiomass.png]]&lt;br /&gt;
| prefabhash = -831480639&lt;br /&gt;
| prefabname = ItemBiomass&lt;br /&gt;
| stacks = 100&lt;br /&gt;
| slot_class = SlotClass.Ore&lt;br /&gt;
| sorting_class = SortingClass.Resources&lt;br /&gt;
| recipe_machine1 = Centrifuge&lt;br /&gt;
| recipe_cost1 = 1 x [[Biomass]]&lt;br /&gt;
| usedwith    = &lt;br /&gt;
*[[Arc Furnace]]&lt;br /&gt;
*[[Furnace]]&lt;br /&gt;
*[[Advanced Furnace]]&lt;br /&gt;
*[[Portable Composter]]&lt;br /&gt;
*[[Advanced Composter]]&lt;br /&gt;
*[[Fermenter]]&lt;br /&gt;
}}{{Stationpedia|Diced organic material that is returned when food and organic matter is passed through the [[Recycler]] and [[Centrifuge]]. Can be burned in a [[Furnace]] into [[Charcoal]] for use in the [[Generator (Solid Fuel)]].}}&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
Biomass is made from organic matter (plants, seeds, food and decayed food) in two steps. A [[Recycler]] will turn organic matter into [[Reagent_Mix|reagent mix]], and a [[Centrifuge]] or furnace will turn this into biomass.&lt;br /&gt;
&lt;br /&gt;
Biomass can be turned into [[Charcoal]] in a furnace, [[Fertilizer]] in a [[Portable Composter|Portable]] or [[Advanced Composter]], or [[Alcohol]] in a [[Fermenter]]. If produced in a centrifuge, each unit of biomass will offgas 8 mols of {{GasIcon|Methane|Size=1.5em}} and 4 mols of {{GasIcon|Pollutant|Size=1.5em}} when processed in an [[Arc Furnace]] (turning it into Charcoal in the process) or inserted into a furnace with an internal temperature aboce 100°C. If the furnace is below {{Temperature|Temperature=580}} or 100 kPa when ejected, it will remain as biomass still usable in a composter or fermenter, but no longer offgas.&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=Biomass&amp;diff=28102</id>
		<title>Biomass</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=Biomass&amp;diff=28102"/>
		<updated>2026-09-07T04:30:07Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: add offgas information, use on fermenter&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
{{Itembox&lt;br /&gt;
| name = Biomass&lt;br /&gt;
| image = [[File:ItemBiomass.png]]&lt;br /&gt;
| prefabhash = -831480639&lt;br /&gt;
| prefabname = ItemBiomass&lt;br /&gt;
| stacks = 100&lt;br /&gt;
| slot_class = SlotClass.Ore&lt;br /&gt;
| sorting_class = SortingClass.Resources&lt;br /&gt;
| recipe_machine1 = Centrifuge&lt;br /&gt;
| recipe_cost1 = 1 x [[Biomass]]&lt;br /&gt;
| usedwith    = &lt;br /&gt;
*[[Arc Furnace]]&lt;br /&gt;
*[[Furnace]]&lt;br /&gt;
*[[Portable_Composter]]&lt;br /&gt;
*[[Advanced_Composter]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;q&amp;gt;Diced organic material that is returned when food and organic matter is passed through the [[Recycler]] and [[Centrifuge]]. Can be burned in a [[Furnace]] into [[Charcoal]] for use in the [[Solid Fuel Generator|Generator (Solid Fuel)]].&amp;lt;/q&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;- Stationpedia&#039;&#039;&#039;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
Biomass is made from organic matter (plants, seeds, food and decayed food) in two steps. A [[Recycler]] will turn organic matter into [[Reagent_Mix|reagent mix]], and a [[Centrifuge]] or furnace will turn this into biomass.&lt;br /&gt;
&lt;br /&gt;
Biomass can be turned into [[Charcoal]] in a furnace, [[Fertilizer]] in a [[Portable Composter|Portable]] or [[Advanced Composter]], or [[Alcohol]] in a [[Fermenter]]. If produced in a centrifuge, each unit of biomass will offgas 8 mols of {{GasIcon|Methane|Size=1.5em}} and 4 mols of {{GasIcon|Pollutant|Size=1.5em}} when processed in an [[Arc Furnace]] (turning it into Charcoal in the process) or inserted into a furnace with an internal temperature aboce 100°C. If the furnace is below {{Temperature|Temperature=580}} or 100 kPa when ejected, it will remain as biomass still usable in a composter or fermenter, but no longer offgas.&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=Fermenter&amp;diff=28101</id>
		<title>Fermenter</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=Fermenter&amp;diff=28101"/>
		<updated>2026-09-07T02:50:06Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: Space analysis rules out corn and puts switchgrass/watermelon fairly close together.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Atmospherics]]&lt;br /&gt;
{{Structurebox&lt;br /&gt;
 | name             = Fermenter&lt;br /&gt;
 | image            = [[File:ItemKitAtmospherics.png]]&lt;br /&gt;
 | prefab_hash       = 1103525139&lt;br /&gt;
 | power_usage      = 10-210w&lt;br /&gt;
 | placed_with_item = [[Kit (Atmospherics)]]&lt;br /&gt;
 | placed_on_grid   = Small Grid&lt;br /&gt;
 | requires_frames  = Yes&lt;br /&gt;
&lt;br /&gt;
 | stage_image1     = [[File:StructureFermenter_BuildState0.png]]&lt;br /&gt;
 | const_with_item1 = 2 x [[Kit (Pipe)]]&lt;br /&gt;
 | decon_with_tool1 = [[Hand Drill]]&lt;br /&gt;
 | item_rec1        = [[Kit (Atmospherics)]]&lt;br /&gt;
&lt;br /&gt;
 | stage_image2     = [[File:StructureFermenter_BuildState1.png]]&lt;br /&gt;
 | const_with_tool2 = [[Welding Torch]]&lt;br /&gt;
 | const_with_item2 = 5 x [[Steel Sheets]]&lt;br /&gt;
 | decon_with_tool2 = [[Wrench]]&lt;br /&gt;
 | item_rec2        = 2 x [[Kit (Pipe)]]&lt;br /&gt;
&lt;br /&gt;
 | stage_image3     = [[File:StructureFermenter.png]]&lt;br /&gt;
 | decon_with_tool3 = [[Angle Grinder]]&lt;br /&gt;
 | item_rec3        = 5 x [[Steel Sheets]]&lt;br /&gt;
|paintable=Yes|constructable_in_rockets=No|prefab_name=StructureFermenter|airtight=No}}&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
The Fermenter is a machine that converts bioproducts into [[Alcohol]] and [[Polluted Water]].&lt;br /&gt;
&lt;br /&gt;
It consumes 10 W when idle, and 210 W when processing items (taking 20 seconds per item).&lt;br /&gt;
&lt;br /&gt;
== Conversion rates ==&lt;br /&gt;
Different inputs result in different processing rates, shown as follows:&lt;br /&gt;
&amp;lt;onlyinclude&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+Conversion Rate Table&lt;br /&gt;
!Input&lt;br /&gt;
![[Alcohol]] / unit (Moles)&lt;br /&gt;
![[Polluted Water]] / unit (Moles)&lt;br /&gt;
!Alcohol / Harvest (Moles)&lt;br /&gt;
!Polluted Water / Harvest (Moles)&lt;br /&gt;
|-&lt;br /&gt;
|[[Decayed Food]]&lt;br /&gt;
|1&lt;br /&gt;
|0.05&lt;br /&gt;
|N/A&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|Seeds (Any)&lt;br /&gt;
|6&lt;br /&gt;
|0.3&lt;br /&gt;
|6&lt;br /&gt;
|0.3&lt;br /&gt;
|-&lt;br /&gt;
|[[Biomass]]&lt;br /&gt;
|10&lt;br /&gt;
|1&lt;br /&gt;
|N/A&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|[[Blueberry]]&lt;br /&gt;
|18&lt;br /&gt;
|0.9&lt;br /&gt;
|36&lt;br /&gt;
|1.8&lt;br /&gt;
|-&lt;br /&gt;
|[[Cocoa]]&lt;br /&gt;
|6&lt;br /&gt;
|0.3&lt;br /&gt;
|18&lt;br /&gt;
|0.9&lt;br /&gt;
|-&lt;br /&gt;
|[[Corn]]&lt;br /&gt;
|40&lt;br /&gt;
|2&lt;br /&gt;
|120&lt;br /&gt;
|6&lt;br /&gt;
|-&lt;br /&gt;
|[[Darga Fern]]&lt;br /&gt;
|2&lt;br /&gt;
|0.1&lt;br /&gt;
|6&lt;br /&gt;
|0.3&lt;br /&gt;
|-&lt;br /&gt;
|[[Fern]]&lt;br /&gt;
|2&lt;br /&gt;
|0.1&lt;br /&gt;
|4&lt;br /&gt;
|0.2&lt;br /&gt;
|-&lt;br /&gt;
|[[Hades Flower]]&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|[[Switchgrass|Hay]]&lt;br /&gt;
|3&lt;br /&gt;
|0.15&lt;br /&gt;
|45&lt;br /&gt;
|3&lt;br /&gt;
|-&lt;br /&gt;
|[[Mushroom]]&lt;br /&gt;
|2&lt;br /&gt;
|0.1&lt;br /&gt;
|6&lt;br /&gt;
|0.3&lt;br /&gt;
|-&lt;br /&gt;
|[[Potato]]&lt;br /&gt;
|8&lt;br /&gt;
|0.4&lt;br /&gt;
|16&lt;br /&gt;
|0.8&lt;br /&gt;
|-&lt;br /&gt;
|[[Pumpkin]]&lt;br /&gt;
|18&lt;br /&gt;
|0.9&lt;br /&gt;
|54&lt;br /&gt;
|2.7&lt;br /&gt;
|-&lt;br /&gt;
|[[Rice]]&lt;br /&gt;
|8&lt;br /&gt;
|0.4&lt;br /&gt;
|40&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|[[Soybean]]&lt;br /&gt;
|6&lt;br /&gt;
|0.3&lt;br /&gt;
|18&lt;br /&gt;
|0.9&lt;br /&gt;
|-&lt;br /&gt;
|[[Sugarcane]]&lt;br /&gt;
|15&lt;br /&gt;
|0.75&lt;br /&gt;
|45&lt;br /&gt;
|3&lt;br /&gt;
|-&lt;br /&gt;
|[[Strawberry]]&lt;br /&gt;
|12&lt;br /&gt;
|0.6&lt;br /&gt;
|36&lt;br /&gt;
|1.8&lt;br /&gt;
|-&lt;br /&gt;
|[[Tomato]]&lt;br /&gt;
|12&lt;br /&gt;
|0.6&lt;br /&gt;
|36&lt;br /&gt;
|1.8&lt;br /&gt;
|-&lt;br /&gt;
|[[Watermelon]]&lt;br /&gt;
|40&lt;br /&gt;
|2&lt;br /&gt;
|40&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|[[Wheat]]&lt;br /&gt;
|6&lt;br /&gt;
|0.3&lt;br /&gt;
|30&lt;br /&gt;
|1.5&lt;br /&gt;
|-&lt;br /&gt;
|[[Winterspawn]]&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/onlyinclude&amp;gt;Outputs for plants and seeds are created at 29°C, and have their polluted water contents at exactly 5% of their produced alcohol. Biomass is the only exception to this rule, generating 10% of their produced alcohol as water.&lt;br /&gt;
Most [[plants]] benefit from being converted into [[Biomass]] first by processing them at a [[Recycler]] and [[Centrifuge]] before fermentation, although some exceptions exist. Corn and Watermelon produce more water and alcohol by being directly processed, while Blueberry, Pumpkin, Sugarcane, and Strawberry produce more alcohol (but not water) by being directly processed. If alcohol combustion byproducts are taken into account, they also produce more water by being directly procesed as well.&lt;br /&gt;
&lt;br /&gt;
== Production Optimization ==&lt;br /&gt;
From the conversion rate table, Pareto-optimal plants are [[Switchgrass]] (highest harvest after conversion to biomass), [[Corn]] (Highest unprocessed harvest), and [[Watermelon]] (Highest output/h on max yield fertilizer). A fermenter takes 20 seconds to process an item for a total of 180 items/hour, potentially diminishing the effectiveness of switchgrass because the output of as little as 5 plants is enough to saturate a fermenter. However, [[Fertilizer]] production requirements introduce overhead.&lt;br /&gt;
&lt;br /&gt;
Because Hay is counted as biomass instead of food, it contributes towards growth cycles when used in an [[Advanced Composter]]. As such, max yield fertilizer production is best done using Wheat as input stock for food.&lt;br /&gt;
&lt;br /&gt;
An advanced composter consumes 180 items/hour and 1.2 kmols of water to produce 60 fertilizer, 3kmol of Nitrogen and 3kmol of Methane. Stacks of fertilizer with different properties can be merged to achieve a mixture of ratio properties after fertilizer production, but at this point no analysis has been made on whether this achieves better production per plot.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Plant production data&lt;br /&gt;
!Plant&lt;br /&gt;
!Time between harvests(Base)&lt;br /&gt;
!Alcohol/harvest&lt;br /&gt;
!Harvest Cycles/h(Base)&lt;br /&gt;
!Items/Hour/Plot(Base)&lt;br /&gt;
!Fertilizer/hour/Plot&lt;br /&gt;
|-&lt;br /&gt;
|Switchgrass&lt;br /&gt;
|1332&lt;br /&gt;
|150 (no fertilizer use)&lt;br /&gt;
|{{Overline|2.|702}}&lt;br /&gt;
|{{Overline|40.|540}}&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Wheat&lt;br /&gt;
|2700&lt;br /&gt;
|0 (used for fertilizer)&lt;br /&gt;
|{{Overline|1.|3}}&lt;br /&gt;
|{{Overline|5.|3}} ({{Overline|8.|6}} on max yield fertilizer)&lt;br /&gt;
|{{Overline|1.|7}} ({{Overline|2.|8}} before self-use)&lt;br /&gt;
|-&lt;br /&gt;
|Watermelon&lt;br /&gt;
|3000&lt;br /&gt;
|120 (max yield fertilizer)&lt;br /&gt;
|1.2&lt;br /&gt;
|3.6&lt;br /&gt;
| -0.6 (2 cycles)&lt;br /&gt;
|-&lt;br /&gt;
|Corn (mature)&lt;br /&gt;
|5400&lt;br /&gt;
|160 (max yield fertilizer)&lt;br /&gt;
|{{Overline|0.|6}}&lt;br /&gt;
|{{Overline|2.|6}}&lt;br /&gt;
| -{{Overline|0.|3}} (2 cycles)&lt;br /&gt;
|-&lt;br /&gt;
|Corn (seeding)&lt;br /&gt;
|7200&lt;br /&gt;
|200 (max yield fertilizer)&lt;br /&gt;
|0.5&lt;br /&gt;
|2.5&lt;br /&gt;
| -0.25 (2 cycles)&lt;br /&gt;
|}&lt;br /&gt;
Some Pareto-optimal fertilizer mixes are as follows:&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+Fertilizer mixes&lt;br /&gt;
!Food Ratio&lt;br /&gt;
!Biomass Ratio&lt;br /&gt;
!Decayed Food Ratio&lt;br /&gt;
!Additional Yield&lt;br /&gt;
!Growth Cycles&lt;br /&gt;
!Growth Speed Boost&lt;br /&gt;
|-&lt;br /&gt;
|0%&lt;br /&gt;
|100%&lt;br /&gt;
|0%&lt;br /&gt;
|1&lt;br /&gt;
|7&lt;br /&gt;
|0%&lt;br /&gt;
|-&lt;br /&gt;
|0%&lt;br /&gt;
|12/15&lt;br /&gt;
|3/15&lt;br /&gt;
|1&lt;br /&gt;
|6&lt;br /&gt;
|5%&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |...&lt;br /&gt;
|-&lt;br /&gt;
|0%&lt;br /&gt;
|0%&lt;br /&gt;
|100%&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|25%&lt;br /&gt;
|-&lt;br /&gt;
|5/15&lt;br /&gt;
|9/15&lt;br /&gt;
|1/15&lt;br /&gt;
|2&lt;br /&gt;
|5&lt;br /&gt;
|{{Overline|1.|6}}%&lt;br /&gt;
|-&lt;br /&gt;
|5/15&lt;br /&gt;
|6/15&lt;br /&gt;
|4/15&lt;br /&gt;
|2&lt;br /&gt;
|4&lt;br /&gt;
|{{Overline|6.|6}}%&lt;br /&gt;
|-&lt;br /&gt;
|5/15&lt;br /&gt;
|3/15&lt;br /&gt;
|7/15&lt;br /&gt;
|2&lt;br /&gt;
|3&lt;br /&gt;
|{{Overline|11.|6}}%&lt;br /&gt;
|-&lt;br /&gt;
|5/15&lt;br /&gt;
|0/15&lt;br /&gt;
|10/15&lt;br /&gt;
|2&lt;br /&gt;
|2&lt;br /&gt;
|{{Overline|16.|6}}%&lt;br /&gt;
|}&lt;br /&gt;
An alternative way to think about the problem is by considering the space taken by a fermenter. Each fermenter takes up 6-12 plots of space depending on layout. 4 fermenters fully loaded with biomass take up 48 plots + 17.76 (rounded to 18) plots for switchgrass growth. In order to be more efficient, corn/watermelon production would need to saturate a single fermenter (12 plots) with 180 crops/hour. This leaves 66 plots available for plants, which need to produce 180 crops/hour for a minimum of {{Overline|2.|72}} crops/hour, ruling out corn entirely as it can&#039;t achieve the equivalent production even with no area taken by fertilizer production. Unfertilized wheat can produce {{Overline|28.|4}} fertilizer/h for a total of 56 cycles.&lt;br /&gt;
&lt;br /&gt;
Watermelon needs 50 plots, leaving 16 plots available for fertilizer production, which themselves need to produce at least 60 cycles of fertilizer/h (more if using fertilizer on fertilizer-producing plants). Mixing in a small amount of hay, fertilizer effectiveness can be increased, but not by enough to overcome a more compact fermenter arrangement as reducing space taken by each fermenter to ~9 plots is enough to nullify the advantage if power consumption is not priced in.&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=Fermenter&amp;diff=28099</id>
		<title>Fermenter</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=Fermenter&amp;diff=28099"/>
		<updated>2026-09-06T22:48:04Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: /* Production Optimization */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Atmospherics]]&lt;br /&gt;
{{Structurebox&lt;br /&gt;
 | name             = Fermenter&lt;br /&gt;
 | image            = [[File:ItemKitAtmospherics.png]]&lt;br /&gt;
 | prefab_hash       = 1103525139&lt;br /&gt;
 | power_usage      = 10-210w&lt;br /&gt;
 | placed_with_item = [[Kit (Atmospherics)]]&lt;br /&gt;
 | placed_on_grid   = Small Grid&lt;br /&gt;
 | requires_frames  = Yes&lt;br /&gt;
&lt;br /&gt;
 | stage_image1     = [[File:StructureFermenter_BuildState0.png]]&lt;br /&gt;
 | const_with_item1 = 2 x [[Kit (Pipe)]]&lt;br /&gt;
 | decon_with_tool1 = [[Hand Drill]]&lt;br /&gt;
 | item_rec1        = [[Kit (Atmospherics)]]&lt;br /&gt;
&lt;br /&gt;
 | stage_image2     = [[File:StructureFermenter_BuildState1.png]]&lt;br /&gt;
 | const_with_tool2 = [[Welding Torch]]&lt;br /&gt;
 | const_with_item2 = 5 x [[Steel Sheets]]&lt;br /&gt;
 | decon_with_tool2 = [[Wrench]]&lt;br /&gt;
 | item_rec2        = 2 x [[Kit (Pipe)]]&lt;br /&gt;
&lt;br /&gt;
 | stage_image3     = [[File:StructureFermenter.png]]&lt;br /&gt;
 | decon_with_tool3 = [[Angle Grinder]]&lt;br /&gt;
 | item_rec3        = 5 x [[Steel Sheets]]&lt;br /&gt;
|paintable=Yes|constructable_in_rockets=No|prefab_name=StructureFermenter|airtight=No}}&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
The Fermenter is a machine that converts bioproducts into [[Alcohol]] and [[Polluted Water]].&lt;br /&gt;
&lt;br /&gt;
It consumes 10 W when idle, and 210 W when processing items (taking 20 seconds per item).&lt;br /&gt;
&lt;br /&gt;
== Conversion rates ==&lt;br /&gt;
Different inputs result in different processing rates, shown as follows:&lt;br /&gt;
&amp;lt;onlyinclude&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+Conversion Rate Table&lt;br /&gt;
!Input&lt;br /&gt;
![[Alcohol]] / unit (Moles)&lt;br /&gt;
![[Polluted Water]] / unit (Moles)&lt;br /&gt;
!Alcohol / Harvest (Moles)&lt;br /&gt;
!Polluted Water / Harvest (Moles)&lt;br /&gt;
|-&lt;br /&gt;
|[[Decayed Food]]&lt;br /&gt;
|1&lt;br /&gt;
|0.05&lt;br /&gt;
|N/A&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|Seeds (Any)&lt;br /&gt;
|6&lt;br /&gt;
|0.3&lt;br /&gt;
|6&lt;br /&gt;
|0.3&lt;br /&gt;
|-&lt;br /&gt;
|[[Biomass]]&lt;br /&gt;
|10&lt;br /&gt;
|1&lt;br /&gt;
|N/A&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|[[Blueberry]]&lt;br /&gt;
|18&lt;br /&gt;
|0.9&lt;br /&gt;
|36&lt;br /&gt;
|1.8&lt;br /&gt;
|-&lt;br /&gt;
|[[Cocoa]]&lt;br /&gt;
|6&lt;br /&gt;
|0.3&lt;br /&gt;
|18&lt;br /&gt;
|0.9&lt;br /&gt;
|-&lt;br /&gt;
|[[Corn]]&lt;br /&gt;
|40&lt;br /&gt;
|2&lt;br /&gt;
|120&lt;br /&gt;
|6&lt;br /&gt;
|-&lt;br /&gt;
|[[Darga Fern]]&lt;br /&gt;
|2&lt;br /&gt;
|0.1&lt;br /&gt;
|6&lt;br /&gt;
|0.3&lt;br /&gt;
|-&lt;br /&gt;
|[[Fern]]&lt;br /&gt;
|2&lt;br /&gt;
|0.1&lt;br /&gt;
|4&lt;br /&gt;
|0.2&lt;br /&gt;
|-&lt;br /&gt;
|[[Hades Flower]]&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|[[Switchgrass|Hay]]&lt;br /&gt;
|3&lt;br /&gt;
|0.15&lt;br /&gt;
|45&lt;br /&gt;
|3&lt;br /&gt;
|-&lt;br /&gt;
|[[Mushroom]]&lt;br /&gt;
|2&lt;br /&gt;
|0.1&lt;br /&gt;
|6&lt;br /&gt;
|0.3&lt;br /&gt;
|-&lt;br /&gt;
|[[Potato]]&lt;br /&gt;
|8&lt;br /&gt;
|0.4&lt;br /&gt;
|16&lt;br /&gt;
|0.8&lt;br /&gt;
|-&lt;br /&gt;
|[[Pumpkin]]&lt;br /&gt;
|18&lt;br /&gt;
|0.9&lt;br /&gt;
|54&lt;br /&gt;
|2.7&lt;br /&gt;
|-&lt;br /&gt;
|[[Rice]]&lt;br /&gt;
|8&lt;br /&gt;
|0.4&lt;br /&gt;
|40&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|[[Soybean]]&lt;br /&gt;
|6&lt;br /&gt;
|0.3&lt;br /&gt;
|18&lt;br /&gt;
|0.9&lt;br /&gt;
|-&lt;br /&gt;
|[[Sugarcane]]&lt;br /&gt;
|15&lt;br /&gt;
|0.75&lt;br /&gt;
|45&lt;br /&gt;
|3&lt;br /&gt;
|-&lt;br /&gt;
|[[Strawberry]]&lt;br /&gt;
|12&lt;br /&gt;
|0.6&lt;br /&gt;
|36&lt;br /&gt;
|1.8&lt;br /&gt;
|-&lt;br /&gt;
|[[Tomato]]&lt;br /&gt;
|12&lt;br /&gt;
|0.6&lt;br /&gt;
|36&lt;br /&gt;
|1.8&lt;br /&gt;
|-&lt;br /&gt;
|[[Watermelon]]&lt;br /&gt;
|40&lt;br /&gt;
|2&lt;br /&gt;
|40&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|[[Wheat]]&lt;br /&gt;
|6&lt;br /&gt;
|0.3&lt;br /&gt;
|30&lt;br /&gt;
|1.5&lt;br /&gt;
|-&lt;br /&gt;
|[[Winterspawn]]&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/onlyinclude&amp;gt;Outputs for plants and seeds are created at 29°C, and have their polluted water contents at exactly 5% of their produced alcohol. Biomass is the only exception to this rule, generating 10% of their produced alcohol as water.&lt;br /&gt;
Most [[plants]] benefit from being converted into [[Biomass]] first by processing them at a [[Recycler]] and [[Centrifuge]] before fermentation, although some exceptions exist. Corn and Watermelon produce more water and alcohol by being directly processed, while Blueberry, Pumpkin, Sugarcane, and Strawberry produce more alcohol (but not water) by being directly processed. If alcohol combustion byproducts are taken into account, they also produce more water by being directly procesed as well.&lt;br /&gt;
&lt;br /&gt;
== Production Optimization ==&lt;br /&gt;
From the conversion rate table, Pareto-optimal plants are [[Switchgrass]] (highest harvest after conversion to biomass), [[Corn]] (Highest unprocessed harvest), and [[Watermelon]] (Highest output/h on max yield fertilizer). A fermenter takes 20 seconds to process an item for a total of 180 items/hour, potentially diminishing the effectiveness of switchgrass because the output of as little as 5 plants is enough to saturate a fermenter. However, [[Fertilizer]] production requirements introduce overhead.&lt;br /&gt;
&lt;br /&gt;
Because Hay is counted as biomass instead of food, it contributes towards growth cycles when used in an [[Advanced Composter]]. As such, max yield fertilizer production is best done using Wheat as input stock for food.&lt;br /&gt;
&lt;br /&gt;
An advanced composter consumes 180 items/hour and 1.2 kmols of water to produce 60 fertilizer, 3kmol of Nitrogen and 3kmol of Methane. Stacks of fertilizer with different properties can be merged to achieve a mixture of ratio properties after fertilizer production, but at this point no analysis has been made on whether this achieves better production per plot.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Plant production data&lt;br /&gt;
!Plant&lt;br /&gt;
!Time between harvests(Base)&lt;br /&gt;
!Alcohol/harvest&lt;br /&gt;
!Harvest Cycles/h(Base)&lt;br /&gt;
!Items/Hour/Plot(Base)&lt;br /&gt;
!Fertilizer/hour/Plot&lt;br /&gt;
|-&lt;br /&gt;
|Switchgrass&lt;br /&gt;
|1332&lt;br /&gt;
|150 (no fertilizer use)&lt;br /&gt;
|{{Overline|2.|702}}&lt;br /&gt;
|{{Overline|40.|540}}&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Wheat&lt;br /&gt;
|2700&lt;br /&gt;
|0 (used for fertilizer)&lt;br /&gt;
|{{Overline|1.|3}}&lt;br /&gt;
|{{Overline|5.|3}} ({{Overline|8.|6}} on max yield fertilizer)&lt;br /&gt;
|{{Overline|1.|7}} ({{Overline|2.|8}} before self-use)&lt;br /&gt;
|-&lt;br /&gt;
|Watermelon&lt;br /&gt;
|3000&lt;br /&gt;
|120 (max yield fertilizer)&lt;br /&gt;
|1.2&lt;br /&gt;
|3.6&lt;br /&gt;
| -0.6 (2 cycles)&lt;br /&gt;
|-&lt;br /&gt;
|Corn (mature)&lt;br /&gt;
|5400&lt;br /&gt;
|160 (max yield fertilizer)&lt;br /&gt;
|{{Overline|0.|6}}&lt;br /&gt;
|{{Overline|2.|6}}&lt;br /&gt;
| -{{Overline|0.|3}} (2 cycles)&lt;br /&gt;
|-&lt;br /&gt;
|Corn (seeding)&lt;br /&gt;
|7200&lt;br /&gt;
|200 (max yield fertilizer)&lt;br /&gt;
|0.5&lt;br /&gt;
|2.5&lt;br /&gt;
| -0.25 (2 cycles)&lt;br /&gt;
|}&lt;br /&gt;
Some Pareto-optimal fertilizer mixes are as follows:&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+Fertilizer mixes&lt;br /&gt;
!Food Ratio&lt;br /&gt;
!Biomass Ratio&lt;br /&gt;
!Decayed Food Ratio&lt;br /&gt;
!Additional Yield&lt;br /&gt;
!Growth Cycles&lt;br /&gt;
!Growth Speed Boost&lt;br /&gt;
|-&lt;br /&gt;
|0%&lt;br /&gt;
|100%&lt;br /&gt;
|0%&lt;br /&gt;
|1&lt;br /&gt;
|7&lt;br /&gt;
|0%&lt;br /&gt;
|-&lt;br /&gt;
|0%&lt;br /&gt;
|12/15&lt;br /&gt;
|3/15&lt;br /&gt;
|1&lt;br /&gt;
|6&lt;br /&gt;
|5%&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |...&lt;br /&gt;
|-&lt;br /&gt;
|0%&lt;br /&gt;
|0%&lt;br /&gt;
|100%&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|25%&lt;br /&gt;
|-&lt;br /&gt;
|5/15&lt;br /&gt;
|9/15&lt;br /&gt;
|1/15&lt;br /&gt;
|2&lt;br /&gt;
|5&lt;br /&gt;
|{{Overline|1.|6}}%&lt;br /&gt;
|-&lt;br /&gt;
|5/15&lt;br /&gt;
|6/15&lt;br /&gt;
|4/15&lt;br /&gt;
|2&lt;br /&gt;
|4&lt;br /&gt;
|{{Overline|6.|6}}%&lt;br /&gt;
|-&lt;br /&gt;
|5/15&lt;br /&gt;
|3/15&lt;br /&gt;
|7/15&lt;br /&gt;
|2&lt;br /&gt;
|3&lt;br /&gt;
|{{Overline|11.|6}}%&lt;br /&gt;
|-&lt;br /&gt;
|5/15&lt;br /&gt;
|0/15&lt;br /&gt;
|10/15&lt;br /&gt;
|2&lt;br /&gt;
|2&lt;br /&gt;
|{{Overline|16.|6}}%&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=Fertilizer&amp;diff=28098</id>
		<title>Fertilizer</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=Fertilizer&amp;diff=28098"/>
		<updated>2026-09-06T09:13:44Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: basically rewrite article&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;small&amp;gt;Accurate as of the Power Line Update (Q3 2026).&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
Fertilizer makes plants grow faster and produce more. It can be made in the [[Portable_Composter|Portable Composter]] or [[Kit_(Advanced_Composter)|Advanced Composter]].&lt;br /&gt;
==Composition==&lt;br /&gt;
Each fertilizer is made from 3 ingredients, which can be any combination of [[Biomass|biomass]], [[Decayed_food|decayed food]] or food (raw or cooked). When more than 3 ingredients have been added to a composter, the fertilizer will be based on the weighted average of the inputs. Each type of ingredient has its own effect on the end result:&lt;br /&gt;
 Cycles = 2 + 5*Biomass Ratio&lt;br /&gt;
 Yield Boost = 1 + 1.5*Food Ratio&lt;br /&gt;
 Growth Speed Multiplier = 1x + 0.25x*Decayed Food Ratio &lt;br /&gt;
Hay harvested from [[Switchgrass]] is counted as biomass instead of food.&lt;br /&gt;
&lt;br /&gt;
Merging two stacks of different fertilizers will cause the resulting fertilizer&#039;s stats to be a non-weighted average of both fertilizer stack stats.&lt;br /&gt;
&lt;br /&gt;
== Application ==&lt;br /&gt;
1 Cycle of fertilizer is consumed from a tray when a new plant is planted or perennial plant is harvested, applying the fertilizer&#039;s effect to the plant for its growth cycle. If the number of cycles remaining in the fertilizer after this is less than 1, the fertilizer is destroyed and needs to be re-added before a new planting or perennial harvest in order to apply effects to future plants/perennial growth cycles.&lt;br /&gt;
&lt;br /&gt;
Adding fertilizer to a tray with an existing plant doesn&#039;t apply fertilizer to it and doesn&#039;t consume a fertilizer cycle.&lt;br /&gt;
&lt;br /&gt;
When fertilizer is applied to a plant, the yield boost stat is rounded, with 0.5 rounding to the nearest even number (banker&#039;s rounding), and the number of plants created during transition to the harvest stage is increased by the rounded amount. As an example, with a rounded yield boost of 2, Switchgrass&#039;s yield changes from 15 to 17 hay, but [[Watermelon]] yield changes from 1 to 3 watermelons. The original plant yield boost stat is retained if the fertilizer is removed from a tray(by disassembling it).&lt;br /&gt;
&lt;br /&gt;
== Optimization ==&lt;br /&gt;
Because of the yield boost rounding mechanics, there are only two optimal ratios for food in a composter: 0% (increasing yield by 1) and 1/3(increasing yield by 2).&lt;br /&gt;
&lt;br /&gt;
Because of the cycles mechanic, there are 6 optimal ratios for biomass: 0% (2 cycles),  20%(3 cycles), 40% (4 cycles), 60%(5 cycles), 80% (6 cycles) and 100%(7 cycles).&lt;br /&gt;
&lt;br /&gt;
The remaining ratio after yield/cycles ratio choices should be filled with decayed food.&lt;br /&gt;
&lt;br /&gt;
Wheat is the best plant for fertilizer food production. Switchgrass is the best plant for biomass and decayed food production due to its higher yield/time.&lt;br /&gt;
&lt;br /&gt;
==Producing decayed food==&lt;br /&gt;
The following conditions gave the shortest decay times.&lt;br /&gt;
* Gas: Pollutant&lt;br /&gt;
* Pressure: &amp;lt;0.2 kPa&lt;br /&gt;
* Temperature: &amp;gt;200 °C&lt;br /&gt;
* Cooked food decays slightly faster than raw&lt;br /&gt;
A [[Fridge Small]] can be used instead of building a room with this type of atmosphere. Gas at very low pressures can&#039;t be heated by a [[Pipe Heater]], the gas should be heated before reducing its pressure.&lt;br /&gt;
&lt;br /&gt;
An alternative is passing decayable food through a [[SDB Silo]], which turns it into decayed food on exit.&lt;br /&gt;
&lt;br /&gt;
== Base growth times for plants ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Plant&lt;br /&gt;
!Planting -&amp;gt; Mature (s)&lt;br /&gt;
!Mature -&amp;gt; Seeding (s)&lt;br /&gt;
!Harvest -&amp;gt; Mature (s)&lt;br /&gt;
|-&lt;br /&gt;
|Switchgrass&lt;br /&gt;
|4130&lt;br /&gt;
|666&lt;br /&gt;
|1332&lt;br /&gt;
|-&lt;br /&gt;
|Strawberry&lt;br /&gt;
|15000&lt;br /&gt;
|3000&lt;br /&gt;
|3000&lt;br /&gt;
|-&lt;br /&gt;
|Tomato&lt;br /&gt;
|11700&lt;br /&gt;
|2700&lt;br /&gt;
|2700&lt;br /&gt;
|-&lt;br /&gt;
|Blueberry&lt;br /&gt;
|15600&lt;br /&gt;
|3000&lt;br /&gt;
|3000&lt;br /&gt;
|-&lt;br /&gt;
|Watermelon&lt;br /&gt;
|15600&lt;br /&gt;
|3000&lt;br /&gt;
|3000&lt;br /&gt;
|-&lt;br /&gt;
|Potato&lt;br /&gt;
|3000&lt;br /&gt;
|1000&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|Corn&lt;br /&gt;
|5400&lt;br /&gt;
|1800&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|Darga Fern&lt;br /&gt;
|3600&lt;br /&gt;
|1200&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|Fern&lt;br /&gt;
|2400&lt;br /&gt;
|800&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|Cocoa&lt;br /&gt;
|15000&lt;br /&gt;
|2100&lt;br /&gt;
|6300&lt;br /&gt;
|-&lt;br /&gt;
|Sugarcane&lt;br /&gt;
|3330&lt;br /&gt;
|666&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|Wheat&lt;br /&gt;
|2700&lt;br /&gt;
|900&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|Soybean&lt;br /&gt;
|3600&lt;br /&gt;
|1200&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|Rice&lt;br /&gt;
|3600&lt;br /&gt;
|1200&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|Pumpkin&lt;br /&gt;
|14400&lt;br /&gt;
|2400&lt;br /&gt;
|7200&lt;br /&gt;
|-&lt;br /&gt;
|Mushroom&lt;br /&gt;
|3600&lt;br /&gt;
|4800&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|Winterspawn Alpha&lt;br /&gt;
|2160&lt;br /&gt;
|720&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|Winterspawn Beta&lt;br /&gt;
|3600&lt;br /&gt;
|1200&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|Hades Flower (Both)&lt;br /&gt;
|2160&lt;br /&gt;
|720&lt;br /&gt;
|N/A&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=Fermenter&amp;diff=28097</id>
		<title>Fermenter</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=Fermenter&amp;diff=28097"/>
		<updated>2026-09-06T07:57:46Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: /* Production Optimization */ add fertilizer yield rounding. this complicates things further and i&amp;#039;ll want to work on the fertilizer page.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Atmospherics]]&lt;br /&gt;
{{Structurebox&lt;br /&gt;
 | name             = Fermenter&lt;br /&gt;
 | image            = [[File:ItemKitAtmospherics.png]]&lt;br /&gt;
 | prefab_hash       = 1103525139&lt;br /&gt;
 | power_usage      = 10-210w&lt;br /&gt;
 | placed_with_item = [[Kit (Atmospherics)]]&lt;br /&gt;
 | placed_on_grid   = Small Grid&lt;br /&gt;
 | requires_frames  = Yes&lt;br /&gt;
&lt;br /&gt;
 | stage_image1     = [[File:StructureFermenter_BuildState0.png]]&lt;br /&gt;
 | const_with_item1 = 2 x [[Kit (Pipe)]]&lt;br /&gt;
 | decon_with_tool1 = [[Hand Drill]]&lt;br /&gt;
 | item_rec1        = [[Kit (Atmospherics)]]&lt;br /&gt;
&lt;br /&gt;
 | stage_image2     = [[File:StructureFermenter_BuildState1.png]]&lt;br /&gt;
 | const_with_tool2 = [[Welding Torch]]&lt;br /&gt;
 | const_with_item2 = 5 x [[Steel Sheets]]&lt;br /&gt;
 | decon_with_tool2 = [[Wrench]]&lt;br /&gt;
 | item_rec2        = 2 x [[Kit (Pipe)]]&lt;br /&gt;
&lt;br /&gt;
 | stage_image3     = [[File:StructureFermenter.png]]&lt;br /&gt;
 | decon_with_tool3 = [[Angle Grinder]]&lt;br /&gt;
 | item_rec3        = 5 x [[Steel Sheets]]&lt;br /&gt;
|paintable=Yes|constructable_in_rockets=No|prefab_name=StructureFermenter|airtight=No}}&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
The Fermenter is a machine that converts bioproducts into [[Alcohol]] and [[Polluted Water]].&lt;br /&gt;
&lt;br /&gt;
It consumes 10 W when idle, and 210 W when processing items (taking 20 seconds per item).&lt;br /&gt;
&lt;br /&gt;
== Conversion rates ==&lt;br /&gt;
Different inputs result in different processing rates, shown as follows:&lt;br /&gt;
&amp;lt;onlyinclude&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+Conversion Rate Table&lt;br /&gt;
!Input&lt;br /&gt;
![[Alcohol]] / unit (Moles)&lt;br /&gt;
![[Polluted Water]] / unit (Moles)&lt;br /&gt;
!Alcohol / Harvest (Moles)&lt;br /&gt;
!Polluted Water / Harvest (Moles)&lt;br /&gt;
|-&lt;br /&gt;
|[[Decayed Food]]&lt;br /&gt;
|1&lt;br /&gt;
|0.05&lt;br /&gt;
|N/A&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|Seeds (Any)&lt;br /&gt;
|6&lt;br /&gt;
|0.3&lt;br /&gt;
|6&lt;br /&gt;
|0.3&lt;br /&gt;
|-&lt;br /&gt;
|[[Biomass]]&lt;br /&gt;
|10&lt;br /&gt;
|1&lt;br /&gt;
|N/A&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|[[Blueberry]]&lt;br /&gt;
|18&lt;br /&gt;
|0.9&lt;br /&gt;
|36&lt;br /&gt;
|1.8&lt;br /&gt;
|-&lt;br /&gt;
|[[Cocoa]]&lt;br /&gt;
|6&lt;br /&gt;
|0.3&lt;br /&gt;
|18&lt;br /&gt;
|0.9&lt;br /&gt;
|-&lt;br /&gt;
|[[Corn]]&lt;br /&gt;
|40&lt;br /&gt;
|2&lt;br /&gt;
|120&lt;br /&gt;
|6&lt;br /&gt;
|-&lt;br /&gt;
|[[Darga Fern]]&lt;br /&gt;
|2&lt;br /&gt;
|0.1&lt;br /&gt;
|6&lt;br /&gt;
|0.3&lt;br /&gt;
|-&lt;br /&gt;
|[[Fern]]&lt;br /&gt;
|2&lt;br /&gt;
|0.1&lt;br /&gt;
|4&lt;br /&gt;
|0.2&lt;br /&gt;
|-&lt;br /&gt;
|[[Hades Flower]]&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|[[Switchgrass|Hay]]&lt;br /&gt;
|3&lt;br /&gt;
|0.15&lt;br /&gt;
|45&lt;br /&gt;
|3&lt;br /&gt;
|-&lt;br /&gt;
|[[Mushroom]]&lt;br /&gt;
|2&lt;br /&gt;
|0.1&lt;br /&gt;
|6&lt;br /&gt;
|0.3&lt;br /&gt;
|-&lt;br /&gt;
|[[Potato]]&lt;br /&gt;
|8&lt;br /&gt;
|0.4&lt;br /&gt;
|16&lt;br /&gt;
|0.8&lt;br /&gt;
|-&lt;br /&gt;
|[[Pumpkin]]&lt;br /&gt;
|18&lt;br /&gt;
|0.9&lt;br /&gt;
|54&lt;br /&gt;
|2.7&lt;br /&gt;
|-&lt;br /&gt;
|[[Rice]]&lt;br /&gt;
|8&lt;br /&gt;
|0.4&lt;br /&gt;
|40&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|[[Soybean]]&lt;br /&gt;
|6&lt;br /&gt;
|0.3&lt;br /&gt;
|18&lt;br /&gt;
|0.9&lt;br /&gt;
|-&lt;br /&gt;
|[[Sugarcane]]&lt;br /&gt;
|15&lt;br /&gt;
|0.75&lt;br /&gt;
|45&lt;br /&gt;
|3&lt;br /&gt;
|-&lt;br /&gt;
|[[Strawberry]]&lt;br /&gt;
|12&lt;br /&gt;
|0.6&lt;br /&gt;
|36&lt;br /&gt;
|1.8&lt;br /&gt;
|-&lt;br /&gt;
|[[Tomato]]&lt;br /&gt;
|12&lt;br /&gt;
|0.6&lt;br /&gt;
|36&lt;br /&gt;
|1.8&lt;br /&gt;
|-&lt;br /&gt;
|[[Watermelon]]&lt;br /&gt;
|40&lt;br /&gt;
|2&lt;br /&gt;
|40&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|[[Wheat]]&lt;br /&gt;
|6&lt;br /&gt;
|0.3&lt;br /&gt;
|30&lt;br /&gt;
|1.5&lt;br /&gt;
|-&lt;br /&gt;
|[[Winterspawn]]&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/onlyinclude&amp;gt;Outputs for plants and seeds are created at 29°C, and have their polluted water contents at exactly 5% of their produced alcohol. Biomass is the only exception to this rule, generating 10% of their produced alcohol as water.&lt;br /&gt;
Most [[plants]] benefit from being converted into [[Biomass]] first by processing them at a [[Recycler]] and [[Centrifuge]] before fermentation, although some exceptions exist. Corn and Watermelon produce more water and alcohol by being directly processed, while Blueberry, Pumpkin, Sugarcane, and Strawberry produce more alcohol (but not water) by being directly processed. If alcohol combustion byproducts are taken into account, they also produce more water by being directly procesed as well.&lt;br /&gt;
&lt;br /&gt;
== Production Optimization ==&lt;br /&gt;
From the conversion rate table, Pareto-optimal plants are Switchgrass (highest harvest after conversion to biomass), Corn (Highest unprocessed harvest), and Watermelon (Highest output/h on max yield fertilizer). A fermenter takes 20 seconds to process an item for a total of 180 items/hour, potentially diminishing the effectiveness of Switchgrass. However, fertilizer production requirements introduce overhead.&lt;br /&gt;
&lt;br /&gt;
Because Hay is counted as biomass instead of food, it contributes towards growth cycles when used in an [[Advanced Composter]]. As such, max yield fertilizer production is best done using Wheat as input stock.&lt;br /&gt;
&lt;br /&gt;
An advanced composter consumes 180 items/hour and 1.2 kmols of water to produce 60 fertilizer, 3kmol of Nitrogen and 3kmol of Methane. Stacks of fertilizer with different properties can be merged to achieve a mixture of ratio properties after fertilizer production, but at this point no analysis has been made on whether this achieves better production per plot.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Plant production data&lt;br /&gt;
!Plant&lt;br /&gt;
!Time between harvests(Base)&lt;br /&gt;
!Alcohol/harvest&lt;br /&gt;
!Harvest Cycles/h(Base)&lt;br /&gt;
!Items/Hour/Plot(Base)&lt;br /&gt;
!Fertilizer/hour/Plot&lt;br /&gt;
|-&lt;br /&gt;
|Switchgrass&lt;br /&gt;
|1332&lt;br /&gt;
|150 (no fertilizer use)&lt;br /&gt;
|{{Overline|2.|702}}&lt;br /&gt;
|{{Overline|40.|540}}&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Wheat&lt;br /&gt;
|2700&lt;br /&gt;
|0 (used for fertilizer)&lt;br /&gt;
|{{Overline|1.|3}}&lt;br /&gt;
|{{Overline|5.|3}} ({{Overline|8.|6}} on max yield fertilizer)&lt;br /&gt;
|{{Overline|1.|7}} ({{Overline|2.|8}} before self-use)&lt;br /&gt;
|-&lt;br /&gt;
|Watermelon&lt;br /&gt;
|3000&lt;br /&gt;
|120 (max yield fertilizer)&lt;br /&gt;
|1.2&lt;br /&gt;
|3.6&lt;br /&gt;
| -0.6 (2 cycles)&lt;br /&gt;
|-&lt;br /&gt;
|Corn (mature)&lt;br /&gt;
|5400&lt;br /&gt;
|160 (max yield fertilizer)&lt;br /&gt;
|{{Overline|0.|6}}&lt;br /&gt;
|{{Overline|2.|6}}&lt;br /&gt;
| -{{Overline|0.|3}} (2 cycles)&lt;br /&gt;
|-&lt;br /&gt;
|Corn (seeding)&lt;br /&gt;
|7200&lt;br /&gt;
|200 (max yield fertilizer)&lt;br /&gt;
|0.5&lt;br /&gt;
|2.5&lt;br /&gt;
| -0.25 (2 cycles)&lt;br /&gt;
|}&lt;br /&gt;
Mixing growth cycles and yield fertilizer, we can achieve the following uses at the following ratios:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Total uses&lt;br /&gt;
!Yield Fertilizer Proportion&lt;br /&gt;
!Yield Boost&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|100%&lt;br /&gt;
|2.5 (rounded to 2)&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|80%&lt;br /&gt;
|2.2 (rounded to 2)&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|60%&lt;br /&gt;
|1.9 (rounded to 2)&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|40%&lt;br /&gt;
|1.6 (rounded to 2)&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|20%&lt;br /&gt;
|1.3 (rounded to 1)&lt;br /&gt;
|-&lt;br /&gt;
|7&lt;br /&gt;
|0%&lt;br /&gt;
|1&lt;br /&gt;
|}&lt;br /&gt;
In order to get a rounding to 2, the yield boost needs to be 1.5 or above. As such, the minimum yield fertilizer proportion required to achieve a yield boost of 2 is 1/3rd. Any additional food results in less throughput.&lt;br /&gt;
&lt;br /&gt;
The extra slack between total uses can be replaced with growth rate.&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=Module:GasIcon&amp;diff=28096</id>
		<title>Module:GasIcon</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=Module:GasIcon&amp;diff=28096"/>
		<updated>2026-09-06T06:51:00Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: replace old template invoke function&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local GasData = mw.loadData(&amp;quot;Module:Gas/data&amp;quot;)&lt;br /&gt;
local Gas = require(&amp;quot;Module:Gas&amp;quot;)&lt;br /&gt;
local p = {}&lt;br /&gt;
    local function CreateStyle(args)&lt;br /&gt;
&lt;br /&gt;
        local css={}&lt;br /&gt;
        css.display = &amp;quot;inline-block&amp;quot;&lt;br /&gt;
        css.height = args.Size or &amp;quot;32px&amp;quot;&lt;br /&gt;
        css.width = css.height&lt;br /&gt;
        css[&amp;quot;vertical-align&amp;quot;] = &amp;quot;baseline&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        return css&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    function p.GetIcon(frame)&lt;br /&gt;
        local args = frame:getParent().args&lt;br /&gt;
        local gas = Gas.GetGas(args[1])&lt;br /&gt;
        mw.logObject(args)&lt;br /&gt;
        local html = mw.html.create(&amp;quot;span&amp;quot;)&lt;br /&gt;
                    :css(CreateStyle(args))&lt;br /&gt;
                    :wikitext(&amp;quot;[[&amp;quot;..gas.Image..&amp;quot;|link=&amp;quot;..gas.HumanReadableName..&amp;quot;]]&amp;quot;)&lt;br /&gt;
                :done()&lt;br /&gt;
        return html&lt;br /&gt;
    end&lt;br /&gt;
    p.GetIcon2 = p.GetIcon --still kept for sandbox template&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=Module:GasIcon&amp;diff=28095</id>
		<title>Module:GasIcon</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=Module:GasIcon&amp;diff=28095"/>
		<updated>2026-09-06T06:39:44Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local GasData = mw.loadData(&amp;quot;Module:Gas/data&amp;quot;)&lt;br /&gt;
local Gas = require(&amp;quot;Module:Gas&amp;quot;)&lt;br /&gt;
local p = {}&lt;br /&gt;
    function p.GetIcon(frame)&lt;br /&gt;
        local args = frame:getParent().args&lt;br /&gt;
        local gas = Gas.GetGas(args[1])&lt;br /&gt;
        mw.logObject(args)&lt;br /&gt;
        local size = args.Size or &amp;quot;32px&amp;quot;&lt;br /&gt;
        return &amp;quot;[[&amp;quot;..gas.Image..&amp;quot;|&amp;quot;..size..&amp;quot;|link=&amp;quot;..gas.HumanReadableName..&amp;quot;]]&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local function CreateStyle(args)&lt;br /&gt;
&lt;br /&gt;
        local css={}&lt;br /&gt;
        css.display = &amp;quot;inline-block&amp;quot;&lt;br /&gt;
        css.height = args.Size or &amp;quot;32px&amp;quot;&lt;br /&gt;
        css.width = css.height&lt;br /&gt;
        css[&amp;quot;vertical-align&amp;quot;] = &amp;quot;baseline&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        return css&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    function p.GetIcon2(frame)&lt;br /&gt;
        local args = frame:getParent().args&lt;br /&gt;
        local gas = Gas.GetGas(args[1])&lt;br /&gt;
        mw.logObject(args)&lt;br /&gt;
        local html = mw.html.create(&amp;quot;span&amp;quot;)&lt;br /&gt;
                    :css(CreateStyle(args))&lt;br /&gt;
                    :wikitext(&amp;quot;[[&amp;quot;..gas.Image..&amp;quot;|link=&amp;quot;..gas.HumanReadableName..&amp;quot;]]&amp;quot;)&lt;br /&gt;
                :done()&lt;br /&gt;
        return html&lt;br /&gt;
    end&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=Module:GasIcon&amp;diff=28094</id>
		<title>Module:GasIcon</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=Module:GasIcon&amp;diff=28094"/>
		<updated>2026-09-06T06:23:10Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local GasData = mw.loadData(&amp;quot;Module:Gas/data&amp;quot;)&lt;br /&gt;
local Gas = require(&amp;quot;Module:Gas&amp;quot;)&lt;br /&gt;
local p = {}&lt;br /&gt;
    function p.GetIcon(frame)&lt;br /&gt;
        local args = frame:getParent().args&lt;br /&gt;
        local gas = Gas.GetGas(args[1])&lt;br /&gt;
        mw.logObject(args)&lt;br /&gt;
        local size = args.Size or &amp;quot;32px&amp;quot;&lt;br /&gt;
        return &amp;quot;[[&amp;quot;..gas.Image..&amp;quot;|&amp;quot;..size..&amp;quot;|link=&amp;quot;..gas.HumanReadableName..&amp;quot;]]&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local function CreateStyle(args)&lt;br /&gt;
&lt;br /&gt;
        local css={}&lt;br /&gt;
        css.display = &amp;quot;inline-block&amp;quot;&lt;br /&gt;
        css.height = args.Size or &amp;quot;32px&amp;quot;&lt;br /&gt;
        css.width = css.height&lt;br /&gt;
        css[&amp;quot;vertical-align&amp;quot;] = &amp;quot;middle&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        return css&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    function p.GetIcon2(frame)&lt;br /&gt;
        local args = frame:getParent().args&lt;br /&gt;
        local gas = Gas.GetGas(args[1])&lt;br /&gt;
        mw.logObject(args)&lt;br /&gt;
        local html = mw.html.create(&amp;quot;span&amp;quot;)&lt;br /&gt;
                    :css(CreateStyle(args))&lt;br /&gt;
                    :wikitext(&amp;quot;[[&amp;quot;..gas.Image..&amp;quot;|link=&amp;quot;..gas.HumanReadableName..&amp;quot;]]&amp;quot;)&lt;br /&gt;
                :done()&lt;br /&gt;
        return html&lt;br /&gt;
    end&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=Module:GasIcon&amp;diff=28093</id>
		<title>Module:GasIcon</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=Module:GasIcon&amp;diff=28093"/>
		<updated>2026-09-06T06:22:18Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local GasData = mw.loadData(&amp;quot;Module:Gas/data&amp;quot;)&lt;br /&gt;
local Gas = require(&amp;quot;Module:Gas&amp;quot;)&lt;br /&gt;
local p = {}&lt;br /&gt;
    function p.GetIcon(frame)&lt;br /&gt;
        local args = frame:getParent().args&lt;br /&gt;
        local gas = Gas.GetGas(args[1])&lt;br /&gt;
        mw.logObject(args)&lt;br /&gt;
        local size = args.Size or &amp;quot;32px&amp;quot;&lt;br /&gt;
        return &amp;quot;[[&amp;quot;..gas.Image..&amp;quot;|&amp;quot;..size..&amp;quot;|link=&amp;quot;..gas.HumanReadableName..&amp;quot;]]&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local function CreateStyle(args)&lt;br /&gt;
&lt;br /&gt;
        local css={}&lt;br /&gt;
        css.display = &amp;quot;inline-block&amp;quot;&lt;br /&gt;
        css.height = args.Size or &amp;quot;32px&amp;quot;&lt;br /&gt;
        css.width = css.height&lt;br /&gt;
        css[&amp;quot;vertical-align&amp;quot;] = &amp;quot;middle&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        return css&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    function p.GetIcon2(frame)&lt;br /&gt;
        local args = frame:getParent().args&lt;br /&gt;
        local gas = Gas.GetGas(args[1])&lt;br /&gt;
        mw.logObject(args)&lt;br /&gt;
        local html = mw.html.create(&amp;quot;div&amp;quot;)&lt;br /&gt;
                    :css(CreateStyle(args))&lt;br /&gt;
                    :wikitext(&amp;quot;[[&amp;quot;..gas.Image..&amp;quot;|link=&amp;quot;..gas.HumanReadableName..&amp;quot;]]&amp;quot;)&lt;br /&gt;
                :done()&lt;br /&gt;
        return html&lt;br /&gt;
    end&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=Module:GasIcon&amp;diff=28092</id>
		<title>Module:GasIcon</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=Module:GasIcon&amp;diff=28092"/>
		<updated>2026-09-06T05:56:21Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local GasData = mw.loadData(&amp;quot;Module:Gas/data&amp;quot;)&lt;br /&gt;
local Gas = require(&amp;quot;Module:Gas&amp;quot;)&lt;br /&gt;
local p = {}&lt;br /&gt;
    function p.GetIcon(frame)&lt;br /&gt;
        local args = frame:getParent().args&lt;br /&gt;
        local gas = Gas.GetGas(args[1])&lt;br /&gt;
        mw.logObject(args)&lt;br /&gt;
        local size = args.Size or &amp;quot;32px&amp;quot;&lt;br /&gt;
        return &amp;quot;[[&amp;quot;..gas.Image..&amp;quot;|&amp;quot;..size..&amp;quot;|link=&amp;quot;..gas.HumanReadableName..&amp;quot;]]&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local function CreateStyle(args)&lt;br /&gt;
&lt;br /&gt;
        local css={}&lt;br /&gt;
        css.display = &amp;quot;inline-block&amp;quot;&lt;br /&gt;
        css.height = args.Size or &amp;quot;32px&amp;quot;&lt;br /&gt;
        css.width = &amp;quot;auto&amp;quot;&lt;br /&gt;
        css[&amp;quot;vertical-align&amp;quot;] = &amp;quot;middle&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        return css&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    function p.GetIcon2(frame)&lt;br /&gt;
        local args = frame:getParent().args&lt;br /&gt;
        local gas = Gas.GetGas(args[1])&lt;br /&gt;
        mw.logObject(args)&lt;br /&gt;
        local html = mw.html.create(&amp;quot;div&amp;quot;)&lt;br /&gt;
                    :css(CreateStyle(args))&lt;br /&gt;
                    :wikitext(&amp;quot;[[&amp;quot;..gas.Image..&amp;quot;|link=&amp;quot;..gas.HumanReadableName..&amp;quot;]]&amp;quot;)&lt;br /&gt;
                :done()&lt;br /&gt;
        return html&lt;br /&gt;
    end&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=Module:GasIcon&amp;diff=28091</id>
		<title>Module:GasIcon</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=Module:GasIcon&amp;diff=28091"/>
		<updated>2026-09-06T05:55:10Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local GasData = mw.loadData(&amp;quot;Module:Gas/data&amp;quot;)&lt;br /&gt;
local Gas = require(&amp;quot;Module:Gas&amp;quot;)&lt;br /&gt;
local p = {}&lt;br /&gt;
    function p.GetIcon(frame)&lt;br /&gt;
        local args = frame:getParent().args&lt;br /&gt;
        local gas = Gas.GetGas(args[1])&lt;br /&gt;
        mw.logObject(args)&lt;br /&gt;
        local size = args.Size or &amp;quot;32px&amp;quot;&lt;br /&gt;
        return &amp;quot;[[&amp;quot;..gas.Image..&amp;quot;|&amp;quot;..size..&amp;quot;|link=&amp;quot;..gas.HumanReadableName..&amp;quot;]]&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local function CreateStyle(args)&lt;br /&gt;
&lt;br /&gt;
        local css={}&lt;br /&gt;
        css.display = &amp;quot;inline-block&amp;quot;&lt;br /&gt;
        css.height = args.Size or &amp;quot;32px&amp;quot;&lt;br /&gt;
        css.width = &amp;quot;auto&amp;quot;&lt;br /&gt;
        css[&amp;quot;vertical-align&amp;quot;] = &amp;quot;middle&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        return css&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    function p.GetIcon2(frame)&lt;br /&gt;
        local args = frame:getParent().args&lt;br /&gt;
        local gas = Gas.GetGas(args[1])&lt;br /&gt;
        mw.logObject(args)&lt;br /&gt;
        local html = mw.html.create(&amp;quot;span&amp;quot;)&lt;br /&gt;
                    :css(CreateStyle(args))&lt;br /&gt;
                    :wikitext(&amp;quot;[[&amp;quot;..gas.Image..&amp;quot;|link=&amp;quot;..gas.HumanReadableName..&amp;quot;]]&amp;quot;)&lt;br /&gt;
                :done()&lt;br /&gt;
        return html&lt;br /&gt;
    end&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=Template:GasIcon/Sandbox&amp;diff=28090</id>
		<title>Template:GasIcon/Sandbox</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=Template:GasIcon/Sandbox&amp;diff=28090"/>
		<updated>2026-09-06T05:52:57Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&amp;lt;templatedata&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;description&amp;quot;: &amp;quot;Display a gas or liquid&#039;s icon image, with a link to its corresponding wiki page.&amp;quot;,&lt;br /&gt;
&amp;quot;params&amp;quot;:{&lt;br /&gt;
    &amp;quot;1&amp;quot;: {&lt;br /&gt;
        &amp;quot;label&amp;quot;:&amp;quot;Gas Name&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
        &amp;quot;required&amp;quot;: true,&lt;br /&gt;
        &amp;quot;description&amp;quot;: &amp;quot;The name of the gas to be displayed.&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
    &amp;quot;Size&amp;quot;: {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
        &amp;quot;required&amp;quot;: false,&lt;br /&gt;
        &amp;quot;description&amp;quot;: &amp;quot;Size of icon to be displayed.&amp;quot;,&lt;br /&gt;
        &amp;quot;default&amp;quot;: &amp;quot;32px&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/templatedata&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;{{GasIcon/Sandbox|LiquidMethane|Size=1em}}&amp;lt;/nowiki&amp;gt; -&amp;gt; {{GasIcon/Sandbox|LiquidMethane|Size=1em}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;{{#Invoke:GasIcon|GetIcon2}}&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=Module:GasIcon&amp;diff=28089</id>
		<title>Module:GasIcon</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=Module:GasIcon&amp;diff=28089"/>
		<updated>2026-09-06T05:52:11Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: rewrite styling to fit within inline span. apparently both anchor and image HTML tags aren&amp;#039;t whitelisted by the mediawiki parser.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local GasData = mw.loadData(&amp;quot;Module:Gas/data&amp;quot;)&lt;br /&gt;
local Gas = require(&amp;quot;Module:Gas&amp;quot;)&lt;br /&gt;
local p = {}&lt;br /&gt;
    function p.GetIcon(frame)&lt;br /&gt;
        local args = frame:getParent().args&lt;br /&gt;
        local gas = Gas.GetGas(args[1])&lt;br /&gt;
        mw.logObject(args)&lt;br /&gt;
        local size = args.Size or &amp;quot;32px&amp;quot;&lt;br /&gt;
        return &amp;quot;[[&amp;quot;..gas.Image..&amp;quot;|&amp;quot;..size..&amp;quot;|link=&amp;quot;..gas.HumanReadableName..&amp;quot;]]&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local function CreateStyle(args)&lt;br /&gt;
&lt;br /&gt;
        local css={}&lt;br /&gt;
        css.height = args.Size or &amp;quot;32px&amp;quot;&lt;br /&gt;
        css.width = &amp;quot;auto&amp;quot;&lt;br /&gt;
        css[&amp;quot;vertical-align&amp;quot;] = &amp;quot;middle&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        return css&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    function p.GetIcon2(frame)&lt;br /&gt;
        local args = frame:getParent().args&lt;br /&gt;
        local gas = Gas.GetGas(args[1])&lt;br /&gt;
        mw.logObject(args)&lt;br /&gt;
        local html = mw.html.create(&amp;quot;span&amp;quot;)&lt;br /&gt;
                    :css(CreateStyle(args))&lt;br /&gt;
                    :wikitext(&amp;quot;[[&amp;quot;..gas.Image..&amp;quot;|link=&amp;quot;..gas.HumanReadableName..&amp;quot;]]&amp;quot;)&lt;br /&gt;
                :done()&lt;br /&gt;
        return html&lt;br /&gt;
    end&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=Module:GasIcon&amp;diff=28088</id>
		<title>Module:GasIcon</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=Module:GasIcon&amp;diff=28088"/>
		<updated>2026-09-06T05:36:50Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local GasData = mw.loadData(&amp;quot;Module:Gas/data&amp;quot;)&lt;br /&gt;
local Gas = require(&amp;quot;Module:Gas&amp;quot;)&lt;br /&gt;
local p = {}&lt;br /&gt;
    function p.GetIcon(frame)&lt;br /&gt;
        local args = frame:getParent().args&lt;br /&gt;
        local gas = Gas.GetGas(args[1])&lt;br /&gt;
        mw.logObject(args)&lt;br /&gt;
        local size = args.Size or &amp;quot;32px&amp;quot;&lt;br /&gt;
        return &amp;quot;[[&amp;quot;..gas.Image..&amp;quot;|&amp;quot;..size..&amp;quot;|link=&amp;quot;..gas.HumanReadableName..&amp;quot;]]&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local function CreateStyle(args)&lt;br /&gt;
&lt;br /&gt;
        local css={}&lt;br /&gt;
        css.height = args.Size or &amp;quot;32px&amp;quot;&lt;br /&gt;
        css.width = &amp;quot;auto&amp;quot;&lt;br /&gt;
        css[&amp;quot;vertical-align&amp;quot;] = &amp;quot;middle&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        return css&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    function p.GetIcon2(frame)&lt;br /&gt;
        local args = frame:getParent().args&lt;br /&gt;
        local gas = Gas.GetGas(args[1])&lt;br /&gt;
        mw.logObject(args)&lt;br /&gt;
        local html = mw.html.create(&amp;quot;a&amp;quot;)&lt;br /&gt;
            :attr(&amp;quot;href&amp;quot;, gas.HumanReadableName)&lt;br /&gt;
                :tag(&amp;quot;img&amp;quot;)&lt;br /&gt;
                    :attr(&amp;quot;src&amp;quot;, gas.Image)&lt;br /&gt;
                    :css(CreateStyle(args))&lt;br /&gt;
                    :attr(&amp;quot;alt&amp;quot;, gas.HumanReadableName)&lt;br /&gt;
                :done()&lt;br /&gt;
            :done()&lt;br /&gt;
        return frame:preprocess(tostring(html))&lt;br /&gt;
    end&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=Module:GasIcon&amp;diff=28087</id>
		<title>Module:GasIcon</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=Module:GasIcon&amp;diff=28087"/>
		<updated>2026-09-06T05:34:53Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local GasData = mw.loadData(&amp;quot;Module:Gas/data&amp;quot;)&lt;br /&gt;
local Gas = require(&amp;quot;Module:Gas&amp;quot;)&lt;br /&gt;
local p = {}&lt;br /&gt;
    function p.GetIcon(frame)&lt;br /&gt;
        local args = frame:getParent().args&lt;br /&gt;
        local gas = Gas.GetGas(args[1])&lt;br /&gt;
        mw.logObject(args)&lt;br /&gt;
        local size = args.Size or &amp;quot;32px&amp;quot;&lt;br /&gt;
        return &amp;quot;[[&amp;quot;..gas.Image..&amp;quot;|&amp;quot;..size..&amp;quot;|link=&amp;quot;..gas.HumanReadableName..&amp;quot;]]&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local function CreateStyle(args)&lt;br /&gt;
&lt;br /&gt;
        local css={}&lt;br /&gt;
        css.height = args.Size or &amp;quot;32px&amp;quot;&lt;br /&gt;
        css.width = &amp;quot;auto&amp;quot;&lt;br /&gt;
        css[&amp;quot;vertical-align&amp;quot;] = &amp;quot;middle&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        return css&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    function p.GetIcon2(frame)&lt;br /&gt;
        local args = frame:getParent().args&lt;br /&gt;
        local gas = Gas.GetGas(args[1])&lt;br /&gt;
        mw.logObject(args)&lt;br /&gt;
        local html = mw.html.create(&amp;quot;a&amp;quot;)&lt;br /&gt;
            :attr(&amp;quot;href&amp;quot;, gas.HumanReadableName)&lt;br /&gt;
                :tag(&amp;quot;img&amp;quot;)&lt;br /&gt;
                    :attr(&amp;quot;src&amp;quot;, gas.Image)&lt;br /&gt;
                    :css(CreateStyle(args))&lt;br /&gt;
                    :attr(&amp;quot;alt&amp;quot;, gas.HumanReadableName)&lt;br /&gt;
                :done()&lt;br /&gt;
            :done()&lt;br /&gt;
        return frame:preprocess(html)&lt;br /&gt;
    end&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=Module:GasIcon&amp;diff=28086</id>
		<title>Module:GasIcon</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=Module:GasIcon&amp;diff=28086"/>
		<updated>2026-09-06T05:23:14Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local GasData = mw.loadData(&amp;quot;Module:Gas/data&amp;quot;)&lt;br /&gt;
local Gas = require(&amp;quot;Module:Gas&amp;quot;)&lt;br /&gt;
local p = {}&lt;br /&gt;
    function p.GetIcon(frame)&lt;br /&gt;
        local args = frame:getParent().args&lt;br /&gt;
        local gas = Gas.GetGas(args[1])&lt;br /&gt;
        mw.logObject(args)&lt;br /&gt;
        local size = args.Size or &amp;quot;32px&amp;quot;&lt;br /&gt;
        return &amp;quot;[[&amp;quot;..gas.Image..&amp;quot;|&amp;quot;..size..&amp;quot;|link=&amp;quot;..gas.HumanReadableName..&amp;quot;]]&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local function CreateStyle(args)&lt;br /&gt;
&lt;br /&gt;
        local css={}&lt;br /&gt;
        css.height = args.Size or &amp;quot;32px&amp;quot;&lt;br /&gt;
        css.width = &amp;quot;auto&amp;quot;&lt;br /&gt;
        css[&amp;quot;vertical-align&amp;quot;] = &amp;quot;middle&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        return css&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    function p.GetIcon2(frame)&lt;br /&gt;
        local args = frame:getParent().args&lt;br /&gt;
        local gas = Gas.GetGas(args[1])&lt;br /&gt;
        mw.logObject(args)&lt;br /&gt;
        local html = mw.html.create(&amp;quot;a&amp;quot;)&lt;br /&gt;
            :attr(&amp;quot;href&amp;quot;, gas.HumanReadableName)&lt;br /&gt;
                :tag(&amp;quot;img&amp;quot;)&lt;br /&gt;
                    :attr(&amp;quot;src&amp;quot;, gas.Image)&lt;br /&gt;
                    :css(CreateStyle(args))&lt;br /&gt;
                    :attr(&amp;quot;alt&amp;quot;, gas.HumanReadableName)&lt;br /&gt;
                :done()&lt;br /&gt;
            :done()&lt;br /&gt;
        return tostring(html)&lt;br /&gt;
    end&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=Module:GasIcon&amp;diff=28085</id>
		<title>Module:GasIcon</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=Module:GasIcon&amp;diff=28085"/>
		<updated>2026-09-06T05:16:06Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local GasData = mw.loadData(&amp;quot;Module:Gas/data&amp;quot;)&lt;br /&gt;
local Gas = require(&amp;quot;Module:Gas&amp;quot;)&lt;br /&gt;
local p = {}&lt;br /&gt;
    function p.GetIcon(frame)&lt;br /&gt;
        local args = frame:getParent().args&lt;br /&gt;
        local gas = Gas.GetGas(args[1])&lt;br /&gt;
        mw.logObject(args)&lt;br /&gt;
        local size = args.Size or &amp;quot;32px&amp;quot;&lt;br /&gt;
        return &amp;quot;[[&amp;quot;..gas.Image..&amp;quot;|&amp;quot;..size..&amp;quot;|link=&amp;quot;..gas.HumanReadableName..&amp;quot;]]&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local function CreateStyle(args)&lt;br /&gt;
&lt;br /&gt;
        local css={}&lt;br /&gt;
        css.height = args.Size or &amp;quot;32px&amp;quot;&lt;br /&gt;
        css.width = &amp;quot;auto&amp;quot;&lt;br /&gt;
        css[&amp;quot;vertical-align&amp;quot;] = &amp;quot;middle&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        return css&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    function p.GetIcon2(frame)&lt;br /&gt;
        local args = frame:getParent().args&lt;br /&gt;
        local gas = Gas.GetGas(args[1])&lt;br /&gt;
        mw.logObject(args)&lt;br /&gt;
        local html = mw.html.create(&amp;quot;a&amp;quot;)&lt;br /&gt;
            :attr(&amp;quot;href&amp;quot;, gas.HumanReadableName)&lt;br /&gt;
                :tag(&amp;quot;img&amp;quot;)&lt;br /&gt;
                    :attr(&amp;quot;src&amp;quot;, gas.Image)&lt;br /&gt;
                    :css(CreateStyle(args))&lt;br /&gt;
                    :attr(&amp;quot;alt&amp;quot;, gas.HumanReadableName)&lt;br /&gt;
                :done()&lt;br /&gt;
            :done()&lt;br /&gt;
        return html&lt;br /&gt;
    end&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=Module:GasIcon&amp;diff=28084</id>
		<title>Module:GasIcon</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=Module:GasIcon&amp;diff=28084"/>
		<updated>2026-09-06T05:13:33Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local GasData = mw.loadData(&amp;quot;Module:Gas/data&amp;quot;)&lt;br /&gt;
local Gas = require(&amp;quot;Module:Gas&amp;quot;)&lt;br /&gt;
local p = {}&lt;br /&gt;
    function p.GetIcon(frame)&lt;br /&gt;
        local args = frame:getParent().args&lt;br /&gt;
        local gas = Gas.GetGas(args[1])&lt;br /&gt;
        mw.logObject(args)&lt;br /&gt;
        local size = args.Size or &amp;quot;32px&amp;quot;&lt;br /&gt;
        return &amp;quot;[[&amp;quot;..gas.Image..&amp;quot;|&amp;quot;..size..&amp;quot;|link=&amp;quot;..gas.HumanReadableName..&amp;quot;]]&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local function CreateStyle(args)&lt;br /&gt;
&lt;br /&gt;
        local css={}&lt;br /&gt;
        css.height = args.Size or &amp;quot;32px&amp;quot;&lt;br /&gt;
        css.width = &amp;quot;auto&amp;quot;&lt;br /&gt;
        css[&amp;quot;vertical-align&amp;quot;] = &amp;quot;middle&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        return css&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    function p.GetIcon2(frame)&lt;br /&gt;
        local args = frame:getParent().args&lt;br /&gt;
        local gas = Gas.GetGas(args[1])&lt;br /&gt;
        mw.logObject(args)&lt;br /&gt;
        local html = mw.html.create(&amp;quot;a&amp;quot;)&lt;br /&gt;
            :attr(&amp;quot;href&amp;quot;, gas.Image)&lt;br /&gt;
                :tag(&amp;quot;img&amp;quot;)&lt;br /&gt;
                    :attr(&amp;quot;src&amp;quot;, gas.Image)&lt;br /&gt;
                    :css(CreateStyle(args))&lt;br /&gt;
                    :attr(&amp;quot;alt&amp;quot;, gas.HumanReadableName)&lt;br /&gt;
                :done()&lt;br /&gt;
            :done()&lt;br /&gt;
        return html&lt;br /&gt;
    end&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=Module:GasIcon&amp;diff=28083</id>
		<title>Module:GasIcon</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=Module:GasIcon&amp;diff=28083"/>
		<updated>2026-09-06T05:10:22Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local GasData = mw.loadData(&amp;quot;Module:Gas/data&amp;quot;)&lt;br /&gt;
local Gas = require(&amp;quot;Module:Gas&amp;quot;)&lt;br /&gt;
local p = {}&lt;br /&gt;
    function p.GetIcon(frame)&lt;br /&gt;
        local args = frame:getParent().args&lt;br /&gt;
        local gas = Gas.GetGas(args[1])&lt;br /&gt;
        mw.logObject(args)&lt;br /&gt;
        local size = args.Size or &amp;quot;32px&amp;quot;&lt;br /&gt;
        return &amp;quot;[[&amp;quot;..gas.Image..&amp;quot;|&amp;quot;..size..&amp;quot;|link=&amp;quot;..gas.HumanReadableName..&amp;quot;]]&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local function CreateStyle(args)&lt;br /&gt;
&lt;br /&gt;
        local css={}&lt;br /&gt;
        css.height = args.Size or &amp;quot;32px&amp;quot;&lt;br /&gt;
        css.width = &amp;quot;auto&amp;quot;&lt;br /&gt;
        css[&amp;quot;vertical-align&amp;quot;] = &amp;quot;middle&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        return css&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    function p.GetIcon2(frame)&lt;br /&gt;
        local args = frame:getParent().args&lt;br /&gt;
        local gas = Gas.GetGas(args[1])&lt;br /&gt;
        mw.logObject(args)&lt;br /&gt;
        local html = mw.html.create(&amp;quot;a&amp;quot;)&lt;br /&gt;
            :attr(&amp;quot;href&amp;quot;, gas.Image)&lt;br /&gt;
                :node(&amp;quot;img&amp;quot;)&lt;br /&gt;
                    :attr(&amp;quot;src&amp;quot;, gas.Image)&lt;br /&gt;
                    :css(CreateStyle(args))&lt;br /&gt;
                    :attr(&amp;quot;alt&amp;quot;, gas.HumanReadableName)&lt;br /&gt;
                :done()&lt;br /&gt;
            :done()&lt;br /&gt;
        return html&lt;br /&gt;
    end&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
	<entry>
		<id>https://stationeers-wiki.com/index.php?title=Module:GasIcon&amp;diff=28082</id>
		<title>Module:GasIcon</title>
		<link rel="alternate" type="text/html" href="https://stationeers-wiki.com/index.php?title=Module:GasIcon&amp;diff=28082"/>
		<updated>2026-09-06T05:10:02Z</updated>

		<summary type="html">&lt;p&gt;RA2lover: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local GasData = mw.loadData(&amp;quot;Module:Gas/data&amp;quot;)&lt;br /&gt;
local Gas = require(&amp;quot;Module:Gas&amp;quot;)&lt;br /&gt;
local p = {}&lt;br /&gt;
    function p.GetIcon(frame)&lt;br /&gt;
        local args = frame:getParent().args&lt;br /&gt;
        local gas = Gas.GetGas(args[1])&lt;br /&gt;
        mw.logObject(args)&lt;br /&gt;
        local size = args.Size or &amp;quot;32px&amp;quot;&lt;br /&gt;
        return &amp;quot;[[&amp;quot;..gas.Image..&amp;quot;|&amp;quot;..size..&amp;quot;|link=&amp;quot;..gas.HumanReadableName..&amp;quot;]]&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local function CreateStyle(args)&lt;br /&gt;
&lt;br /&gt;
        local css={}&lt;br /&gt;
        css.height = args.Size or &amp;quot;32px&amp;quot;&lt;br /&gt;
        css.width = &amp;quot;auto&amp;quot;&lt;br /&gt;
        css[&amp;quot;vertical-align&amp;quot;] = &amp;quot;middle&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        return css&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    function p.GetIcon2(frame)&lt;br /&gt;
        local args = frame:getParent().args&lt;br /&gt;
        local gas = Gas.GetGas(args[1])&lt;br /&gt;
        mw.logObject(args)&lt;br /&gt;
        local html = mw.html.create(&amp;quot;a&amp;quot;)&lt;br /&gt;
            :attr(&amp;quot;href&amp;quot;, gas.Image)&lt;br /&gt;
                :node(&amp;quot;img&amp;quot;)&lt;br /&gt;
                    :attr(&amp;quot;src&amp;quot;, gas.Image)&lt;br /&gt;
                    :css(CreateStyle(args))&lt;br /&gt;
                    :alt(gas.HumanReadableName)&lt;br /&gt;
                :done()&lt;br /&gt;
            :done()&lt;br /&gt;
        return html&lt;br /&gt;
    end&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>RA2lover</name></author>
	</entry>
</feed>