diff --git a/GainStation13/code/datums/components/fattening_door.dm b/GainStation13/code/datums/components/fattening_door.dm
new file mode 100644
index 00000000..e2c7f9af
--- /dev/null
+++ b/GainStation13/code/datums/components/fattening_door.dm
@@ -0,0 +1,44 @@
+/datum/component/fattening_door
+ var/fatten = FALSE // whether player will be fattened
+ var/fat_to_add = 2 // fatness per tick stunned
+
+/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
+ var/stuck_delay = 0
+ var/turf/T = get_turf(parent)
+
+ for(var/mob/living/carbon/M in T)
+ var/vis_message_self = ""
+ var/vis_message_others = ""
+ // determine if mob should get stuck and be fattened
+ if(M.fatness >= FATNESS_LEVEL_FAT)
+ if(!M.AmountFatStunned())
+ fatten = TRUE
+ stuck_delay = 5
+ vis_message_self = "You feel your sides briefly brush against the doorway!"
+ vis_message_others = "[M]'s sides briefly brush against the doorway."
+
+ // Scales depending on this switch.
+ switch(M.fatness)
+ if(FATNESS_LEVEL_BARELYMOBILE to INFINITY)
+ stuck_delay = 120
+ vis_message_self = "You feel yourself get stuck in the doorway!"
+ vis_message_others = "[M] gets stuck in the doorway!"
+ if((FATNESS_LEVEL_FATTER+1) to FATNESS_LEVEL_MORBIDLY_OBESE)
+ stuck_delay = 50
+ vis_message_self ="You feel your sides barely squeeze through the doorway!"
+ vis_message_others = "[M] barely squeezes through the doorway!"
+ if((FATNESS_LEVEL_FAT+1) to FATNESS_LEVEL_FATTER)
+ stuck_delay = 15
+ vis_message_self = "You feel your sides smush against the doorway!."
+ vis_message_others = "[M]'s sides briefly smush against the doorway."
+
+ // Apply the fatstun
+ if(fatten)
+ M.visible_message("[vis_message_others]", "[vis_message_self]")
+ M.FatStun(stuck_delay, fatAmount = fat_to_add) // DOOR STUCK
diff --git a/GainStation13/code/datums/status_effects/fatstun.dm b/GainStation13/code/datums/status_effects/fatstun.dm
new file mode 100644
index 00000000..da4727c7
--- /dev/null
+++ b/GainStation13/code/datums/status_effects/fatstun.dm
@@ -0,0 +1,64 @@
+// Cba making a define file just for status effects so all the helper stuff goes here!~
+#define STATUS_EFFECT_FATSTUN /datum/status_effect/incapacitating/stun/fat //the affected is knocked down
+
+////
+// Makes it so player is stunned and while stunned, fatness level grows.
+////
+/datum/status_effect/incapacitating/stun/fat
+ var/fatAmount = 1
+
+/datum/status_effect/incapacitating/stun/fat/on_creation(mob/living/new_owner, set_duration, updating_canmove, fatnessAmount)
+ fatAmount = fatnessAmount
+ ..()
+
+/datum/status_effect/incapacitating/stun/fat/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...") // debugging to see if the stun works.
+
+////
+// 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/stun/fat/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/stun/fat/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/stun/fat/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/stun/fat/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..1f24ceae 100644
--- a/GainStation13/code/obj/structure/calorite_doors.dm
+++ b/GainStation13/code/obj/structure/calorite_doors.dm
@@ -5,75 +5,14 @@
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
+ // Sets it open by default
+ state = TRUE
+ density = FALSE
-// override /obj/structure/mineral_door/proc/Open()
-/obj/structure/mineral_door/calorite/Open() //GS13
- ..()
+// If you ever want to make any door like this, just simply add the component like this :3
+/obj/structure/mineral_door/calorite/Initialize()
+ . = ..()
+ AddComponent(/datum/component/fattening_door)
- // start periodic loop
- stuck = FALSE
- START_PROCESSING(SSprocessing, src)
+ update_icon() // Updates the sprite when spawned in cause it's closed by default.
-/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"