|
|
|
@@ -15,12 +15,17 @@
|
|
|
|
|
name = "bear trap"
|
|
|
|
|
throw_speed = 1
|
|
|
|
|
throw_range = 1
|
|
|
|
|
icon_state = "beartrap0"
|
|
|
|
|
icon_state = "beartrap"
|
|
|
|
|
desc = "A trap used to catch bears and other legged creatures."
|
|
|
|
|
var/armed = 0
|
|
|
|
|
var/trap_damage = 20
|
|
|
|
|
var/obj/item/weapon/grenade/iedcasing/IED = null
|
|
|
|
|
var/obj/item/device/assembly/signaler/sig = null
|
|
|
|
|
|
|
|
|
|
/obj/item/weapon/restraints/legcuffs/beartrap/New()
|
|
|
|
|
..()
|
|
|
|
|
icon_state = "[initial(icon_state)][armed]"
|
|
|
|
|
|
|
|
|
|
/obj/item/weapon/restraints/legcuffs/beartrap/Destroy()
|
|
|
|
|
if(IED)
|
|
|
|
|
qdel(IED)
|
|
|
|
@@ -35,14 +40,14 @@
|
|
|
|
|
playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
|
|
|
|
|
return (BRUTELOSS)
|
|
|
|
|
|
|
|
|
|
/obj/item/weapon/restraints/legcuffs/beartrap/attack_self(mob/user as mob)
|
|
|
|
|
/obj/item/weapon/restraints/legcuffs/beartrap/attack_self(mob/user)
|
|
|
|
|
..()
|
|
|
|
|
if(ishuman(user) && !user.stat && !user.restrained())
|
|
|
|
|
armed = !armed
|
|
|
|
|
icon_state = "beartrap[armed]"
|
|
|
|
|
icon_state = "[initial(icon_state)][armed]"
|
|
|
|
|
to_chat(user, "<span class='notice'>[src] is now [armed ? "armed" : "disarmed"]</span>")
|
|
|
|
|
|
|
|
|
|
/obj/item/weapon/restraints/legcuffs/beartrap/attackby(var/obj/item/I, mob/user as mob) //Let's get explosive.
|
|
|
|
|
/obj/item/weapon/restraints/legcuffs/beartrap/attackby(obj/item/I, mob/user) //Let's get explosive.
|
|
|
|
|
if(istype(I, /obj/item/weapon/grenade/iedcasing))
|
|
|
|
|
if(IED)
|
|
|
|
|
to_chat(user, "<span class='warning'>This beartrap already has an IED hooked up to it!</span>")
|
|
|
|
@@ -101,7 +106,7 @@
|
|
|
|
|
if( (iscarbon(AM) || 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))
|
|
|
|
|
var/mob/living/L = AM
|
|
|
|
|
armed = 0
|
|
|
|
|
icon_state = "beartrap0"
|
|
|
|
|
icon_state = "[initial(icon_state)][armed]"
|
|
|
|
|
playsound(src.loc, 'sound/effects/snap.ogg', 50, 1)
|
|
|
|
|
L.visible_message("<span class='danger'>[L] triggers \the [src].</span>", \
|
|
|
|
|
"<span class='userdanger'>You trigger \the [src]!</span>")
|
|
|
|
@@ -122,9 +127,9 @@
|
|
|
|
|
if(ishuman(AM))
|
|
|
|
|
var/mob/living/carbon/H = AM
|
|
|
|
|
if(H.lying)
|
|
|
|
|
H.apply_damage(20,BRUTE,"chest")
|
|
|
|
|
H.apply_damage(trap_damage, BRUTE,"chest")
|
|
|
|
|
else
|
|
|
|
|
H.apply_damage(20,BRUTE,(pick("l_leg", "r_leg")))
|
|
|
|
|
H.apply_damage(trap_damage, BRUTE,(pick("l_leg", "r_leg")))
|
|
|
|
|
if(!H.legcuffed) //beartrap can't cuff you leg if there's already a beartrap or legcuffs.
|
|
|
|
|
H.legcuffed = src
|
|
|
|
|
src.loc = H
|
|
|
|
@@ -132,95 +137,75 @@
|
|
|
|
|
feedback_add_details("handcuffs","B") //Yes, I know they're legcuffs. Don't change this, no need for an extra variable. The "B" is used to tell them apart.
|
|
|
|
|
|
|
|
|
|
else
|
|
|
|
|
L.apply_damage(20,BRUTE)
|
|
|
|
|
L.apply_damage(trap_damage, BRUTE)
|
|
|
|
|
..()
|
|
|
|
|
|
|
|
|
|
/obj/item/weapon/restraints/legcuffs/beartrap/energy
|
|
|
|
|
name = "energy snare"
|
|
|
|
|
armed = 1
|
|
|
|
|
icon_state = "e_snare"
|
|
|
|
|
trap_damage = 0
|
|
|
|
|
|
|
|
|
|
/obj/item/weapon/legcuffs/bolas
|
|
|
|
|
name = "bolas"
|
|
|
|
|
desc = "An entangling bolas. Throw at your foes to trip them and prevent them from running."
|
|
|
|
|
/obj/item/weapon/restraints/legcuffs/beartrap/energy/New()
|
|
|
|
|
..()
|
|
|
|
|
spawn(100)
|
|
|
|
|
if(!istype(loc, /mob))
|
|
|
|
|
var/datum/effect/system/spark_spread/sparks = new /datum/effect/system/spark_spread
|
|
|
|
|
sparks.set_up(1, 1, src)
|
|
|
|
|
sparks.start()
|
|
|
|
|
qdel(src)
|
|
|
|
|
|
|
|
|
|
/obj/item/weapon/restraints/legcuffs/beartrap/energy/dropped()
|
|
|
|
|
..()
|
|
|
|
|
qdel(src)
|
|
|
|
|
|
|
|
|
|
/obj/item/weapon/restraints/legcuffs/beartrap/energy/attack_hand(mob/user)
|
|
|
|
|
Crossed(user) //honk
|
|
|
|
|
|
|
|
|
|
/obj/item/weapon/restraints/legcuffs/beartrap/energy/cyborg
|
|
|
|
|
breakouttime = 20 // Cyborgs shouldn't have a strong restraint
|
|
|
|
|
|
|
|
|
|
/obj/item/weapon/restraints/legcuffs/bola
|
|
|
|
|
name = "bola"
|
|
|
|
|
desc = "A restraining device designed to be thrown at the target. Upon connecting with said target, it will wrap around their legs, making it difficult for them to move quickly."
|
|
|
|
|
icon_state = "bola"
|
|
|
|
|
breakouttime = 35//easy to apply, easy to break out of
|
|
|
|
|
gender = NEUTER
|
|
|
|
|
icon = 'icons/obj/weapons.dmi'
|
|
|
|
|
icon_state = "bolas"
|
|
|
|
|
slot_flags = SLOT_BELT
|
|
|
|
|
throwforce = 2
|
|
|
|
|
origin_tech = "engineering=3;combat=1"
|
|
|
|
|
var/weaken = 0
|
|
|
|
|
|
|
|
|
|
/obj/item/weapon/restraints/legcuffs/bola/throw_impact(atom/hit_atom)
|
|
|
|
|
if(..() || !iscarbon(hit_atom))//if it gets caught or the target can't be cuffed,
|
|
|
|
|
return//abort
|
|
|
|
|
var/mob/living/carbon/C = hit_atom
|
|
|
|
|
if(!C.legcuffed)
|
|
|
|
|
visible_message("<span class='danger'>\The [src] ensnares [C]!</span>")
|
|
|
|
|
C.legcuffed = src
|
|
|
|
|
src.loc = C
|
|
|
|
|
C.update_inv_legcuffed()
|
|
|
|
|
feedback_add_details("handcuffs","B")
|
|
|
|
|
to_chat(C, "<span class='userdanger'>\The [src] ensnares you!</span>")
|
|
|
|
|
C.Weaken(weaken)
|
|
|
|
|
|
|
|
|
|
/obj/item/weapon/restraints/legcuffs/bola/tactical //traitor variant
|
|
|
|
|
name = "reinforced bola"
|
|
|
|
|
desc = "A strong bola, made with a long steel chain. It looks heavy, enough so that it could trip somebody."
|
|
|
|
|
icon_state = "bola_r"
|
|
|
|
|
breakouttime = 70
|
|
|
|
|
origin_tech = "engineering=4;combat=3"
|
|
|
|
|
weaken = 1
|
|
|
|
|
|
|
|
|
|
/obj/item/weapon/restraints/legcuffs/bola/energy //For Security
|
|
|
|
|
name = "energy bola"
|
|
|
|
|
desc = "A specialized hard-light bola designed to ensnare fleeing criminals and aid in arrests."
|
|
|
|
|
icon_state = "ebola"
|
|
|
|
|
hitsound = 'sound/weapons/tase.ogg'
|
|
|
|
|
w_class = 2
|
|
|
|
|
origin_tech = "materials=1"
|
|
|
|
|
attack_verb = list("lashed", "bludgeoned", "whipped")
|
|
|
|
|
force = 4
|
|
|
|
|
breakouttime = 50 //10 seconds
|
|
|
|
|
throw_speed = 1
|
|
|
|
|
throw_range = 10
|
|
|
|
|
var/dispenser = 0
|
|
|
|
|
var/throw_sound = 'sound/weapons/whip.ogg'
|
|
|
|
|
var/trip_prob = 60
|
|
|
|
|
var/thrown_from
|
|
|
|
|
breakouttime = 60
|
|
|
|
|
|
|
|
|
|
/obj/item/weapon/legcuffs/bolas/suicide_act(mob/living/user)
|
|
|
|
|
to_chat(viewers(user), "<span class='danger'>[user] is wrapping the [src.name] around \his neck! It looks like \he's trying to commit suicide.</span>")
|
|
|
|
|
return(OXYLOSS)
|
|
|
|
|
|
|
|
|
|
/obj/item/weapon/legcuffs/bolas/throw_at(var/atom/A, throw_range, throw_speed)
|
|
|
|
|
if(usr && !istype(thrown_from, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/bolas)) //if there is a user, but not a mech
|
|
|
|
|
if(istype(usr, /mob/living/carbon/human)) //if the user is human
|
|
|
|
|
var/mob/living/carbon/human/H = usr
|
|
|
|
|
if((CLUMSY in H.mutations) && prob(50))
|
|
|
|
|
to_chat(H, "<span class='warning'>You smack yourself in the face while swinging the [src]!</span>")
|
|
|
|
|
H.Stun(2)
|
|
|
|
|
H.drop_item(src)
|
|
|
|
|
return
|
|
|
|
|
if(!thrown_from && usr) //if something hasn't set it already (like a mech does when it launches)
|
|
|
|
|
thrown_from = usr //then the user must have thrown it
|
|
|
|
|
if(!istype(thrown_from, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/bolas))
|
|
|
|
|
playsound(src, throw_sound, 20, 1) //because mechs play the sound anyways
|
|
|
|
|
var/turf/target = get_turf(A)
|
|
|
|
|
var/atom/movable/adjtarget = new /atom/movable
|
|
|
|
|
var/xadjust = 0
|
|
|
|
|
var/yadjust = 0
|
|
|
|
|
var/scaler = 0 //used to changed the normalised vector to the proper size
|
|
|
|
|
scaler = throw_range / max(abs(target.x - src.x), abs(target.y - src.y)) //whichever is larger magnitude is what we normalise to
|
|
|
|
|
if(target.x - src.x != 0) //just to avoid fucking with math for no reason
|
|
|
|
|
xadjust = round((target.x - src.x) * scaler) //normalised vector is now scaled up to throw_range
|
|
|
|
|
adjtarget.x = src.x + xadjust //the new target at max range
|
|
|
|
|
else
|
|
|
|
|
adjtarget.x = src.x
|
|
|
|
|
if(target.y - src.y != 0)
|
|
|
|
|
yadjust = round((target.y - src.y) * scaler)
|
|
|
|
|
adjtarget.y = src.y + yadjust
|
|
|
|
|
else
|
|
|
|
|
adjtarget.y = src.y
|
|
|
|
|
// log_admin("Adjusted target of [adjtarget.x] and [adjtarget.y], adjusted with [xadjust] and [yadjust] from [scaler]")
|
|
|
|
|
..(get_turf(adjtarget), throw_range, throw_speed)
|
|
|
|
|
thrown_from = null
|
|
|
|
|
|
|
|
|
|
/obj/item/weapon/legcuffs/bolas/throw_impact(atom/hit_atom) //Pomf was right, I was wrong - Comic
|
|
|
|
|
if(isliving(hit_atom) && hit_atom != usr) //if the target is a live creature other than the thrower
|
|
|
|
|
var/mob/living/M = hit_atom
|
|
|
|
|
if(ishuman(M)) //if they're a human species
|
|
|
|
|
var/mob/living/carbon/human/H = M
|
|
|
|
|
if(H.legcuffed) //if the target is already legcuffed (has to be walking)
|
|
|
|
|
throw_failed()
|
|
|
|
|
return
|
|
|
|
|
if(prob(trip_prob)) //this probability is up for change and mostly a placeholder - Comic
|
|
|
|
|
step(H, H.dir)
|
|
|
|
|
H.visible_message("<span class='warning'>[H] was tripped by the bolas!</span>","<span class='warning'>Your legs have been tangled!</span>");
|
|
|
|
|
H.Stun(2) //used instead of setting damage in vars to avoid non-human targets being affected
|
|
|
|
|
H.Weaken(4)
|
|
|
|
|
H.legcuffed = src //applies legcuff properties inherited through legcuffs
|
|
|
|
|
src.loc = H
|
|
|
|
|
H.update_inv_legcuffed()
|
|
|
|
|
if(!H.legcuffed) //in case it didn't happen, we need a safety net
|
|
|
|
|
throw_failed()
|
|
|
|
|
else
|
|
|
|
|
M.Stun(2) //minor stun damage to anything not human
|
|
|
|
|
throw_failed()
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
/obj/item/weapon/legcuffs/bolas/proc/throw_failed() //called when the throw doesn't entangle
|
|
|
|
|
//log_admin("Logged as [thrown_from]")
|
|
|
|
|
if(!thrown_from || !istype(thrown_from, /mob/living)) //in essence, if we don't know whether a person threw it
|
|
|
|
|
qdel(src) //destroy it, to stop infinite bolases
|
|
|
|
|
|
|
|
|
|
/obj/item/weapon/legcuffs/bolas/Bump()
|
|
|
|
|
..()
|
|
|
|
|
throw_failed() //allows a mech bolas to be destroyed
|
|
|
|
|
/obj/item/weapon/restraints/legcuffs/bola/energy/throw_impact(atom/hit_atom)
|
|
|
|
|
if(iscarbon(hit_atom))
|
|
|
|
|
var/obj/item/weapon/restraints/legcuffs/beartrap/B = new /obj/item/weapon/restraints/legcuffs/beartrap/energy/cyborg(get_turf(hit_atom))
|
|
|
|
|
B.Crossed(hit_atom)
|
|
|
|
|
qdel(src)
|
|
|
|
|
..()
|