diff --git a/code/game/objects/structures/femur_breaker.dm b/code/game/objects/structures/femur_breaker.dm new file mode 100644 index 0000000000..077eb25688 --- /dev/null +++ b/code/game/objects/structures/femur_breaker.dm @@ -0,0 +1,174 @@ +#define BREAKER_ANIMATION_LENGTH 32 +#define BREAKER_SLAT_RAISED 1 +#define BREAKER_SLAT_MOVING 2 +#define BREAKER_SLAT_DROPPED 3 +#define BREAKER_ACTIVATE_DELAY 30 +#define BREAKER_WRENCH_DELAY 10 +#define BREAKER_ACTION_INUSE 5 +#define BREAKER_ACTION_WRENCH 6 + +/obj/structure/femur_breaker + name = "femur breaker" + desc = "A large structure used to break the femurs of traitors and treasonists." + icon = 'icons/obj/femur_breaker.dmi' + icon_state = "breaker_raised" + can_buckle = TRUE + anchored = TRUE + density = TRUE + max_buckled_mobs = 1 + buckle_lying = TRUE + buckle_prevents_pull = TRUE + layer = ABOVE_MOB_LAYER + var/slat_status = BREAKER_SLAT_RAISED + var/current_action = 0 // What's currently happening to the femur breaker + +/obj/structure/femur_breaker/examine(mob/user) + ..() + + var/msg = "" + + msg += "It is [anchored ? "secured to the floor." : "unsecured."]
" + + if (slat_status == BREAKER_SLAT_RAISED) + msg += "The breaker slat is in a neutral position." + else + msg += "The breaker slat is lowered, and must be raised." + + if (LAZYLEN(buckled_mobs)) + msg += "
" + msg += "Someone appears to be strapped in. You can help them unbuckle, or activate the femur breaker." + + to_chat(user, msg) + + return msg + +/obj/structure/femur_breaker/attack_hand(mob/user) + add_fingerprint(user) + + // Currently being used + if (current_action) + return + + switch (slat_status) + if (BREAKER_SLAT_MOVING) + return + if (BREAKER_SLAT_DROPPED) + slat_status = BREAKER_SLAT_MOVING + icon_state = "breaker_raise" + addtimer(CALLBACK(src, .proc/raise_slat), BREAKER_ANIMATION_LENGTH) + return + if (BREAKER_SLAT_RAISED) + if (LAZYLEN(buckled_mobs)) + if (user.a_intent == INTENT_HARM) + user.visible_message("[user] begins to pull the lever!", + "You begin to the pull the lever.") + current_action = BREAKER_ACTION_INUSE + + if (do_after(user, BREAKER_ACTIVATE_DELAY, target = src) && slat_status == BREAKER_SLAT_RAISED) + current_action = 0 + slat_status = BREAKER_SLAT_MOVING + icon_state = "breaker_drop" + drop_slat(user) + else + current_action = 0 + else + var/mob/living/carbon/human/H = buckled_mobs[1] + + if (H) + H.regenerate_icons() + + unbuckle_all_mobs() + else //HERE + slat_status = BREAKER_SLAT_DROPPED + icon_state = "breaker_drop" + +/obj/structure/femur_breaker/proc/damage_leg(mob/living/carbon/human/H) + H.say("AAAAAAAAAAAAAAAAAAAAAAAAAAAHHHHHHHHHHHHHHHHHHH!!", forced = "femur broken") + H.apply_damage(150, BRUTE, pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)) + +/obj/structure/femur_breaker/proc/raise_slat() + slat_status = BREAKER_SLAT_RAISED + icon_state = "breaker_raised" + +/obj/structure/femur_breaker/proc/drop_slat(mob/user) + if (buckled_mobs.len) + var/mob/living/carbon/human/H = buckled_mobs[1] + + if (!H) + return + + playsound(src, 'sound/effects/femur_breaker.ogg', 100, FALSE) + H.Stun(BREAKER_ANIMATION_LENGTH) + addtimer(CALLBACK(src, .proc/damage_leg, H), BREAKER_ANIMATION_LENGTH, TIMER_UNIQUE) + log_combat(user, H, "femur broke", src) + + slat_status = BREAKER_SLAT_DROPPED + icon_state = "breaker" + +/obj/structure/femur_breaker/buckle_mob(mob/living/M, force = FALSE, check_loc = TRUE) + if (!anchored) + to_chat(usr, "The [src] needs to be wrenched to the floor!") + return FALSE + + if (!istype(M, /mob/living/carbon/human)) + to_chat(usr, "It doesn't look like [M.p_they()] can fit into this properly!") + return FALSE + + if (slat_status != BREAKER_SLAT_RAISED) + to_chat(usr, "The femur breaker must be in its neutral position before buckling someone in!") + return FALSE + + return ..(M, force, FALSE) + +/obj/structure/femur_breaker/post_buckle_mob(mob/living/M) + if (!istype(M, /mob/living/carbon/human)) + return + + var/mob/living/carbon/human/H = M + + if (H.dna) + if (H.dna.species) + var/datum/species/S = H.dna.species + + if (!istype(S)) + unbuckle_all_mobs() + else + unbuckle_all_mobs() + else + unbuckle_all_mobs() + + ..() + +/obj/structure/femur_breaker/can_be_unfasten_wrench(mob/user, silent) + if (LAZYLEN(buckled_mobs)) + if (!silent) + to_chat(user, "Can't unfasten, someone's strapped in!") + return FAILED_UNFASTEN + + if (current_action) + return FAILED_UNFASTEN + + return ..() + +/obj/structure/femur_breaker/wrench_act(mob/living/user, obj/item/I) + if (current_action) + return + + current_action = BREAKER_ACTION_WRENCH + + if (do_after(user, BREAKER_WRENCH_DELAY, target = src)) + current_action = 0 + default_unfasten_wrench(user, I, 0) + setDir(SOUTH) + return TRUE + else + current_action = 0 + +#undef BREAKER_ANIMATION_LENGTH +#undef BREAKER_SLAT_RAISED +#undef BREAKER_SLAT_MOVING +#undef BREAKER_SLAT_DROPPED +#undef BREAKER_ACTIVATE_DELAY +#undef BREAKER_WRENCH_DELAY +#undef BREAKER_ACTION_INUSE +#undef BREAKER_ACTION_WRENCH \ No newline at end of file diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index 3c614c6a9e..025b4af578 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -660,6 +660,15 @@ tools = list(TOOL_SCREWDRIVER, TOOL_WRENCH, TOOL_WELDER) category = CAT_MISC +/datum/crafting_recipe/femur_breaker + name = "Femur Breaker" + result = /obj/structure/femur_breaker + time = 150 + reqs = list(/obj/item/stack/sheet/metal = 20, + /obj/item/stack/cable_coil = 30) + tools = list(TOOL_SCREWDRIVER, TOOL_WRENCH, TOOL_WELDER) + category = CAT_MISC + /datum/crafting_recipe/lizardhat name = "Lizard Cloche Hat" result = /obj/item/clothing/head/lizard diff --git a/icons/obj/femur_breaker.dmi b/icons/obj/femur_breaker.dmi new file mode 100644 index 0000000000..4b36f4b2b8 Binary files /dev/null and b/icons/obj/femur_breaker.dmi differ diff --git a/sound/effects/femur_breaker.ogg b/sound/effects/femur_breaker.ogg new file mode 100644 index 0000000000..140dc0477e Binary files /dev/null and b/sound/effects/femur_breaker.ogg differ diff --git a/tgstation.dme b/tgstation.dme index e1d7bd9b24..3e5f86b8b9 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -970,6 +970,7 @@ #include "code\game\objects\structures\electricchair.dm" #include "code\game\objects\structures\extinguisher.dm" #include "code\game\objects\structures\false_walls.dm" +#include "code\game\objects\structures\femur_breaker.dm" #include "code\game\objects\structures\fence.dm" #include "code\game\objects\structures\fireaxe.dm" #include "code\game\objects\structures\fireplace.dm"