diff --git a/GainStation13/code/datums/components/fattening_door.dm b/GainStation13/code/datums/components/fattening_door.dm
new file mode 100644
index 00000000..1e88b76a
--- /dev/null
+++ b/GainStation13/code/datums/components/fattening_door.dm
@@ -0,0 +1,75 @@
+/datum/component/fattening_door
+ var/fatten = FALSE // whether player will be fattened
+ var/fat_to_add = 2 // fatness per tick stunned
+ var/stuck = FALSE // whether player is stuck
+ var/stuck_delay = 0 // set in proc/Fatten
+ // var/fatten_delay = 1 // ticks per periodic loop
+ // var/blocked = FALSE // whether door is blocked // Unneeded now as FatStun replaces this loop requirement.
+
+/datum/component/fattening_door/Initialize()
+ if(!istype(parent, /obj/structure/mineral_door)) // if the attached object isn't a door, return incompatible!
+ return COMPONENT_INCOMPATIBLE
+
+ RegisterSignal(parent, list(COMSIG_MOVABLE_CROSSED), .proc/Fatten)
+
+
+/datum/component/fattening_door/proc/Fatten() //GS13
+ to_chat(world, "fattenPass1")
+ //blocked = FALSE
+
+ var/turf/T = get_turf(parent)
+ for(var/mob/living/carbon/M in T)
+ //blocked = TRUE
+ stuck = M.AmountFatStunned()
+ // determine if mob should get stuck and be fattened
+ if(M.fatness >= FATNESS_LEVEL_BARELYMOBILE)
+ fatten = TRUE
+ if(!stuck)
+ stuck_delay = 120
+ M.visible_message(
+ "[M] gets stuck in the doorway!",
+ "You feel yourself get stuck in the doorway!")
+ else if(M.fatness >= FATNESS_LEVEL_MORBIDLY_OBESE)
+ fatten = TRUE
+ if(!stuck)
+ stuck_delay = 50
+ M.visible_message(
+ "[M] barely squeezes through the doorway!",
+ "You feel your sides barely squeeze through the doorway!")
+ else if(M.fatness >= FATNESS_LEVEL_FATTER)
+ fatten = TRUE
+ if(!stuck)
+ stuck_delay = 15
+ M.visible_message(
+ "[M]'s sides briefly smush against the doorway.",
+ "You feel your sides smush against the doorway!.")
+ else if(M.fatness >= FATNESS_LEVEL_FAT)
+ fatten = TRUE
+ if(!stuck)
+ stuck_delay = 5
+ M.visible_message(
+ "[M]'s sides briefly brush against the doorway.",
+ "You feel your sides briefly brush against the doorway!")
+ else
+ fatten = FALSE
+ stuck = FALSE
+ stuck_delay = 0
+
+ // This requires a rework unfortunately now that its moved into a datum component.
+ // I'll just make a custom status effect which stuns the player and while stunned, adds fatness :3
+ // if (fatten) // get stuck
+ // if (!stuck)
+ // M.Stun(stuck_delay/2) // give player time to escape
+ // stuck = TRUE
+ // if (stuck_delay > 0) // wait for stun to end
+ // stuck_delay = stuck_delay - fatten_delay
+ // if (stuck_delay <= 0)
+ // stuck_delay = 0
+ // // gain weight while stuck
+ // M.adjust_fatness(fat_to_add, FATTENING_TYPE_ITEM)
+
+ if(fatten)
+ M.FatStun(stuck_delay, fatAmount = fat_to_add)
+
+ // if (!blocked)
+ // stuck = FALSE // ready to go again
diff --git a/GainStation13/code/datums/status_effects/fatstun.dm b/GainStation13/code/datums/status_effects/fatstun.dm
new file mode 100644
index 00000000..b654b869
--- /dev/null
+++ b/GainStation13/code/datums/status_effects/fatstun.dm
@@ -0,0 +1,65 @@
+// Cba making a define file just for status effects so all the helper stuff goes here!~
+#define STATUS_EFFECT_FATSTUN /datum/status_effect/incapacitating/fatstun //the affected is knocked down
+
+////
+// Makes it so player is stunned and while stunned, fatness level grows.
+////
+/datum/status_effect/incapacitating/fatstun
+ id = "fatstun"
+ var/fatAmount = 1
+
+/datum/status_effect/incapacitating/fatstun/on_creation(mob/living/new_owner, set_duration, updating_canmove, fatnessAmount)
+ fatAmount = fatnessAmount
+ ..()
+
+/datum/status_effect/incapacitating/fatstun/tick()
+ var/mob/living/carbon/C = owner
+ if(C)
+ C.adjust_fatness(fatAmount, FATTENING_TYPE_ITEM) // simply adds/removes the fat overtime.
+ to_chat(owner, "You feel larger...")
+
+////
+// Helpers so it applies to the mob. (I cannot be bothered making a new file for this AUGH)
+////
+/mob/proc/IsFatStunned() //non-living mobs shouldn't be stunned
+ return FALSE
+
+/mob/living/IsFatStunned() //If we're knocked down
+ return has_status_effect(STATUS_EFFECT_FATSTUN)
+
+/mob/living/proc/AmountFatStunned() //How many deciseconds remain in our knockdown
+ var/datum/status_effect/incapacitating/fatstun/F = IsFatStunned()
+ if(F)
+ return F.duration - world.time
+ return 0
+
+/mob/living/proc/FatStun(amount, updating = TRUE, ignore_canstun = FALSE, fatAmount)
+ if(((status_flags & CANSTUN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
+ var/datum/status_effect/incapacitating/fatstun/F = IsFatStunned()
+ if(F)
+ F.duration = max(world.time + amount, F.duration)
+ else if(amount > 0)
+ F = apply_status_effect(STATUS_EFFECT_FATSTUN, amount, updating, fatAmount)
+ return F
+
+/mob/living/proc/SetFatStun(amount, updating = TRUE, ignore_canstun = FALSE) //Sets remaining duration
+ if(((status_flags & CANSTUN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
+ var/datum/status_effect/incapacitating/fatstun/F = IsFatStunned()
+ if(amount <= 0)
+ if(F)
+ qdel(F)
+ else
+ if(F)
+ F.duration = world.time + amount
+ else
+ F = apply_status_effect(STATUS_EFFECT_FATSTUN, amount, updating)
+ return F
+
+/mob/living/proc/AdjustFatStun(amount, updating = TRUE, ignore_canstun = FALSE) //Adds to remaining duration
+ if(((status_flags & CANSTUN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
+ var/datum/status_effect/incapacitating/fatstun/F = IsFatStunned()
+ if(F)
+ F.duration += amount
+ else if(amount > 0)
+ F = apply_status_effect(STATUS_EFFECT_FATSTUN, amount, updating)
+ return F
diff --git a/GainStation13/code/obj/structure/calorite_doors.dm b/GainStation13/code/obj/structure/calorite_doors.dm
index 16644c50..e2b5ff71 100644
--- a/GainStation13/code/obj/structure/calorite_doors.dm
+++ b/GainStation13/code/obj/structure/calorite_doors.dm
@@ -5,75 +5,10 @@
sheetType = /obj/item/stack/sheet/mineral/calorite
max_integrity = 200
light_range = 1
- var/fatten = FALSE // whether player will be fattened
- var/fatten_delay = 1 // ticks per periodic loop
- var/fat_to_add = 2 // fatness per tick stunned
- var/stuck = FALSE // whether player is stuck
- var/stuck_delay = 0 // set in proc/Fatten
- var/blocked = FALSE // whether door is blocked
+ state = TRUE
-// override /obj/structure/mineral_door/proc/Open()
-/obj/structure/mineral_door/calorite/Open() //GS13
- ..()
+/obj/structure/mineral_door/calorite/Initialize()
+ . = ..()
+ AddComponent(/datum/component/fattening_door)
+ update_icon()
- // start periodic loop
- stuck = FALSE
- START_PROCESSING(SSprocessing, src)
-
-/obj/structure/mineral_door/calorite/process()
- if(!state) // Door be closed!!!
- STOP_PROCESSING(SSprocessing, src)
-
- Fatten()
-
-/obj/structure/mineral_door/calorite/proc/Fatten() //GS13
- var/turf/T = get_turf(src)
- blocked = FALSE
- for(var/mob/living/carbon/M in T)
- blocked = TRUE
- // determine if mob should get stuck and be fattened
- if(M.fatness >= FATNESS_LEVEL_BARELYMOBILE)
- fatten = TRUE
- if (!stuck)
- stuck_delay = 120
- M.visible_message(
- "[M] gets stuck in the doorway!",
- "You feel yourself get stuck in the doorway!")
- else if(M.fatness >= FATNESS_LEVEL_MORBIDLY_OBESE)
- fatten = TRUE
- if (!stuck)
- stuck_delay = 50
- M.visible_message(
- "[M] barely squeezes through the doorway!",
- "You feel your sides barely squeeze through the doorway!")
- else if(M.fatness >= FATNESS_LEVEL_FATTER)
- fatten = TRUE
- if (!stuck)
- stuck_delay = 15
- M.visible_message(
- "[M]'s sides briefly smush against the doorway.",
- "You feel your sides smush against the doorway!.")
- else if(M.fatness >= FATNESS_LEVEL_FAT)
- fatten = TRUE
- if (!stuck)
- stuck_delay = 5
- M.visible_message(
- "[M]'s sides briefly brush against the doorway.",
- "You feel your sides briefly brush against the doorway!")
- else
- fatten = FALSE
- stuck = FALSE
- stuck_delay = 0
- if (fatten) // get stuck
- if (!stuck)
- M.Stun(stuck_delay/2) // give player time to escape
- stuck = TRUE
- if (stuck_delay > 0) // wait for stun to end
- stuck_delay = stuck_delay - fatten_delay
- if (stuck_delay <= 0)
- stuck_delay = 0
- // gain weight while stuck
- M.adjust_fatness(fat_to_add, FATTENING_TYPE_ITEM)
-
- if (!blocked)
- stuck = FALSE // ready to go again
diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi
index c2821354..f5751d0d 100644
Binary files a/icons/mob/screen_alert.dmi and b/icons/mob/screen_alert.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index da85bd33..0f5b7a2f 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -3074,6 +3074,8 @@
#include "code\modules\zombie\organs.dm"
#include "GainStation13\code\clothing\accessory.dm"
#include "GainStation13\code\clothing\calorite_collar.dm"
+#include "GainStation13\code\datums\components\fattening_door.dm"
+#include "GainStation13\code\datums\status_effects\fatstun.dm"
#include "GainStation13\code\game\lore_papers.dm"
#include "GainStation13\code\game\sound.dm"
#include "GainStation13\code\game\area\ruins.dm"