diff --git a/GainStation13/code/__DEFINES/atmospherics.dm b/GainStation13/code/__DEFINES/atmospherics.dm
new file mode 100644
index 0000000000..6943c06b29
--- /dev/null
+++ b/GainStation13/code/__DEFINES/atmospherics.dm
@@ -0,0 +1 @@
+#define GAS_FAT "lipoifium"
diff --git a/GainStation13/code/mechanics/fatness.dm b/GainStation13/code/mechanics/fatness.dm
index f845f50b68..b2c370571f 100644
--- a/GainStation13/code/mechanics/fatness.dm
+++ b/GainStation13/code/mechanics/fatness.dm
@@ -124,6 +124,10 @@ GLOBAL_LIST_INIT(uncapped_resize_areas, list(/area/command/bridge, /area/mainten
if(!client?.prefs?.weight_gain_nanites)
return FALSE
+ if(FATTENING_TYPE_ATMOS)
+ if(!client?.prefs?.weight_gain_atmos)
+ return FALSE
+
if(FATTENING_TYPE_WEIGHT_LOSS)
if(HAS_TRAIT(src, TRAIT_WEIGHT_LOSS_IMMUNE))
return FALSE
diff --git a/GainStation13/code/mechanics/fattening_gasses.dm b/GainStation13/code/mechanics/fattening_gasses.dm
new file mode 100644
index 0000000000..f376645b05
--- /dev/null
+++ b/GainStation13/code/mechanics/fattening_gasses.dm
@@ -0,0 +1,28 @@
+/obj/item/organ/lungs/proc/lipoifium_breathing(datum/gas_mixture/breath, mob/living/carbon/human/H)
+ if(breath)
+ var/pressure = breath.return_pressure()
+ var/total_moles = breath.total_moles()
+ var/lipoifium_moles = breath.get_moles(GAS_FAT)
+ #define PP_MOLES(X) ((X / total_moles) * pressure)
+ var/gas_breathed = PP_MOLES(lipoifium_moles) // this does the same thing as the bit below but I think this is more readable
+ // #define PP(air, gas) PP_MOLES(air.get_moles(gas))
+ // var/gas_breathed = PP(breath, GAS_FAT)
+ if(gas_breathed > 0)
+ // listen I know I can debug this but sometimes having this show up in chat without a pause is more convenient
+ // message_admins("Lipoifium pp is [gas_breathed]")
+ // message_admins("Lipoifium moles are [lipoifium_moles]")
+ H.adjust_fatness(2 * gas_breathed, FATTENING_TYPE_ATMOS)
+ breath.adjust_moles(GAS_FAT, -gas_breathed)
+ // TODO: the entire code below is a workaround for default odor not working
+ // The problem seems to be auxmos'es get_gasses function not acknowledging that lipoifium exists
+ // which is strange, considering that everything else regarding this gas and auxmos works
+ // I do not know what kind of spaghetti coding must be going on there, but I pray god has in his
+ // care the poor sods who have to work on that
+ var/smell_chance = min(lipoifium_moles * 100 / total_moles, 20)
+ if(prob(smell_chance))
+ to_chat(owner, "You can smell lard.")
+
+
+/obj/item/organ/lungs/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/H)
+ lipoifium_breathing(breath, H)
+ . = ..()
diff --git a/GainStation13/code/modules/atmospherics/auxgm/gas_types.dm b/GainStation13/code/modules/atmospherics/auxgm/gas_types.dm
new file mode 100644
index 0000000000..16d4690100
--- /dev/null
+++ b/GainStation13/code/modules/atmospherics/auxgm/gas_types.dm
@@ -0,0 +1,9 @@
+/datum/gas/lipoifium
+ id = GAS_FAT
+ specific_heat = 20
+ name = "Lipoifium"
+ moles_visible = MOLES_GAS_VISIBLE
+ color = "#e2e1b1"
+ odor = "that this is a function that wasn't working, but it now, for some reason, is. You should speak to the gods about this and the conditions under which it happened"
+ odor_strength = 1 // TODO: doesn't work for now
+
diff --git a/GainStation13/code/modules/atmospherics/gasmixtures/reactions.dm b/GainStation13/code/modules/atmospherics/gasmixtures/reactions.dm
new file mode 100644
index 0000000000..4be7b5f717
--- /dev/null
+++ b/GainStation13/code/modules/atmospherics/gasmixtures/reactions.dm
@@ -0,0 +1,33 @@
+/datum/gas_reaction/lipoifium_formation
+ priority = 7
+ name = "Lipoifium Formation"
+ id = "lipoifium_formation"
+
+/datum/gas_reaction/lipoifium_formation/init_reqs()
+ min_requirements = list(
+ "MAX_TEMP" = 100,
+ GAS_BZ = 15,
+ GAS_TRITIUM = 15
+ )
+
+/datum/gas_reaction/lipoifium_formation/react(datum/gas_mixture/air)
+ if (air.get_moles(GAS_BZ) < 15 || air.get_moles(GAS_TRITIUM) < 15)
+ return NO_REACTION
+ var/temperature = air.return_temperature()
+ var/reaction_efficiency = 0
+ if (temperature <= 5)
+ reaction_efficiency = 1
+ else if (temperature >= 100)
+ return NO_REACTION
+ else
+ reaction_efficiency = -((temperature - 5) / 95) + 1 // will equal 1 at 5 kelvin, and will linearly fall until 0 at 100k
+
+ var/energy_released = reaction_efficiency * FIRE_CARBON_ENERGY_RELEASED
+ var/old_heat_capacity = air.heat_capacity()
+ air.adjust_moles(GAS_FAT, reaction_efficiency)
+ air.adjust_moles(GAS_TRITIUM, -reaction_efficiency / 2)
+ air.adjust_moles(GAS_BZ, -reaction_efficiency / 2)
+ var/new_heat_capacity = air.heat_capacity()
+ air.set_temperature(max((temperature * old_heat_capacity + energy_released) / new_heat_capacity, TCMB))
+
+ return REACTING
diff --git a/GainStation13/code/modules/atmospherics/machinery/portable/canister.dm b/GainStation13/code/modules/atmospherics/machinery/portable/canister.dm
new file mode 100644
index 0000000000..edfe243db5
--- /dev/null
+++ b/GainStation13/code/modules/atmospherics/machinery/portable/canister.dm
@@ -0,0 +1,6 @@
+/obj/machinery/portable_atmospherics/canister/lipoifium
+ name = "lipoifium canister"
+ desc = "Lipoifium. Inhaling causes quick buildup of adipose in one's body."
+ icon = 'GainStation13/icons/obj/atmos.dmi'
+ icon_state = "yellowblack"
+ gas_type = GAS_FAT
diff --git a/GainStation13/code/modules/client/preferences/preferences.dm b/GainStation13/code/modules/client/preferences/preferences.dm
index 28bc61c2a1..4919d3703e 100644
--- a/GainStation13/code/modules/client/preferences/preferences.dm
+++ b/GainStation13/code/modules/client/preferences/preferences.dm
@@ -15,6 +15,8 @@
var/weight_gain_viruses = FALSE
///Weight gain from nanites
var/weight_gain_nanites = FALSE
+ //Weight gain from atmos gasses
+ var/weight_gain_atmos = FALSE
///Blueberry Inflation
var/blueberry_inflation = FALSE
///Extreme weight gain
diff --git a/GainStation13/icons/obj/atmos.dmi b/GainStation13/icons/obj/atmos.dmi
new file mode 100644
index 0000000000..56c59d4f24
Binary files /dev/null and b/GainStation13/icons/obj/atmos.dmi differ
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index e10e19c1c5..d914f07c15 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -593,6 +593,7 @@ GLOBAL_LIST_INIT(pda_reskins, list(
#define FATTENING_TYPE_MAGIC "magic"
#define FATTENING_TYPE_VIRUS "virus"
#define FATTENING_TYPE_NANITES "nanites"
+#define FATTENING_TYPE_ATMOS "atmos" // yeah I'm taking the name atmos instead of gasses, because fuck you I'm not calling my pref "inflation type gas", some people will get confused, if you wanna do inflation just call it that lol
#define FATTENING_TYPE_RADIATIONS "radiations"
#define FATTENING_TYPE_WEIGHT_LOSS "weight_loss"
#define FATTENING_TYPE_ALMIGHTY "almighty" //This ignores prefs, please only use this for smites and other admin controlled instances.
diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm
index 4432b497d0..3085a56b9d 100644
--- a/code/modules/atmospherics/machinery/portable/canister.dm
+++ b/code/modules/atmospherics/machinery/portable/canister.dm
@@ -60,7 +60,10 @@
"caution" = /obj/machinery/portable_atmospherics/canister,
"miasma" = /obj/machinery/portable_atmospherics/canister/miasma,
"methane" = /obj/machinery/portable_atmospherics/canister/methane,
- "methyl bromide" = /obj/machinery/portable_atmospherics/canister/methyl_bromide
+ "methyl bromide" = /obj/machinery/portable_atmospherics/canister/methyl_bromide,
+ // GS13 - edit
+ "lipoifium" = /obj/machinery/portable_atmospherics/canister/lipoifium // :D
+ //GS13 - end edit
)
/obj/machinery/portable_atmospherics/canister/interact(mob/user)
@@ -396,6 +399,13 @@
investigate_log("was relabelled to [initial(replacement.name)] by [key_name(usr)].", INVESTIGATE_ATMOS)
name = initial(replacement.name)
desc = initial(replacement.desc)
+ // GS13 - edit
+ cut_overlays() // removes all overlays (connector, tank...).
+ icon = initial(replacement.icon) // changes icon file
+ // you may notice that we do not add the overlays back after removing them,
+ // yet they stay when we relabel a can. How? I have no idea. But it works,
+ // and as such, I won't question it
+ // GS13 - end edit
icon_state = initial(replacement.icon_state)
if("restricted")
restricted = !restricted
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 47cf57175b..060bd31a1c 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -1411,6 +1411,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Magic:[weight_gain_magic == TRUE ? "Enabled" : "Disabled"]
"
dat += "Viruses:[weight_gain_viruses == TRUE ? "Enabled" : "Disabled"]
"
dat += "Nanites:[weight_gain_nanites == TRUE ? "Enabled" : "Disabled"]
"
+ dat += "Atmos gasses:[weight_gain_atmos == TRUE ? "Enabled" : "Disabled"]
"
dat += ""
dat +="