diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm
index d7141f1b5a8..cf445b96e3c 100644
--- a/code/modules/antagonists/changeling/powers/mutations.dm
+++ b/code/modules/antagonists/changeling/powers/mutations.dm
@@ -454,7 +454,6 @@
flags = NODROP | DROPDEL
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
armor = list(MELEE = 40, BULLET = 40, LASER = 40, ENERGY = 20, BOMB = 10, RAD = 0, FIRE = 90, ACID = 90)
- var/armor_durability = 600
flags_inv = HIDEJUMPSUIT
cold_protection = 0
heat_protection = 0
@@ -467,35 +466,57 @@
/obj/item/clothing/suit/armor/changeling/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text, final_block_chance, damage)
. = ..()
- if(istype(hitby, /obj/item/projectile/energy/charged_plasma))
- armor_durability -= 200 // the plasma pistol is designed to be a niche tool for blasting through shields, may as well let it cut away armor
- else if(istype(hitby, /obj/item/projectile/plasma))
- armor_durability -= damage * 4
- else if(istype(hitby, /obj/item/projectile))
- var/obj/item/projectile/P = hitby
- if(P.damage_type == BURN)
- armor_durability -= damage * 2
- else
- armor_durability -= damage
- else
- var/obj/item/I = hitby
- if(istype(I, /obj/item/circular_saw))
- armor_durability -= 25 // saws used to cut away armor through an interaction, so let's keep them somewhat more effective
- else if(istype(I))
- if(I.damtype == BURN)
- armor_durability -= damage * 2
- else
- armor_durability -= damage
- else
- armor_durability--
- if(armor_durability <= 0)
- visible_message("[owner]'s chitinous armor collapses in clumps onto the ground.")
- new /obj/effect/decal/cleanable/shreds(owner.loc)
- // just unequip them since they qdel on drop
- owner.unEquip(src, TRUE, TRUE)
- if(istype(owner.head, /obj/item/clothing/head/helmet/changeling))
- owner.unEquip(owner.head, TRUE, TRUE)
+ if(!IS_HORIZONTAL(owner))
+ return
+
+ var/obj/item/I = hitby
+
+ if(!isliving(I.loc))
+ // Maybe it's on the ground? Maybe it's being used telekinetically? IDK
+ return
+
+ // The user who's wielding the tool
+ var/mob/living/user = I.loc
+
+ // snowflake checks my beloved
+ // this will become tooltype checks I swear
+ if(!istype(I, /obj/item/circular_saw) && !istype(I, /obj/item/twohanded/required/chainsaw) && !istype(I, /obj/item/twohanded/chainsaw))
+ return
+
+ user.visible_message(
+ "[user] starts to saw through [owner]'s [name].",
+ "You start to saw through [owner]'s [name].",
+ "You hear a loud grinding noise."
+ )
+
+ if(!do_after(user, 15 SECONDS, target = owner))
+ user.visible_message(
+ "[user] fails to cut through [owner]'s [name].",
+ "You fail to cut through [owner]'s [name].",
+ "You hear the grinding stop."
+ )
+ return FALSE
+
+ // check again after the do_after to make sure they haven't gotten up
+ if(!IS_HORIZONTAL(owner))
+ return FALSE
+
+ user.visible_message(
+ "\The [name] turns to shreds as [user] cleaves through it!",
+ "\The [name] turns to shreds as you cleave through it!",
+ "You hear something fall as the grinding ends."
+ )
+
+ playsound(I, I.hitsound, 50)
+ // you've torn it up, get rid of it.
+ new /obj/effect/decal/cleanable/shreds(owner.loc)
+ // just unequip them since they qdel on drop
+ owner.unEquip(src, TRUE, TRUE)
+ if(istype(owner.head, /obj/item/clothing/head/helmet/changeling))
+ owner.unEquip(owner.head, TRUE, TRUE)
+
+ return TRUE
/obj/item/clothing/head/helmet/changeling
name = "chitinous mass"
diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
index f098f5ac594..aa3adc82abb 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
@@ -139,20 +139,25 @@
to_chat(user, "This is not suitable for [src]!")
return
- if(victim.abiotic(TRUE))
- to_chat(user, "Subject may not have anything on their body.")
- return
-
user.visible_message("[user] starts to put [victim] into [src]!")
add_fingerprint(user)
- if(do_after(user, 30, target = victim) && user.Adjacent(src) && victim.Adjacent(user) && !occupant)
+
+ if(victim.abiotic(TRUE))
+ to_chat(user, "Clothing detected. Please speak to an engineer if any clothing jams up the interal grinders!")
+ if(do_after(user, 15 SECONDS, target = victim) && user.Adjacent(src) && victim.Adjacent(user) && !occupant) //15 seconds if they are not fully stripped, 12 more than normal. Similarly, takes about that long to strip a person in a ert hardsuit of all gear.
+ user.visible_message("[user] stuffs [victim] into [src]!")
+ else
+ return
+ else if(do_after(user, 3 SECONDS, target = victim) && user.Adjacent(src) && victim.Adjacent(user) && !occupant)
user.visible_message("[user] stuffs [victim] into [src]!")
+ else
+ return
+ victim.forceMove(src)
+ occupant = victim
- victim.forceMove(src)
- occupant = victim
+ update_icon(UPDATE_OVERLAYS | UPDATE_ICON_STATE)
+ INVOKE_ASYNC(src, PROC_REF(feedinTopanim))
- update_icon(UPDATE_OVERLAYS | UPDATE_ICON_STATE)
- INVOKE_ASYNC(src, PROC_REF(feedinTopanim))
/obj/machinery/gibber/verb/eject()
set category = "Object"
@@ -286,6 +291,26 @@
occupant.emote("scream")
playsound(get_turf(src), 'sound/goonstation/effects/gib.ogg', 50, 1)
victims += "\[[all_timestamps()]\] [key_name(occupant)] killed by [UserOverride ? "Autogibbing" : "[key_name(user)]"]" //have to do this before ghostizing
+ if(!stealthmode && ishuman(occupant))
+ var/mob/living/carbon/human/H = occupant
+ for(var/obj/item/I in H.get_contents())
+ if(I.resistance_flags & INDESTRUCTIBLE)
+ I.forceMove(get_turf(src))
+ if(H.get_item_by_slot(slot_wear_suit))
+ var/obj/item/ws = H.get_item_by_slot(slot_s_store)
+ if(ws.resistance_flags & INDESTRUCTIBLE)
+ ws.forceMove(get_turf(src))
+ H.s_store = null
+ if(H.get_item_by_slot(slot_l_store))
+ var/obj/item/ls = H.get_item_by_slot(slot_l_store)
+ if(ls.resistance_flags & INDESTRUCTIBLE)
+ ls.forceMove(get_turf(src))
+ H.l_store = null
+ if(H.get_item_by_slot(slot_r_store))
+ var/obj/item/rs = H.get_item_by_slot(slot_r_store)
+ if(rs.resistance_flags & INDESTRUCTIBLE)
+ rs.forceMove(get_turf(src))
+ H.r_store = null
occupant.death(1)
occupant.ghostize()