From c08774d96e12d9bbbcc08e08208da2200ef29c8f Mon Sep 17 00:00:00 2001 From: mwerezak Date: Mon, 18 May 2015 21:16:33 -0400 Subject: [PATCH] Updates bear traps Moves to trap.dm. Cleans up trap attacking code. Fixes trap remaining anchored once triggered. Instead of embedding, traps now buckle their victim into place. Deaf messages, where appropriate. Gave beartraps a more setting-friendly name. Conflicts: baystation12.dme --- baystation12.dme | 3 +- code/defines/obj/weapon.dm | 87 ----------------- code/game/objects/items/weapons/traps.dm | 114 +++++++++++++++++++++++ 3 files changed, 116 insertions(+), 88 deletions(-) create mode 100644 code/game/objects/items/weapons/traps.dm diff --git a/baystation12.dme b/baystation12.dme index ca633d5e16..99fb397579 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -631,8 +631,9 @@ #include "code\game\objects\items\weapons\swords_axes_etc.dm" #include "code\game\objects\items\weapons\tape.dm" #include "code\game\objects\items\weapons\teleportation.dm" -#include "code\game\objects\items\weapons\tools.dm" +#include "code\game\objects\items\weapons\tools.dm" #include "code\game\objects\items\weapons\trays.dm" +#include "code\game\objects\items\weapons\traps.dm" #include "code\game\objects\items\weapons\weaponry.dm" #include "code\game\objects\items\weapons\weldbackpack.dm" #include "code\game\objects\items\weapons\wires.dm" diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index e230dfa6c9..8c1377b53a 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -175,93 +175,6 @@ origin_tech = "materials=1" var/breakouttime = 300 //Deciseconds = 30s = 0.5 minute -/obj/item/weapon/beartrap - name = "bear trap" - throw_speed = 2 - throw_range = 1 - gender = PLURAL - icon = 'icons/obj/items.dmi' - icon_state = "beartrap0" - desc = "A trap used to catch bears and other legged creatures." - throwforce = 0 - w_class = 3.0 - origin_tech = "materials=1" - var/deployed = 0 - - suicide_act(mob/user) - viewers(user) << "[user] is putting the [src.name] on \his head! It looks like \he's trying to commit suicide." - return (BRUTELOSS) - -/obj/item/weapon/beartrap/attack_self(mob/user as mob) - ..() - if(ishuman(user) && !user.stat && !user.restrained()) - if(deployed==0) - user.visible_message("[user] is deploying \the [src]", "You are deploying \the [src]!") - if (do_after(user, 60)) - user.visible_message("[user] has deployed \the [src]", "You have deployed \the [src]!") - deployed = 1 - user.drop_from_inventory(src, user.loc) - update_icon() - anchored = 1 - -/obj/item/weapon/beartrap/attack_hand(mob/user as mob) - if(ishuman(user) && !user.stat && !user.restrained()) - if(deployed==1) - user.visible_message("[user] is disarming \the [src]", "You are disarming \the [src]!") - if (do_after(user, 60)) - user.visible_message("[user] has disarmed \the [src]", "You have disarmed \the [src]!") - deployed = 0 - anchored = 0 - update_icon() - - if(deployed==0) - ..() - -/obj/item/weapon/beartrap/Crossed(AM as mob|obj) - if(deployed) - if(ishuman(AM)) - if(isturf(src.loc)) - var/mob/living/carbon/human/H = AM - if(H.m_intent == "run") - deployed = 0 - update_icon() - H << "You step on \the [src]!" - for(var/mob/O in viewers(H, null)) - if(O == H) - continue - O.show_message("[H] steps on \the [src].", 1) - if(H.lying) - var/obj/item/organ/external/affecting = pick(H.organs) - if(affecting.take_damage(30, 0)) - H.UpdateDamageIcon() - affecting.embed(src) - else - var/list/potentialorgans = list() - for(var/organ in list("l_leg", "r_leg", "l_foot", "r_foot")) - var/obj/item/organ/external/R = H.get_organ(organ) - if(R && !(R.status & ORGAN_DESTROYED)) - potentialorgans += R - var/obj/item/organ/external/affecting = pick(potentialorgans) - if(affecting.take_damage(30, 0)) - H.UpdateDamageIcon() - affecting.embed(src) - - - if(isanimal(AM) && !istype(AM, /mob/living/simple_animal/parrot) && !istype(AM, /mob/living/simple_animal/construct) && !istype(AM, /mob/living/simple_animal/shade) && !istype(AM, /mob/living/simple_animal/hostile/viscerator)) - deployed = 0 - var/mob/living/simple_animal/SA = AM - SA.health -= 20 - ..() - -/obj/item/weapon/beartrap/update_icon() - ..() - - if(deployed == 0) - icon_state = "beartrap0" - else - icon_state = "beartrap1" - - /obj/item/weapon/caution desc = "Caution! Wet Floor!" name = "wet floor sign" diff --git a/code/game/objects/items/weapons/traps.dm b/code/game/objects/items/weapons/traps.dm new file mode 100644 index 0000000000..f6af73843c --- /dev/null +++ b/code/game/objects/items/weapons/traps.dm @@ -0,0 +1,114 @@ +/obj/item/weapon/beartrap + name = "mechanical trap" + throw_speed = 2 + throw_range = 1 + gender = PLURAL + icon = 'icons/obj/items.dmi' + icon_state = "beartrap0" + desc = "A mechanically activated leg trap. Low-tech, but reliable. Looks like it could really hurt if you set it off." + throwforce = 0 + w_class = 3 + origin_tech = "materials=1" + var/deployed = 0 + +/obj/item/weapon/beartrap/suicide_act(mob/user) + viewers(user) << "[user] is putting the [src.name] on \his head! It looks like \he's trying to commit suicide." + return (BRUTELOSS) + +/obj/item/weapon/beartrap/proc/can_use(mob/user) + return (user.IsAdvancedToolUser() && !issilicon(user) && !user.stat && !user.restrained()) + +/obj/item/weapon/beartrap/attack_self(mob/user as mob) + ..() + if(deployed && can_use(user)) + user.visible_message( + "[user] starts to deploy \the [src].", + "You begin deploying \the [src]!", + "You hear the slow creaking of a spring." + ) + + if (do_after(user, 60)) + user.visible_message( + "[user] has deployed \the [src].", + "You have deployed \the [src]!", + "You hear a latch click loudly." + ) + + deployed = 1 + user.drop_from_inventory(src) + update_icon() + anchored = 1 + +/obj/item/weapon/beartrap/attack_hand(mob/user as mob) + if(buckled_mob && can_use(user)) + user.visible_message( + "[user] begins freeing [buckled_mob] from \the [src].", + "You carefully begin to free [buckled_mob] from \the [src].", + ) + if(do_after(user, 60)) + user.visible_message("[buckled_mob] has been freed from \the [src] by [user].") + unbuckle_mob() + anchored = 0 + else if(deployed && can_use(user)) + user.visible_message( + "[user] starts to disarm \the [src].", + "You begin disarming \the [src]!", + "You hear a latch click followed by the slow creaking of a spring." + ) + if(do_after(user, 60)) + user.visible_message( + "[user] has disarmed \the [src].", + "You have disarmed \the [src]!" + ) + deployed = 0 + anchored = 0 + update_icon() + else + ..() + +/obj/item/weapon/beartrap/proc/attack_mob(mob/living/L) + + var/target_zone + if(L.lying) + target_zone = ran_zone() + else + target_zone = pick("l_foot", "r_foot", "l_leg", "r_leg") + + //armour + var/blocked = L.run_armor_check(target_zone, "melee") + + if(blocked >= 2) + return + + if(!L.apply_damage(30, BRUTE, target_zone, blocked, used_weapon=src)) + return 0 + + //trap the victim in place + if(!blocked) + set_dir(L.dir) + buckle_mob(L) + L << "The steel jaws of \the [src] bite into you, trapping you in place!" + +/obj/item/weapon/beartrap/Crossed(AM as mob|obj) + if(isliving(AM)) + var/mob/living/L = AM + if(L.m_intent == "run") + L.visible_message( + "[L] steps on \the [src].", + "You step on \the [src]!", + "You hear a loud metallic snap!" + ) + attack_mob(L) + if(!buckled_mob) + anchored = 0 + deployed = 0 + update_icon() + ..() + +/obj/item/weapon/beartrap/update_icon() + ..() + + if(!deployed) + icon_state = "beartrap0" + else + icon_state = "beartrap1"