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"