|
|
|
|
@@ -28,15 +28,8 @@
|
|
|
|
|
var/health = 80 // the turret's health
|
|
|
|
|
var/locked = 1 // if the turret's behaviour control access is locked
|
|
|
|
|
|
|
|
|
|
var/installation // the type of weapon installed
|
|
|
|
|
var/gun_charge = 0 // the charge of the gun inserted
|
|
|
|
|
var/projectile = null //holder for bullettype
|
|
|
|
|
var/eprojectile = null//holder for the shot when emagged
|
|
|
|
|
var/reqpower = 0 //holder for power needed
|
|
|
|
|
var/fire_sound = 'sound/weapons/Laser.ogg'
|
|
|
|
|
var/efire_sound = 'sound/weapons/Laser.ogg'
|
|
|
|
|
var/iconholder = null//holder for the icon_state
|
|
|
|
|
var/egun = null//holder to handle certain guns switching bullettypes
|
|
|
|
|
var/obj/item/weapon/gun/energy/installed = null // the type of weapon installed
|
|
|
|
|
var/reqpower = 750 //power used per shot
|
|
|
|
|
|
|
|
|
|
var/obj/machinery/porta_turret_cover/cover = null // the cover that is covering this turret
|
|
|
|
|
var/last_fired = 0 // 1: if the turret is cooling down from a shot, 0: turret is ready to fire
|
|
|
|
|
@@ -51,13 +44,12 @@
|
|
|
|
|
|
|
|
|
|
var/attacked = 0 // if set to 1, the turret gets pissed off and shoots at people nearby (unless they have sec access!)
|
|
|
|
|
|
|
|
|
|
//var/emagged = 0 // 1: emagged, 0: not emagged
|
|
|
|
|
var/on = 1 // determines if the turret is on
|
|
|
|
|
var/disabled = 0
|
|
|
|
|
|
|
|
|
|
var/datum/effect/effect/system/spark_spread/spark_system // the spark system, used for generating... sparks?
|
|
|
|
|
|
|
|
|
|
machine_flags = EMAGGABLE
|
|
|
|
|
machine_flags = EMAGGABLE | SHUTTLEWRENCH
|
|
|
|
|
|
|
|
|
|
/obj/machinery/porta_turret/New()
|
|
|
|
|
..()
|
|
|
|
|
@@ -66,24 +58,19 @@
|
|
|
|
|
spark_system = new /datum/effect/effect/system/spark_spread
|
|
|
|
|
spark_system.set_up(5, 0, src)
|
|
|
|
|
spark_system.attach(src)
|
|
|
|
|
power_change()
|
|
|
|
|
spawn(10)
|
|
|
|
|
update_gun()
|
|
|
|
|
|
|
|
|
|
/obj/machinery/porta_turret/proc/update_gun()
|
|
|
|
|
if(!installation)// if for some reason the turret has no gun (ie, admin spawned) it resorts to basic taser shots
|
|
|
|
|
projectile = /obj/item/projectile/energy/electrode//holder for the projectile, here it is being set
|
|
|
|
|
eprojectile = /obj/item/projectile/beam//holder for the projectile when emagged, if it is different
|
|
|
|
|
reqpower = 200
|
|
|
|
|
iconholder = 1
|
|
|
|
|
if(!installed)// if for some reason the turret has no gun (ie, admin spawned) it resorts to basic taser shots
|
|
|
|
|
installed = new /obj/item/weapon/gun/energy/taser(src)
|
|
|
|
|
|
|
|
|
|
else
|
|
|
|
|
var/obj/item/weapon/gun/energy/E=new installation
|
|
|
|
|
// All energy-based weapons are applicable
|
|
|
|
|
var/obj/item/weapon/gun/energy/E = installed
|
|
|
|
|
|
|
|
|
|
switch(E.type)
|
|
|
|
|
if(/obj/item/weapon/gun/energy/laser/bluetag)
|
|
|
|
|
projectile = /obj/item/projectile/beam/lasertag/blue
|
|
|
|
|
eprojectile = /obj/item/projectile/beam/lasertag/omni//This bolt will stun ERRYONE with a vest
|
|
|
|
|
iconholder = null
|
|
|
|
|
reqpower = 100
|
|
|
|
|
lasercolor = "b"
|
|
|
|
|
req_access = list(access_maint_tunnels)
|
|
|
|
|
check_records = 0
|
|
|
|
|
@@ -91,13 +78,8 @@
|
|
|
|
|
auth_weapons = 1
|
|
|
|
|
stun_all = 0
|
|
|
|
|
check_anomalies = 0
|
|
|
|
|
shot_delay = 30
|
|
|
|
|
|
|
|
|
|
if(/obj/item/weapon/gun/energy/laser/redtag)
|
|
|
|
|
projectile = /obj/item/projectile/beam/lasertag/red
|
|
|
|
|
eprojectile = /obj/item/projectile/beam/lasertag/omni
|
|
|
|
|
iconholder = null
|
|
|
|
|
reqpower = 100
|
|
|
|
|
lasercolor = "r"
|
|
|
|
|
req_access = list(access_maint_tunnels)
|
|
|
|
|
check_records = 0
|
|
|
|
|
@@ -105,140 +87,12 @@
|
|
|
|
|
auth_weapons = 1
|
|
|
|
|
stun_all = 0
|
|
|
|
|
check_anomalies = 0
|
|
|
|
|
shot_delay = 30
|
|
|
|
|
|
|
|
|
|
if(/obj/item/weapon/gun/energy/laser/practice)
|
|
|
|
|
projectile = /obj/item/projectile/beam/practice
|
|
|
|
|
eprojectile = /obj/item/projectile/beam
|
|
|
|
|
iconholder = null
|
|
|
|
|
reqpower = 100
|
|
|
|
|
|
|
|
|
|
if(/obj/item/weapon/gun/energy/pulse_rifle)
|
|
|
|
|
projectile = /obj/item/projectile/beam/pulse
|
|
|
|
|
eprojectile = projectile
|
|
|
|
|
iconholder = null
|
|
|
|
|
reqpower = 700
|
|
|
|
|
fire_sound = 'sound/weapons/pulse.ogg'
|
|
|
|
|
efire_sound = fire_sound
|
|
|
|
|
|
|
|
|
|
if(/obj/item/weapon/gun/energy/staff)
|
|
|
|
|
projectile = /obj/item/projectile/change
|
|
|
|
|
eprojectile = projectile
|
|
|
|
|
iconholder = 1
|
|
|
|
|
reqpower = 700
|
|
|
|
|
fire_sound = 'sound/weapons/radgun.ogg'
|
|
|
|
|
efire_sound = fire_sound
|
|
|
|
|
|
|
|
|
|
if(/obj/item/weapon/gun/energy/ionrifle)
|
|
|
|
|
projectile = /obj/item/projectile/ion
|
|
|
|
|
eprojectile = projectile
|
|
|
|
|
iconholder = 1
|
|
|
|
|
reqpower = 700
|
|
|
|
|
fire_sound = 'sound/weapons/ion.ogg'
|
|
|
|
|
efire_sound = fire_sound
|
|
|
|
|
|
|
|
|
|
if(/obj/item/weapon/gun/energy/taser)
|
|
|
|
|
projectile = /obj/item/projectile/energy/electrode
|
|
|
|
|
eprojectile = projectile
|
|
|
|
|
iconholder = 1
|
|
|
|
|
reqpower = 200
|
|
|
|
|
fire_sound = 'sound/weapons/Taser.ogg'
|
|
|
|
|
efire_sound = fire_sound
|
|
|
|
|
|
|
|
|
|
if(/obj/item/weapon/gun/energy/stunrevolver)
|
|
|
|
|
projectile = /obj/item/projectile/energy/electrode
|
|
|
|
|
eprojectile = projectile
|
|
|
|
|
iconholder = 1
|
|
|
|
|
reqpower = 200
|
|
|
|
|
fire_sound = 'sound/weapons/Gunshot.ogg'
|
|
|
|
|
efire_sound = fire_sound
|
|
|
|
|
|
|
|
|
|
if(/obj/item/weapon/gun/energy/lasercannon)
|
|
|
|
|
projectile = /obj/item/projectile/beam/heavylaser
|
|
|
|
|
eprojectile = projectile
|
|
|
|
|
iconholder = null
|
|
|
|
|
reqpower = 600
|
|
|
|
|
fire_sound = 'sound/weapons/lasercannonfire.ogg'
|
|
|
|
|
efire_sound = fire_sound
|
|
|
|
|
|
|
|
|
|
if(/obj/item/weapon/gun/energy/decloner)
|
|
|
|
|
projectile = /obj/item/projectile/energy/declone
|
|
|
|
|
eprojectile = projectile
|
|
|
|
|
iconholder = null
|
|
|
|
|
reqpower = 600
|
|
|
|
|
fire_sound = 'sound/weapons/pulse3.ogg'
|
|
|
|
|
efire_sound = fire_sound
|
|
|
|
|
|
|
|
|
|
if(/obj/item/weapon/gun/energy/crossbow/largecrossbow)
|
|
|
|
|
projectile = /obj/item/projectile/energy/bolt/large
|
|
|
|
|
eprojectile = projectile
|
|
|
|
|
iconholder = null
|
|
|
|
|
reqpower = 125
|
|
|
|
|
fire_sound = 'sound/weapons/ebow.ogg'
|
|
|
|
|
efire_sound = fire_sound
|
|
|
|
|
|
|
|
|
|
if(/obj/item/weapon/gun/energy/crossbow)
|
|
|
|
|
projectile = /obj/item/projectile/energy/bolt
|
|
|
|
|
eprojectile = projectile
|
|
|
|
|
iconholder = null
|
|
|
|
|
reqpower = 50
|
|
|
|
|
fire_sound = 'sound/weapons/ebow.ogg'
|
|
|
|
|
efire_sound = fire_sound
|
|
|
|
|
|
|
|
|
|
if(/obj/item/weapon/gun/energy/laser)
|
|
|
|
|
projectile = /obj/item/projectile/beam
|
|
|
|
|
eprojectile = projectile
|
|
|
|
|
iconholder = null
|
|
|
|
|
reqpower = 500
|
|
|
|
|
|
|
|
|
|
if(/obj/item/weapon/gun/energy/ricochet)
|
|
|
|
|
projectile = /obj/item/projectile/ricochet
|
|
|
|
|
eprojectile = projectile
|
|
|
|
|
iconholder = null
|
|
|
|
|
reqpower = 500
|
|
|
|
|
|
|
|
|
|
if(/obj/item/weapon/gun/energy/bison)
|
|
|
|
|
projectile = /obj/item/projectile/beam/bison
|
|
|
|
|
eprojectile = projectile
|
|
|
|
|
iconholder = null
|
|
|
|
|
reqpower = 250
|
|
|
|
|
fire_sound = 'sound/weapons/bison_fire.ogg'
|
|
|
|
|
efire_sound = fire_sound
|
|
|
|
|
|
|
|
|
|
if(/obj/item/weapon/gun/energy/polarstar/spur)
|
|
|
|
|
projectile = /obj/item/projectile/spur
|
|
|
|
|
eprojectile = projectile
|
|
|
|
|
iconholder = null
|
|
|
|
|
reqpower = 700
|
|
|
|
|
fire_sound = 'sound/weapons/spur_high.ogg'
|
|
|
|
|
efire_sound = fire_sound
|
|
|
|
|
|
|
|
|
|
if(/obj/item/weapon/gun/energy/polarstar)
|
|
|
|
|
projectile = /obj/item/projectile/spur/polarstar
|
|
|
|
|
eprojectile = projectile
|
|
|
|
|
iconholder = null
|
|
|
|
|
reqpower = 400
|
|
|
|
|
fire_sound = 'sound/weapons/spur_high.ogg'
|
|
|
|
|
efire_sound = fire_sound
|
|
|
|
|
|
|
|
|
|
else // Energy gun shots
|
|
|
|
|
projectile = /obj/item/projectile/energy/electrode// if it hasn't been emagged, it uses normal taser shots
|
|
|
|
|
eprojectile = /obj/item/projectile/beam//If it has, going to kill mode
|
|
|
|
|
iconholder = 1
|
|
|
|
|
egun = 1
|
|
|
|
|
reqpower = 200
|
|
|
|
|
fire_sound = 'sound/weapons/Taser.ogg'
|
|
|
|
|
if(!eprojectile || !projectile)
|
|
|
|
|
projectile = /obj/item/projectile/energy/electrode// if it hasn't been emagged, it uses normal taser shots
|
|
|
|
|
eprojectile = /obj/item/projectile/beam//If it has, going to kill mode
|
|
|
|
|
iconholder = 1
|
|
|
|
|
egun = 1
|
|
|
|
|
reqpower = 200
|
|
|
|
|
fire_sound = 'sound/weapons/Taser.ogg'
|
|
|
|
|
|
|
|
|
|
/obj/machinery/porta_turret/Destroy()
|
|
|
|
|
// deletes its own cover with it
|
|
|
|
|
qdel(cover)
|
|
|
|
|
qdel(installed)
|
|
|
|
|
..()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -298,6 +152,9 @@ Status: []<BR>"},
|
|
|
|
|
usr.set_machine(src)
|
|
|
|
|
src.add_fingerprint(usr)
|
|
|
|
|
if ((href_list["power"]) && (src.allowed(usr)))
|
|
|
|
|
if(on && emagged)
|
|
|
|
|
to_chat(usr, "<span class='warning'>The turret isn't responding!</span>")
|
|
|
|
|
return
|
|
|
|
|
if(anchored) // you can't turn a turret on/off if it's not anchored/secured
|
|
|
|
|
on = !on // toggle on/off
|
|
|
|
|
else
|
|
|
|
|
@@ -317,6 +174,8 @@ Status: []<BR>"},
|
|
|
|
|
src.criminals = !src.criminals
|
|
|
|
|
if("shootall")
|
|
|
|
|
stun_all = !stun_all
|
|
|
|
|
if("checkxenos")
|
|
|
|
|
check_anomalies = !check_anomalies
|
|
|
|
|
updateUsrDialog()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -330,11 +189,9 @@ Status: []<BR>"},
|
|
|
|
|
else
|
|
|
|
|
if( powered() )
|
|
|
|
|
if (on)
|
|
|
|
|
if (installation == /obj/item/weapon/gun/energy/laser || installation == /obj/item/weapon/gun/energy/pulse_rifle)
|
|
|
|
|
// laser guns and pulse rifles have an orange icon
|
|
|
|
|
if (emagged)
|
|
|
|
|
icon_state = "[lasercolor]orange_target_prism"
|
|
|
|
|
else
|
|
|
|
|
// anything else has a blue icon
|
|
|
|
|
icon_state = "[lasercolor]target_prism"
|
|
|
|
|
else
|
|
|
|
|
icon_state = "[lasercolor]grey_target_prism"
|
|
|
|
|
@@ -347,13 +204,19 @@ Status: []<BR>"},
|
|
|
|
|
/obj/machinery/porta_turret/emag(mob/user)
|
|
|
|
|
if(!emagged)
|
|
|
|
|
to_chat(user, "<span class='warning'>You short out [src]'s threat assessment circuits.</span>")
|
|
|
|
|
spawn(0)
|
|
|
|
|
for(var/mob/O in hearers(src, null))
|
|
|
|
|
O.show_message("<span class='warning'>[src] hums oddly...</span>", 1)
|
|
|
|
|
if(anchored) //this is like this because the turret itself is invisible when retracted, so the cover displays the message instead
|
|
|
|
|
cover.visible_message("<span class='warning'>[src] hums oddly...</span>", "<span class='warning'>You hear an odd humming.</span>")
|
|
|
|
|
else //But when unsecured the cover is gone, so it shows the message itself
|
|
|
|
|
visible_message("<span class='warning'>[src] hums oddly...</span>", "<span class='warning'>You hear an odd humming.</span>")
|
|
|
|
|
if(istype(installed, /obj/item/weapon/gun/energy/laser/redtag) || istype(installed, /obj/item/weapon/gun/energy/laser/redtag))
|
|
|
|
|
installed.projectile_type = /obj/item/projectile/beam/lasertag/omni //if you manage to get this gun back out, good for you
|
|
|
|
|
emagged = 1
|
|
|
|
|
src.on = 0 // turns off the turret temporarily
|
|
|
|
|
req_access = null
|
|
|
|
|
on = 0 // turns off the turret temporarily
|
|
|
|
|
sleep(60) // 6 seconds for the traitor to gtfo of the area before the turret decides to ruin his shit
|
|
|
|
|
on = 1 // turns it back on. The cover popUp() popDown() are automatically called in process(), no need to define it here
|
|
|
|
|
if(anchored) //Can't turn on if not secure
|
|
|
|
|
on = 1 // turns it back on. The cover popUp() popDown() are automatically called in process(), no need to define it here
|
|
|
|
|
|
|
|
|
|
/obj/machinery/porta_turret/attackby(obj/item/W as obj, mob/user as mob)
|
|
|
|
|
if(stat & BROKEN)
|
|
|
|
|
if(iscrowbar(W))
|
|
|
|
|
@@ -362,18 +225,22 @@ Status: []<BR>"},
|
|
|
|
|
// try and salvage its components
|
|
|
|
|
to_chat(user, "You begin prying the metal coverings off.")
|
|
|
|
|
sleep(20)
|
|
|
|
|
if(prob(70))
|
|
|
|
|
to_chat(user, "You remove the turret and salvage some components.")
|
|
|
|
|
if(installation)
|
|
|
|
|
var/obj/item/weapon/gun/energy/Gun = new installation(src.loc)
|
|
|
|
|
Gun.power_supply.charge=gun_charge
|
|
|
|
|
Gun.update_icon()
|
|
|
|
|
var/salvaged
|
|
|
|
|
if(installed)
|
|
|
|
|
if(prob(70))
|
|
|
|
|
var/obj/item/I = installed
|
|
|
|
|
I.forceMove(get_turf(src))
|
|
|
|
|
installed = null
|
|
|
|
|
lasercolor = null
|
|
|
|
|
if(prob(50))
|
|
|
|
|
var/obj/item/stack/sheet/metal/M = getFromPool(/obj/item/stack/sheet/metal,loc)
|
|
|
|
|
M.amount = rand(1,4)
|
|
|
|
|
if(prob(50))
|
|
|
|
|
new /obj/item/device/assembly/prox_sensor(locate(x,y,z))
|
|
|
|
|
salvaged++
|
|
|
|
|
if(prob(75))
|
|
|
|
|
getFromPool(/obj/item/stack/sheet/metal, loc, rand(2,6))
|
|
|
|
|
salvaged++
|
|
|
|
|
if(prob(50))
|
|
|
|
|
new /obj/item/device/assembly/prox_sensor(get_turf(src))
|
|
|
|
|
salvaged++
|
|
|
|
|
if(salvaged)
|
|
|
|
|
to_chat(user, "You remove the turret and salvage some components.")
|
|
|
|
|
else
|
|
|
|
|
to_chat(user, "You remove the turret but did not manage to salvage anything.")
|
|
|
|
|
qdel(src)
|
|
|
|
|
@@ -381,21 +248,16 @@ Status: []<BR>"},
|
|
|
|
|
|
|
|
|
|
..()
|
|
|
|
|
|
|
|
|
|
if((iswrench(W)) && (!on))
|
|
|
|
|
if(raised)
|
|
|
|
|
return
|
|
|
|
|
if(iswrench(W) && !on && !raised && wrenchAnchor(user))
|
|
|
|
|
// This code handles moving the turret around. After all, it's a portable turret!
|
|
|
|
|
|
|
|
|
|
if(!anchored)
|
|
|
|
|
anchored = 1
|
|
|
|
|
if(anchored)
|
|
|
|
|
invisibility = INVISIBILITY_LEVEL_TWO
|
|
|
|
|
icon_state = "[lasercolor]grey_target_prism"
|
|
|
|
|
to_chat(user, "You secure the exterior bolts on the turret.")
|
|
|
|
|
cover=new/obj/machinery/porta_turret_cover(src.loc) // create a new turret. While this is handled in process(), this is to workaround a bug where the turret becomes invisible for a split second
|
|
|
|
|
cover=new/obj/machinery/porta_turret_cover(src.loc) // create a new turret cover. While this is handled in process(), this is to workaround a bug where the turret becomes invisible for a split second
|
|
|
|
|
cover.Parent_Turret = src // make the cover's parent src
|
|
|
|
|
power_change()
|
|
|
|
|
else
|
|
|
|
|
anchored = 0
|
|
|
|
|
to_chat(user, "You unsecure the exterior bolts on the turret.")
|
|
|
|
|
icon_state = "turretCover"
|
|
|
|
|
invisibility = 0
|
|
|
|
|
qdel(cover) // deletes the cover, and the turret instance itself becomes its own cover.
|
|
|
|
|
@@ -411,25 +273,28 @@ Status: []<BR>"},
|
|
|
|
|
else
|
|
|
|
|
user.delayNextAttack(10)
|
|
|
|
|
// if the turret was attacked with the intention of harming it:
|
|
|
|
|
src.health -= W.force * 0.5
|
|
|
|
|
if (src.health <= 0)
|
|
|
|
|
src.die()
|
|
|
|
|
if ((W.force * 0.5) > 1) // if the force of impact dealt at least 1 damage, the turret gets pissed off
|
|
|
|
|
if(!attacked && !emagged)
|
|
|
|
|
attacked = 1
|
|
|
|
|
spawn()
|
|
|
|
|
sleep(60)
|
|
|
|
|
attacked = 0
|
|
|
|
|
if (W.force >= 2)
|
|
|
|
|
src.health -= W.force * 0.5
|
|
|
|
|
if (src.health <= 0)
|
|
|
|
|
src.die()
|
|
|
|
|
// if the force of impact dealt at least 1 damage, the turret gets pissed off
|
|
|
|
|
playsound(loc, 'sound/effects/grillehit.ogg', 75, 1)
|
|
|
|
|
if(W.attack_verb && W.attack_verb.len)
|
|
|
|
|
user.visible_message("<span class='warning'><B>[user] [pick(W.attack_verb)] \the [src] with \the [W]!</span>", \
|
|
|
|
|
"<span class='warning'>You attack \the [src] with \the [W]!</span>", \
|
|
|
|
|
"<span class='warning'>You hear a clang!</span>")
|
|
|
|
|
else
|
|
|
|
|
user.visible_message("<span class='warning'><B>[user] attacks \the [src] with \the [W]!</span>", \
|
|
|
|
|
"<span class='warning'>You attack \the [src] with \the [W]!</span>", \
|
|
|
|
|
"<span class='warning'>You hear a clang!</span>")
|
|
|
|
|
if(on)
|
|
|
|
|
attacked += 5
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/obj/machinery/porta_turret/bullet_act(var/obj/item/projectile/Proj)
|
|
|
|
|
if(on)
|
|
|
|
|
if(!attacked && !emagged)
|
|
|
|
|
attacked = 1
|
|
|
|
|
spawn()
|
|
|
|
|
sleep(60)
|
|
|
|
|
attacked = 0
|
|
|
|
|
if(on && Proj.damage > 0)
|
|
|
|
|
attacked += 5
|
|
|
|
|
|
|
|
|
|
src.health -= Proj.damage
|
|
|
|
|
..()
|
|
|
|
|
@@ -462,7 +327,7 @@ Status: []<BR>"},
|
|
|
|
|
auth_weapons=pick(0,1)
|
|
|
|
|
stun_all=pick(0,0,0,0,1) // stun_all is a pretty big deal, so it's least likely to get turned on
|
|
|
|
|
if(prob(5))
|
|
|
|
|
emagged=1
|
|
|
|
|
emagged = 1
|
|
|
|
|
on=0
|
|
|
|
|
sleep(rand(60,600))
|
|
|
|
|
if(!on)
|
|
|
|
|
@@ -471,10 +336,12 @@ Status: []<BR>"},
|
|
|
|
|
..()
|
|
|
|
|
|
|
|
|
|
/obj/machinery/porta_turret/ex_act(severity)
|
|
|
|
|
if(severity >= 3) // turret dies if an explosion touches it!
|
|
|
|
|
if(severity < 3)
|
|
|
|
|
qdel(src)
|
|
|
|
|
else
|
|
|
|
|
src.die()
|
|
|
|
|
health -= 30
|
|
|
|
|
if(health <= 0)
|
|
|
|
|
die()
|
|
|
|
|
|
|
|
|
|
/obj/machinery/porta_turret/proc/die() // called when the turret dies, ie, health <= 0
|
|
|
|
|
src.health = 0
|
|
|
|
|
@@ -511,61 +378,72 @@ Status: []<BR>"},
|
|
|
|
|
popDown()
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
last_fired = 0
|
|
|
|
|
if(attacked)
|
|
|
|
|
attacked--
|
|
|
|
|
|
|
|
|
|
var/list/targets = list() // list of primary targets
|
|
|
|
|
var/list/secondarytargets = list() // targets that are least important
|
|
|
|
|
|
|
|
|
|
if(src.check_anomalies) // if its set to check for xenos/carps, check for non-mob "crittersssss"(And simple_animals)
|
|
|
|
|
for(var/mob/living/simple_animal/C in view(7,src))
|
|
|
|
|
if(C.stat)
|
|
|
|
|
continue
|
|
|
|
|
if(C.flags & INVULNERABLE)
|
|
|
|
|
continue
|
|
|
|
|
// Ignore lazarus-injected mobs.
|
|
|
|
|
if(dd_hasprefix(C.faction, "lazarus"))
|
|
|
|
|
continue
|
|
|
|
|
targets += C
|
|
|
|
|
|
|
|
|
|
for (var/mob/living/carbon/C in view(7,src)) // loops through all living carbon-based lifeforms in view(12)
|
|
|
|
|
if(C.flags & INVULNERABLE)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for(var/mob/living/L in view(7+emagged*5, src))
|
|
|
|
|
if(L.flags & INVULNERABLE)
|
|
|
|
|
continue
|
|
|
|
|
if(istype(C, /mob/living/carbon/alien) && src.check_anomalies) // git those fukken xenos
|
|
|
|
|
if(!C.stat) // if it's dead/dying, there's no need to keep shooting at it.
|
|
|
|
|
targets += C
|
|
|
|
|
|
|
|
|
|
else
|
|
|
|
|
if(emagged) // if emagged, HOLY SHIT EVERYONE IS DANGEROUS beep boop beep
|
|
|
|
|
targets += C
|
|
|
|
|
if(L.isDead() || isMoMMI(L))//mommis are always safe
|
|
|
|
|
continue
|
|
|
|
|
if(emagged)
|
|
|
|
|
if(L.isUnconscious())
|
|
|
|
|
secondarytargets += L //if the turret is emagged, skip all the fancy target picking stuff
|
|
|
|
|
else
|
|
|
|
|
if (C.stat || C.handcuffed) // if the perp is handcuffed or dead/dying, no need to bother really
|
|
|
|
|
targets += L //and focus on murdering everything
|
|
|
|
|
|
|
|
|
|
else if(!issilicon(L))
|
|
|
|
|
if(isanimal(L)) // if its set to check for xenos/carps, check for non-mob "crittersssss"(And simple_animals)
|
|
|
|
|
if(check_anomalies || stun_all || attacked)
|
|
|
|
|
if(L.isUnconscious())
|
|
|
|
|
continue
|
|
|
|
|
// Ignore lazarus-injected mobs.
|
|
|
|
|
if(dd_hasprefix(L.faction, "lazarus"))
|
|
|
|
|
continue
|
|
|
|
|
targets += L
|
|
|
|
|
|
|
|
|
|
if(isalien(L))
|
|
|
|
|
if(check_anomalies || stun_all || attacked) // git those fukken xenos
|
|
|
|
|
if(!L.isUnconscious())
|
|
|
|
|
targets += L
|
|
|
|
|
else
|
|
|
|
|
secondarytargets += L
|
|
|
|
|
|
|
|
|
|
else
|
|
|
|
|
if(L.isUnconscious() || L.restrained()) // if the perp is handcuffed or dead/dying, no need to bother really
|
|
|
|
|
continue // move onto next potential victim!
|
|
|
|
|
|
|
|
|
|
var/dst = get_dist(src, C) // if it's too far away, why bother?
|
|
|
|
|
if (dst > 7)
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
if(ai) // If it's set to attack all nonsilicons, target them!
|
|
|
|
|
if(C.lying)
|
|
|
|
|
if(lasercolor)
|
|
|
|
|
continue
|
|
|
|
|
else
|
|
|
|
|
secondarytargets += C
|
|
|
|
|
continue
|
|
|
|
|
if(L.lying)
|
|
|
|
|
secondarytargets += L
|
|
|
|
|
continue
|
|
|
|
|
else
|
|
|
|
|
targets += C
|
|
|
|
|
targets += L
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
if (istype(C, /mob/living/carbon/human)) // if the target is a human, analyze threat level
|
|
|
|
|
if(src.assess_perp(C)<4)
|
|
|
|
|
continue // if threat level < 4, keep going
|
|
|
|
|
if(ishuman(L)) // if the target is a human, analyze threat level
|
|
|
|
|
if(assess_perp(L) < PERP_LEVEL_ARREST)
|
|
|
|
|
continue // if threat level < PERP_LEVEL_ARREST, keep going
|
|
|
|
|
|
|
|
|
|
else if (istype(C, /mob/living/carbon/monkey))
|
|
|
|
|
if(ismonkey(L) && !(stun_all || check_anomalies || attacked))
|
|
|
|
|
continue // Don't target monkeys or borgs/AIs you dumb shit
|
|
|
|
|
|
|
|
|
|
if (C.lying) // if the perp is lying down, it's still a target but a less-important target
|
|
|
|
|
secondarytargets += C
|
|
|
|
|
if(isslime(L) && !(stun_all || check_anomalies || attacked))
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
targets += C // if the perp has passed all previous tests, congrats, it is now a "shoot-me!" nominee
|
|
|
|
|
if(L.lying) // if the perp is lying down, it's still a target but a less-important target
|
|
|
|
|
secondarytargets += L
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
targets += L // if the perp has passed all previous tests, congrats, it is now a "shoot-me!" nominee
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (targets.len>0) // if there are targets to shoot
|
|
|
|
|
|
|
|
|
|
@@ -633,7 +511,7 @@ Status: []<BR>"},
|
|
|
|
|
raising=0
|
|
|
|
|
cover.icon_state="turretCover"
|
|
|
|
|
raised=0
|
|
|
|
|
invisibility=2
|
|
|
|
|
invisibility = INVISIBILITY_LEVEL_TWO
|
|
|
|
|
icon_state="[lasercolor]grey_target_prism"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -641,12 +519,12 @@ Status: []<BR>"},
|
|
|
|
|
var/threatcount = 0 // the integer returned
|
|
|
|
|
|
|
|
|
|
if(src.emagged)
|
|
|
|
|
return 10 // if emagged, always return 10.
|
|
|
|
|
return PERP_LEVEL_ARREST + rand(PERP_LEVEL_ARREST, PERP_LEVEL_ARREST*5) // if emagged, always return more than PERP_LEVEL_ARREST.
|
|
|
|
|
|
|
|
|
|
if((stun_all && !src.allowed(perp)) || attacked && !src.allowed(perp))
|
|
|
|
|
// if the turret has been attacked or is angry, target all non-sec people
|
|
|
|
|
if(!src.allowed(perp))
|
|
|
|
|
return 10
|
|
|
|
|
return PERP_LEVEL_ARREST + rand(PERP_LEVEL_ARREST, PERP_LEVEL_ARREST*5)
|
|
|
|
|
|
|
|
|
|
if(auth_weapons) // check for weapon authorization
|
|
|
|
|
if((isnull(perp.wear_id)) || (istype(perp.wear_id.GetID(), /obj/item/weapon/card/id/syndicate)))
|
|
|
|
|
@@ -662,28 +540,28 @@ Status: []<BR>"},
|
|
|
|
|
continue
|
|
|
|
|
//Scan for guns and stun batons. Bartender's shotgun doesn't trigger the turret
|
|
|
|
|
|
|
|
|
|
threatcount += 4
|
|
|
|
|
threatcount += PERP_LEVEL_ARREST
|
|
|
|
|
|
|
|
|
|
if(istype(perp.belt, /obj/item/weapon/gun) || istype(perp.belt, /obj/item/weapon/melee/baton))
|
|
|
|
|
threatcount += 2
|
|
|
|
|
threatcount += PERP_LEVEL_ARREST/2
|
|
|
|
|
|
|
|
|
|
if((src.lasercolor) == "b")//Lasertag turrets target the opposing team, how great is that? -Sieve
|
|
|
|
|
threatcount = 0//But does not target anyone else
|
|
|
|
|
if(istype(perp.wear_suit, /obj/item/clothing/suit/redtag))
|
|
|
|
|
threatcount += 4
|
|
|
|
|
threatcount += PERP_LEVEL_ARREST
|
|
|
|
|
if(perp.find_held_item_by_type(/obj/item/weapon/gun/energy/laser/redtag))
|
|
|
|
|
threatcount += 4
|
|
|
|
|
threatcount += PERP_LEVEL_ARREST
|
|
|
|
|
if(istype(perp.belt, /obj/item/weapon/gun/energy/laser/redtag))
|
|
|
|
|
threatcount += 2
|
|
|
|
|
threatcount += PERP_LEVEL_ARREST/2
|
|
|
|
|
|
|
|
|
|
if((src.lasercolor) == "r")
|
|
|
|
|
threatcount = 0
|
|
|
|
|
if(istype(perp.wear_suit, /obj/item/clothing/suit/bluetag))
|
|
|
|
|
threatcount += 4
|
|
|
|
|
threatcount += PERP_LEVEL_ARREST
|
|
|
|
|
if(perp.find_held_item_by_type(/obj/item/weapon/gun/energy/laser/bluetag))
|
|
|
|
|
threatcount += 4
|
|
|
|
|
threatcount += PERP_LEVEL_ARREST
|
|
|
|
|
if(istype(perp.belt, /obj/item/weapon/gun/energy/laser/bluetag))
|
|
|
|
|
threatcount += 2
|
|
|
|
|
threatcount += PERP_LEVEL_ARREST/2
|
|
|
|
|
|
|
|
|
|
if (src.check_records) // if the turret can check the records, check if they are set to *Arrest* on records
|
|
|
|
|
for (var/datum/data/record/E in data_core.general)
|
|
|
|
|
@@ -697,7 +575,7 @@ Status: []<BR>"},
|
|
|
|
|
if (E.fields["name"] == perpname)
|
|
|
|
|
for (var/datum/data/record/R in data_core.security)
|
|
|
|
|
if ((R.fields["id"] == E.fields["id"]) && (R.fields["criminal"] == "*Arrest*"))
|
|
|
|
|
threatcount = 4
|
|
|
|
|
threatcount = PERP_LEVEL_ARREST
|
|
|
|
|
break
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -717,14 +595,6 @@ Status: []<BR>"},
|
|
|
|
|
if(H.lying)
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
if(!emagged) // if it hasn't been emagged, it has to obey a cooldown rate
|
|
|
|
|
if(last_fired || !raised)
|
|
|
|
|
return // prevents rapid-fire shooting, unless it's been emagged
|
|
|
|
|
last_fired = 1
|
|
|
|
|
spawn()
|
|
|
|
|
sleep(shot_delay)
|
|
|
|
|
last_fired = 0
|
|
|
|
|
|
|
|
|
|
var/turf/T = get_turf(src)
|
|
|
|
|
var/turf/U = get_turf(target)
|
|
|
|
|
if (!istype(T) || !istype(U))
|
|
|
|
|
@@ -733,35 +603,31 @@ Status: []<BR>"},
|
|
|
|
|
if (!raised) // the turret has to be raised in order to fire - makes sense, right?
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// any emagged turrets will shoot extremely fast! This not only is deadly, but drains a lot power!
|
|
|
|
|
|
|
|
|
|
if(iconholder)
|
|
|
|
|
if(!emagged)
|
|
|
|
|
icon_state = "[lasercolor]target_prism"
|
|
|
|
|
else
|
|
|
|
|
icon_state = "[lasercolor]orange_target_prism"
|
|
|
|
|
|
|
|
|
|
use_power(reqpower)
|
|
|
|
|
|
|
|
|
|
// //Shooting Code:
|
|
|
|
|
playsound(get_turf(src), installed.fire_sound, 75, 1)
|
|
|
|
|
var/obj/item/projectile/A
|
|
|
|
|
if(emagged)
|
|
|
|
|
playsound(get_turf(src), efire_sound, 75, 1)
|
|
|
|
|
A = new eprojectile( loc )
|
|
|
|
|
else
|
|
|
|
|
playsound(get_turf(src), fire_sound, 75, 1)
|
|
|
|
|
A = new projectile( loc )
|
|
|
|
|
A.original = target.loc
|
|
|
|
|
if(!emagged)
|
|
|
|
|
use_power(reqpower)
|
|
|
|
|
else
|
|
|
|
|
use_power((reqpower*2))
|
|
|
|
|
// Shooting Code:
|
|
|
|
|
A = new installed.projectile_type(loc)
|
|
|
|
|
A.original = target
|
|
|
|
|
A.starting = T
|
|
|
|
|
A.shot_from = src
|
|
|
|
|
A.shot_from = installed
|
|
|
|
|
A.current = T
|
|
|
|
|
A.yo = U.y - T.y
|
|
|
|
|
A.xo = U.x - T.x
|
|
|
|
|
spawn( 1 )
|
|
|
|
|
A.OnFired()
|
|
|
|
|
A.OnFired()
|
|
|
|
|
spawn()
|
|
|
|
|
A.process()
|
|
|
|
|
|
|
|
|
|
if(emagged && !last_fired)
|
|
|
|
|
sleep(5)
|
|
|
|
|
last_fired = 1
|
|
|
|
|
shootAt(target)
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -781,8 +647,8 @@ Status: []<BR>"},
|
|
|
|
|
density=1
|
|
|
|
|
var/build_step = 0 // the current step in the building process
|
|
|
|
|
var/finish_name="turret" // the name applied to the product turret
|
|
|
|
|
var/installation = null // the gun type installed
|
|
|
|
|
var/gun_charge = 0 // the gun charge of the gun type installed
|
|
|
|
|
var/obj/item/weapon/gun/energy/installed = null // the gun installed
|
|
|
|
|
machine_flags = SHUTTLEWRENCH
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -791,37 +657,30 @@ Status: []<BR>"},
|
|
|
|
|
// this is a bit unweildy but self-explanitory
|
|
|
|
|
switch(build_step)
|
|
|
|
|
if(0) // first step
|
|
|
|
|
if(iswrench(W) && !anchored)
|
|
|
|
|
playsound(get_turf(src), 'sound/items/Ratchet.ogg', 100, 1)
|
|
|
|
|
to_chat(user, "<span class='notice'>You secure the external bolts.</span>")
|
|
|
|
|
anchored = 1
|
|
|
|
|
if(iswrench(W) && !anchored && wrenchAnchor(user))
|
|
|
|
|
build_step = 1
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
else if(iscrowbar(W) && !anchored)
|
|
|
|
|
playsound(get_turf(src), 'sound/items/Crowbar.ogg', 75, 1)
|
|
|
|
|
to_chat(user, "You dismantle the turret construction.")
|
|
|
|
|
//new /obj/item/stack/sheet/metal( loc, 5)
|
|
|
|
|
var/obj/item/stack/sheet/metal/M = getFromPool(/obj/item/stack/sheet/metal, loc)
|
|
|
|
|
M.amount = 5
|
|
|
|
|
getFromPool(/obj/item/stack/sheet/metal, loc, 5)
|
|
|
|
|
qdel(src)
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
if(1)
|
|
|
|
|
if(istype(W, /obj/item/stack/sheet/metal))
|
|
|
|
|
if(W:amount>=2) // requires 2 metal sheets
|
|
|
|
|
var/obj/item/stack/sheet/metal/stack = W
|
|
|
|
|
if(stack.use(2)) // requires 2 metal sheets
|
|
|
|
|
to_chat(user, "<span class='notice'>You add some metal armor to the interior frame.</span>")
|
|
|
|
|
build_step = 2
|
|
|
|
|
W:amount -= 2
|
|
|
|
|
icon_state = "turret_frame2"
|
|
|
|
|
if(W:amount <= 0)
|
|
|
|
|
returnToPool(W)
|
|
|
|
|
return
|
|
|
|
|
else
|
|
|
|
|
to_chat(user, "<span class='warning'>You need at least 2 [stack] to add internal armor.</span>")
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
else if(iswrench(W))
|
|
|
|
|
playsound(get_turf(src), 'sound/items/Ratchet.ogg', 75, 1)
|
|
|
|
|
to_chat(user, "You unfasten the external bolts.")
|
|
|
|
|
anchored = 0
|
|
|
|
|
else if(iswrench(W) && wrenchAnchor(user))
|
|
|
|
|
build_step = 0
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
@@ -847,21 +706,20 @@ Status: []<BR>"},
|
|
|
|
|
return
|
|
|
|
|
build_step = 1
|
|
|
|
|
to_chat(user, "You remove the turret's interior metal armor.")
|
|
|
|
|
//new /obj/item/stack/sheet/metal( loc, 2)
|
|
|
|
|
var/obj/item/stack/sheet/metal/M = getFromPool(/obj/item/stack/sheet/metal,loc)
|
|
|
|
|
M.amount = 2
|
|
|
|
|
getFromPool(/obj/item/stack/sheet/metal, loc, 2)
|
|
|
|
|
icon_state = "turret_frame"
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(3)
|
|
|
|
|
if(istype(W, /obj/item/weapon/gun/energy)) // the gun installation part
|
|
|
|
|
if(!user.drop_item(W, src))
|
|
|
|
|
to_chat(user, "<span class='warning'>You can't let go of \the [W]!</span>")
|
|
|
|
|
return
|
|
|
|
|
playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 100, 1)
|
|
|
|
|
var/obj/item/weapon/gun/energy/E = W // typecasts the item to an energy gun
|
|
|
|
|
installation = W.type // installation becomes W.type
|
|
|
|
|
gun_charge = E.power_supply.charge // the gun's charge is stored in src.gun_charge
|
|
|
|
|
installed = W
|
|
|
|
|
to_chat(user, "<span class='notice'>You add \the [W] to the turret.</span>")
|
|
|
|
|
build_step = 4
|
|
|
|
|
qdel(W) // delete the gun :(
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
else if(iswrench(W))
|
|
|
|
|
@@ -872,6 +730,9 @@ Status: []<BR>"},
|
|
|
|
|
|
|
|
|
|
if(4)
|
|
|
|
|
if(isprox(W))
|
|
|
|
|
if(!user.drop_item(W, src))
|
|
|
|
|
to_chat(user, "<span class='warning'>You can't let go of \the [W]!</span>")
|
|
|
|
|
return
|
|
|
|
|
playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 100, 1)
|
|
|
|
|
build_step = 5
|
|
|
|
|
to_chat(user, "<span class='notice'>You add the prox sensor to the turret.</span>")
|
|
|
|
|
@@ -891,12 +752,13 @@ Status: []<BR>"},
|
|
|
|
|
|
|
|
|
|
if(6)
|
|
|
|
|
if(istype(W, /obj/item/stack/sheet/metal))
|
|
|
|
|
if(W:amount>=2)
|
|
|
|
|
var/obj/item/stack/sheet/metal/stack = W
|
|
|
|
|
if(stack.use(2))
|
|
|
|
|
to_chat(user, "<span class='notice'>You add some metal armor to the exterior frame.</span>")
|
|
|
|
|
build_step = 7
|
|
|
|
|
W:amount -= 2
|
|
|
|
|
if(W:amount <= 0)
|
|
|
|
|
qdel(W)
|
|
|
|
|
return
|
|
|
|
|
else
|
|
|
|
|
to_chat(user, "<span class='warning'>You need at least 2 [stack] to add external armor.</span>")
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
else if(isscrewdriver(W))
|
|
|
|
|
@@ -923,17 +785,15 @@ Status: []<BR>"},
|
|
|
|
|
// The final step: create a full turret
|
|
|
|
|
var/obj/machinery/porta_turret/Turret = new/obj/machinery/porta_turret(locate(x,y,z))
|
|
|
|
|
Turret.name = finish_name
|
|
|
|
|
Turret.installation = src.installation
|
|
|
|
|
Turret.gun_charge = src.gun_charge
|
|
|
|
|
Turret.installed = src.installed
|
|
|
|
|
installed.forceMove(Turret)
|
|
|
|
|
Turret.update_gun()
|
|
|
|
|
qdel(src)
|
|
|
|
|
|
|
|
|
|
else if(iscrowbar(W))
|
|
|
|
|
playsound(get_turf(src), 'sound/items/Crowbar.ogg', 75, 1)
|
|
|
|
|
to_chat(user, "You pry off the turret's exterior armor.")
|
|
|
|
|
//new /obj/item/stack/sheet/metal( loc, 2)
|
|
|
|
|
var/obj/item/stack/sheet/metal/M = getFromPool(/obj/item/stack/sheet/metal,loc)
|
|
|
|
|
M.amount = 2
|
|
|
|
|
getFromPool(/obj/item/stack/sheet/metal, loc, 2)
|
|
|
|
|
build_step = 6
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
@@ -949,38 +809,32 @@ Status: []<BR>"},
|
|
|
|
|
return
|
|
|
|
|
..()
|
|
|
|
|
|
|
|
|
|
/obj/machinery/porta_turret_construct/attack_ghost(var/mob/user) //stop taking the guns out
|
|
|
|
|
return 0
|
|
|
|
|
|
|
|
|
|
/obj/machinery/porta_turret_construct/attack_ai(var/mob/user)
|
|
|
|
|
return 0
|
|
|
|
|
|
|
|
|
|
/obj/machinery/porta_turret_construct/attack_hand(mob/user as mob)
|
|
|
|
|
switch(build_step)
|
|
|
|
|
if(4)
|
|
|
|
|
if(!installation)
|
|
|
|
|
if(!installed)
|
|
|
|
|
return
|
|
|
|
|
build_step = 3
|
|
|
|
|
|
|
|
|
|
var/obj/item/weapon/gun/energy/Gun = new installation(src.loc)
|
|
|
|
|
Gun.power_supply.charge=gun_charge
|
|
|
|
|
Gun.update_icon()
|
|
|
|
|
installation = null
|
|
|
|
|
gun_charge = 0
|
|
|
|
|
to_chat(user, "You remove \the [Gun] from the turret frame.")
|
|
|
|
|
to_chat(user, "You remove \the [installed] from the turret frame.")
|
|
|
|
|
var/obj/item/I = installed
|
|
|
|
|
user.put_in_hands(I)
|
|
|
|
|
installed = null
|
|
|
|
|
|
|
|
|
|
if(5)
|
|
|
|
|
to_chat(user, "You remove the prox sensor from the turret frame.")
|
|
|
|
|
new/obj/item/device/assembly/prox_sensor(locate(x,y,z))
|
|
|
|
|
var/obj/item/device/assembly/prox_sensor/P = new(user.loc)
|
|
|
|
|
user.put_in_hands(P)
|
|
|
|
|
build_step = 4
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/obj/machinery/porta_turret_cover
|
|
|
|
|
name = "turret"
|
|
|
|
|
icon = 'icons/obj/turrets.dmi'
|
|
|
|
|
@@ -990,182 +844,24 @@ Status: []<BR>"},
|
|
|
|
|
density = 0
|
|
|
|
|
var/obj/machinery/porta_turret/Parent_Turret = null
|
|
|
|
|
|
|
|
|
|
machine_flags = SHUTTLEWRENCH
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// The below code is pretty much just recoded from the initial turret object. It's necessary but uncommented because it's exactly the same!
|
|
|
|
|
|
|
|
|
|
/obj/machinery/porta_turret_cover/attack_ai(mob/user as mob)
|
|
|
|
|
. = ..()
|
|
|
|
|
if (.)
|
|
|
|
|
return
|
|
|
|
|
src.add_hiddenprint(user)
|
|
|
|
|
var/dat
|
|
|
|
|
if(!(Parent_Turret.lasercolor))
|
|
|
|
|
dat += text({"
|
|
|
|
|
<TT><B>Automatic Portable Turret Installation</B></TT><BR><BR>
|
|
|
|
|
Status: []<BR>
|
|
|
|
|
Behaviour controls are [Parent_Turret.locked ? "locked" : "unlocked"]"},
|
|
|
|
|
|
|
|
|
|
"<A href='?src=\ref[src];power=1'>[Parent_Turret.on ? "On" : "Off"]</A>" )
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
dat += text({"<BR>
|
|
|
|
|
Check for Weapon Authorization: []<BR>
|
|
|
|
|
Check Security Records: []<BR>
|
|
|
|
|
Neutralize Identified Criminals: []<BR>
|
|
|
|
|
Neutralize All Non-Security and Non-Command Personnel: []<BR>
|
|
|
|
|
Neutralize All Unidentified Life Signs: []<BR>"},
|
|
|
|
|
|
|
|
|
|
"<A href='?src=\ref[src];operation=authweapon'>[Parent_Turret.auth_weapons ? "Yes" : "No"]</A>",
|
|
|
|
|
"<A href='?src=\ref[src];operation=checkrecords'>[Parent_Turret.check_records ? "Yes" : "No"]</A>",
|
|
|
|
|
"<A href='?src=\ref[src];operation=shootcrooks'>[Parent_Turret.criminals ? "Yes" : "No"]</A>",
|
|
|
|
|
"<A href='?src=\ref[src];operation=shootall'>[Parent_Turret.stun_all ? "Yes" : "No"]</A>" ,
|
|
|
|
|
"<A href='?src=\ref[src];operation=checkxenos'>[Parent_Turret.check_anomalies ? "Yes" : "No"]</A>" )
|
|
|
|
|
else
|
|
|
|
|
dat += text({"
|
|
|
|
|
<TT><B>Automatic Portable Turret Installation</B></TT><BR><BR>
|
|
|
|
|
Status: []<BR>"},
|
|
|
|
|
|
|
|
|
|
"<A href='?src=\ref[src];power=1'>[Parent_Turret.on ? "On" : "Off"]</A>" )
|
|
|
|
|
|
|
|
|
|
user << browse("<HEAD><TITLE>Automatic Portable Turret Installation</TITLE></HEAD>[dat]", "window=autosec")
|
|
|
|
|
onclose(user, "autosec")
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
/obj/machinery/porta_turret_cover/attack_hand(mob/user as mob)
|
|
|
|
|
. = ..()
|
|
|
|
|
if (.)
|
|
|
|
|
return
|
|
|
|
|
var/dat
|
|
|
|
|
if(!(Parent_Turret.lasercolor))
|
|
|
|
|
dat += text({"
|
|
|
|
|
<TT><B>Automatic Portable Turret Installation</B></TT><BR><BR>
|
|
|
|
|
Status: []<BR>
|
|
|
|
|
Behaviour controls are [Parent_Turret.locked ? "locked" : "unlocked"]"},
|
|
|
|
|
|
|
|
|
|
"<A href='?src=\ref[src];power=1'>[Parent_Turret.on ? "On" : "Off"]</A>" )
|
|
|
|
|
|
|
|
|
|
if(!Parent_Turret.locked)
|
|
|
|
|
dat += text({"<BR>
|
|
|
|
|
Check for Weapon Authorization: []<BR>
|
|
|
|
|
Check Security Records: []<BR>
|
|
|
|
|
Neutralize Identified Criminals: []<BR>
|
|
|
|
|
Neutralize All Non-Security and Non-Command Personnel: []<BR>
|
|
|
|
|
Neutralize All Unidentified Life Signs: []<BR>"},
|
|
|
|
|
|
|
|
|
|
"<A href='?src=\ref[src];operation=authweapon'>[Parent_Turret.auth_weapons ? "Yes" : "No"]</A>",
|
|
|
|
|
"<A href='?src=\ref[src];operation=checkrecords'>[Parent_Turret.check_records ? "Yes" : "No"]</A>",
|
|
|
|
|
"<A href='?src=\ref[src];operation=shootcrooks'>[Parent_Turret.criminals ? "Yes" : "No"]</A>",
|
|
|
|
|
"<A href='?src=\ref[src];operation=shootall'>[Parent_Turret.stun_all ? "Yes" : "No"]</A>" ,
|
|
|
|
|
"<A href='?src=\ref[src];operation=checkxenos'>[Parent_Turret.check_anomalies ? "Yes" : "No"]</A>" )
|
|
|
|
|
else
|
|
|
|
|
if(istype(user,/mob/living/carbon/human))
|
|
|
|
|
var/mob/living/carbon/human/H = user
|
|
|
|
|
if(((Parent_Turret.lasercolor) == "b") && (istype(H.wear_suit, /obj/item/clothing/suit/redtag)))
|
|
|
|
|
return
|
|
|
|
|
if(((Parent_Turret.lasercolor) == "r") && (istype(H.wear_suit, /obj/item/clothing/suit/bluetag)))
|
|
|
|
|
return
|
|
|
|
|
dat += text({"
|
|
|
|
|
<TT><B>Automatic Portable Turret Installation</B></TT><BR><BR>
|
|
|
|
|
Status: []<BR>"},
|
|
|
|
|
|
|
|
|
|
"<A href='?src=\ref[src];power=1'>[Parent_Turret.on ? "On" : "Off"]</A>" )
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
user << browse("<HEAD><TITLE>Automatic Portable Turret Installation</TITLE></HEAD>[dat]", "window=autosec")
|
|
|
|
|
onclose(user, "autosec")
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
/obj/machinery/porta_turret_cover/Topic(href, href_list)
|
|
|
|
|
if (..())
|
|
|
|
|
return
|
|
|
|
|
usr.set_machine(src)
|
|
|
|
|
Parent_Turret.add_fingerprint(usr)
|
|
|
|
|
src.add_fingerprint(usr)
|
|
|
|
|
if ((href_list["power"]) && (Parent_Turret.allowed(usr)))
|
|
|
|
|
if(Parent_Turret.anchored)
|
|
|
|
|
if (Parent_Turret.on)
|
|
|
|
|
Parent_Turret.on=0
|
|
|
|
|
else
|
|
|
|
|
Parent_Turret.on=1
|
|
|
|
|
else
|
|
|
|
|
to_chat(usr, "<span class='warning'>It has to be secured first!</span>")
|
|
|
|
|
|
|
|
|
|
updateUsrDialog()
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
switch(href_list["operation"])
|
|
|
|
|
if ("authweapon")
|
|
|
|
|
Parent_Turret.auth_weapons = !Parent_Turret.auth_weapons
|
|
|
|
|
if ("checkrecords")
|
|
|
|
|
Parent_Turret.check_records = !Parent_Turret.check_records
|
|
|
|
|
if ("shootcrooks")
|
|
|
|
|
Parent_Turret.criminals = !Parent_Turret.criminals
|
|
|
|
|
if("shootall")
|
|
|
|
|
Parent_Turret.stun_all = !Parent_Turret.stun_all
|
|
|
|
|
if("checkxenos")
|
|
|
|
|
Parent_Turret.check_anomalies = !Parent_Turret.check_anomalies
|
|
|
|
|
|
|
|
|
|
updateUsrDialog()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
add_hiddenprint(user)
|
|
|
|
|
return Parent_Turret.attack_ai(user)
|
|
|
|
|
|
|
|
|
|
/obj/machinery/porta_turret_cover/attackby(obj/item/W as obj, mob/user as mob)
|
|
|
|
|
add_fingerprint(user)
|
|
|
|
|
return Parent_Turret.attackby(W, user)
|
|
|
|
|
|
|
|
|
|
if ((istype(W, /obj/item/weapon/card/emag)) && (!Parent_Turret.emagged))
|
|
|
|
|
to_chat(user, "<span class='warning'>You short out [Parent_Turret]'s threat assessment circuits.</span>")
|
|
|
|
|
spawn(0)
|
|
|
|
|
for(var/mob/O in hearers(Parent_Turret, null))
|
|
|
|
|
O.show_message("<span class='warning'>[Parent_Turret] hums oddly...</span>", 1)
|
|
|
|
|
Parent_Turret.emagged = 1
|
|
|
|
|
Parent_Turret.on = 0
|
|
|
|
|
sleep(40)
|
|
|
|
|
Parent_Turret.on = 1
|
|
|
|
|
|
|
|
|
|
else if((iswrench(W)) && (!Parent_Turret.on))
|
|
|
|
|
if(Parent_Turret.raised)
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
if(!Parent_Turret.anchored)
|
|
|
|
|
Parent_Turret.anchored = 1
|
|
|
|
|
Parent_Turret.invisibility = INVISIBILITY_LEVEL_TWO
|
|
|
|
|
Parent_Turret.icon_state = "grey_target_prism"
|
|
|
|
|
to_chat(user, "You secure the exterior bolts on the turret.")
|
|
|
|
|
else
|
|
|
|
|
Parent_Turret.anchored = 0
|
|
|
|
|
to_chat(user, "You unsecure the exterior bolts on the turret.")
|
|
|
|
|
Parent_Turret.icon_state = "turretCover"
|
|
|
|
|
Parent_Turret.invisibility = 0
|
|
|
|
|
qdel(src)
|
|
|
|
|
|
|
|
|
|
else if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
|
|
|
|
|
if (Parent_Turret.allowed(user))
|
|
|
|
|
Parent_Turret.locked = !Parent_Turret.locked
|
|
|
|
|
to_chat(user, "Controls are now [Parent_Turret.locked ? "locked." : "unlocked."]")
|
|
|
|
|
updateUsrDialog()
|
|
|
|
|
else
|
|
|
|
|
to_chat(user, "<span class='warning'>Access denied.</span>")
|
|
|
|
|
|
|
|
|
|
else
|
|
|
|
|
playsound(get_turf(src), 'sound/weapons/smash.ogg', 60, 1)
|
|
|
|
|
Parent_Turret.health -= W.force * 0.5
|
|
|
|
|
if (Parent_Turret.health <= 0)
|
|
|
|
|
Parent_Turret.die()
|
|
|
|
|
if ((W.force * 0.5) > 2)
|
|
|
|
|
if(!Parent_Turret.attacked && !Parent_Turret.emagged)
|
|
|
|
|
Parent_Turret.attacked = 1
|
|
|
|
|
spawn()
|
|
|
|
|
sleep(30)
|
|
|
|
|
Parent_Turret.attacked = 0
|
|
|
|
|
..()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/obj/machinery/porta_turret_cover/attack_hand(mob/user as mob)
|
|
|
|
|
add_fingerprint(user)
|
|
|
|
|
return Parent_Turret.attack_hand(user)
|
|
|
|
|
|
|
|
|
|
/obj/machinery/porta_turret/stationary
|
|
|
|
|
emagged = 1
|
|
|
|
|
|
|
|
|
|
New()
|
|
|
|
|
installation = new/obj/item/weapon/gun/energy/laser(src.loc)
|
|
|
|
|
installed = new/obj/item/weapon/gun/energy/laser(src)
|
|
|
|
|
..()
|
|
|
|
|
|