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()