diff --git a/baystation12.dme b/baystation12.dme
index 26e81a280b..b27401ffb2 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -334,6 +334,7 @@
#include "code\game\machinery\supply_display.dm"
#include "code\game\machinery\syndicatebeacon.dm"
#include "code\game\machinery\teleporter.dm"
+#include "code\game\machinery\turret_control.dm"
#include "code\game\machinery\turrets.dm"
#include "code\game\machinery\vending.dm"
#include "code\game\machinery\washing_machine.dm"
@@ -1154,7 +1155,6 @@
#include "code\modules\power\power.dm"
#include "code\modules\power\power_monitor.dm"
#include "code\modules\power\powernet.dm"
-#include "code\modules\power\profiling.dm"
#include "code\modules\power\smes.dm"
#include "code\modules\power\smes_construction.dm"
#include "code\modules\power\solar.dm"
@@ -1490,5 +1490,5 @@
#include "code\ZAS\Zone.dm"
#include "interface\interface.dm"
#include "interface\skin.dmf"
-#include "maps\power.dmm"
+#include "maps\tgstation2.dmm"
// END_INCLUDE
diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm
index 6522aae611..03fe0d53b2 100644
--- a/code/_onclick/ai.dm
+++ b/code/_onclick/ai.dm
@@ -121,10 +121,12 @@
Topic("aiDisable=4", list("aiDisable"="4"), 1)
/obj/machinery/power/apc/AICtrlClick() // turns off/on APCs.
- Topic("breaker=1", list("breaker"="1"), 0) // 0 meaning no window (consistency! wait...)
+ Topic("breaker=1", list("breaker"="1"), 1) // 0 meaning window (consistency! wait...)
/obj/machinery/turretid/AICtrlClick() //turns off/on Turrets
- Topic("toggleOn", list("toggleOn" = 1), 1) // 1 meaning no window (consistency!)
+ if(!ailock)
+ src.enabled = !src.enabled
+ src.updateTurrets()
/atom/proc/AIAltClick(var/atom/A)
AltClick(A)
@@ -139,7 +141,9 @@
return
/obj/machinery/turretid/AIAltClick() //toggles lethal on turrets
- Topic("toggleLethal", list("toggleLethal" = 1), 1) // 1 meaning no window (consistency!)
+ if(!ailock)
+ src.lethal = !src.lethal
+ src.updateTurrets()
/atom/proc/AIMiddleClick()
return
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index 716c30171e..569423ec01 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -147,6 +147,9 @@
return
+/mob/proc/changeNext_move(num)
+ next_move = world.time + num
+
// Default behavior: ignore double clicks, consider them normal clicks instead
/mob/proc/DblClickOn(var/atom/A, var/params)
ClickOn(A,params)
diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm
index bb73a63032..96f7f3d6f3 100644
--- a/code/controllers/master_controller.dm
+++ b/code/controllers/master_controller.dm
@@ -31,7 +31,6 @@ datum/controller/game_controller
var/last_thing_processed
var/mob/list/expensive_mobs = list()
- var/rebuild_active_areas = 0
var/list/shuttle_list // For debugging and VV
var/datum/ore_distribution/asteroid_ore_map // For debugging and VV.
diff --git a/code/defines/procs/records.dm b/code/defines/procs/records.dm
index 9f7d78df47..3bf23c5941 100644
--- a/code/defines/procs/records.dm
+++ b/code/defines/procs/records.dm
@@ -37,4 +37,9 @@
R.fields["ma_crim_d"] = "No major crime convictions."
R.fields["notes"] = "No notes."
data_core.security += R
- return R
\ No newline at end of file
+ return R
+
+/proc/find_record(field, value, list/L)
+ for(var/datum/data/record/R in L)
+ if(R.fields[field] == value)
+ return R
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index bc45640522..20a580cc0b 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -13,7 +13,6 @@
master = src //moved outside the spawn(1) to avoid runtimes in lighting.dm when it references loc.loc.master ~Carn
uid = ++global_uid
related = list(src)
- active_areas += src
all_areas += src
if(requires_power)
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index e1e76dd3fa..b1cfd18551 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -423,3 +423,9 @@ its easier to just keep the beam vertical.
/atom/proc/checkpass(passflag)
return pass_flags&passflag
+
+/atom/proc/isinspace()
+ if(istype(get_turf(src), /turf/space))
+ return 1
+ else
+ return 0
diff --git a/code/game/machinery/bots/secbot.dm b/code/game/machinery/bots/secbot.dm
index cddb9286b0..f6140d9102 100644
--- a/code/game/machinery/bots/secbot.dm
+++ b/code/game/machinery/bots/secbot.dm
@@ -643,7 +643,7 @@ Auto Patrol: []"},
continue
if(istype(C, /mob/living/carbon/human))
- src.threatlevel = src.assess_perp(C)
+ src.threatlevel = src.assess_perp(C, idcheck, check_records, lasercolor)
else if(istype(M, /mob/living/simple_animal/hostile))
if(M.stat == DEAD)
@@ -669,78 +669,8 @@ Auto Patrol: []"},
else
continue
-//If the security records say to arrest them, arrest them
-//Or if they have weapons and aren't security, arrest them.
-/obj/machinery/bot/secbot/proc/assess_perp(mob/living/carbon/human/perp as mob)
- var/threatcount = 0
-
- if(perp.stat == DEAD)
- return 0
-
- if(src.emagged == 2) return 10 //Everyone is a criminal!
-
- if(src.idcheck && !src.allowed(perp))
- if(istype(perp.l_hand, /obj/item/weapon/gun) || istype(perp.l_hand, /obj/item/weapon/melee))
- if(!istype(perp.l_hand, /obj/item/weapon/gun/energy/laser/bluetag) \
- && !istype(perp.l_hand, /obj/item/weapon/gun/energy/laser/redtag) \
- && !istype(perp.l_hand, /obj/item/weapon/gun/energy/laser/practice))
- threatcount += 4
-
- if(istype(perp.r_hand, /obj/item/weapon/gun) || istype(perp.r_hand, /obj/item/weapon/melee))
- if(!istype(perp.r_hand, /obj/item/weapon/gun/energy/laser/bluetag) \
- && !istype(perp.r_hand, /obj/item/weapon/gun/energy/laser/redtag) \
- && !istype(perp.r_hand, /obj/item/weapon/gun/energy/laser/practice))
- threatcount += 4
-
- if(istype(perp.belt, /obj/item/weapon/gun) || istype(perp.belt, /obj/item/weapon/melee))
- if(!istype(perp.belt, /obj/item/weapon/gun/energy/laser/bluetag) \
- && !istype(perp.belt, /obj/item/weapon/gun/energy/laser/redtag) \
- && !istype(perp.belt, /obj/item/weapon/gun/energy/laser/practice))
- threatcount += 2
-
- if(istype(perp.wear_suit, /obj/item/clothing/suit/wizrobe))
- threatcount += 2
-
- if(perp.dna && perp.dna.mutantrace && perp.dna.mutantrace != "none")
- threatcount += 2
-
- //Agent cards lower threatlevel.
- if(perp.wear_id && istype(perp.wear_id.GetID(), /obj/item/weapon/card/id/syndicate))
- threatcount -= 2
-
- if(src.lasercolor == "b")//Lasertag turrets target the opposing team, how great is that? -Sieve
- threatcount = 0//They will not, however shoot at people who have guns, because it gets really fucking annoying
- if(istype(perp.wear_suit, /obj/item/clothing/suit/redtag))
- threatcount += 4
- if((istype(perp.r_hand,/obj/item/weapon/gun/energy/laser/redtag)) || (istype(perp.l_hand,/obj/item/weapon/gun/energy/laser/redtag)))
- threatcount += 4
- if(istype(perp.belt, /obj/item/weapon/gun/energy/laser/redtag))
- threatcount += 2
-
- if(src.lasercolor == "r")
- threatcount = 0
- if(istype(perp.wear_suit, /obj/item/clothing/suit/bluetag))
- threatcount += 4
- if((istype(perp.r_hand,/obj/item/weapon/gun/energy/laser/bluetag)) || (istype(perp.l_hand,/obj/item/weapon/gun/energy/laser/bluetag)))
- threatcount += 4
- if(istype(perp.belt, /obj/item/weapon/gun/energy/laser/bluetag))
- threatcount += 2
-
- if(src.check_records)
- var/perpname = perp.name
- if(perp.wear_id)
- var/obj/item/weapon/card/id/id = perp.wear_id.GetID()
- if(id)
- perpname = id.registered_name
-
- for (var/datum/data/record/E in data_core.general)
- 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
- break
-
- return threatcount
+/obj/machinery/bot/secbot/is_assess_emagged()
+ return emagged == 2
/obj/machinery/bot/secbot/Bump(M as mob|obj) //Leave no door unopened!
if((istype(M, /obj/machinery/door)) && !isnull(src.botcard))
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 89f6c0593f..28492f184b 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -160,9 +160,6 @@ Class Procs:
//sets the use_power var and then forces an area power update
/obj/machinery/proc/update_use_power(var/new_use_power, var/force_update = 0)
- if ((new_use_power == use_power) && !force_update)
- return //don't need to do anything
-
use_power = new_use_power
/obj/machinery/proc/auto_use_power()
@@ -249,7 +246,7 @@ Class Procs:
return 0
/obj/machinery/proc/RefreshParts() //Placeholder proc for machines that are built using frames.
- return 0
+ return
/obj/machinery/proc/assign_uid()
uid = gl_uid
@@ -290,3 +287,76 @@ Class Procs:
I.loc = loc
del(src)
return 1
+
+/obj/machinery/proc/on_assess_perp(mob/living/carbon/human/perp)
+ return 0
+
+/obj/machinery/proc/is_assess_emagged()
+ return emagged
+
+/obj/machinery/proc/assess_perp(mob/living/carbon/human/perp, var/auth_weapons, var/check_records, var/lasercolor)
+ var/threatcount = 0 //the integer returned
+
+ if(is_assess_emagged())
+ return 10 //if emagged, always return 10.
+
+ threatcount += on_assess_perp(perp)
+ if(threatcount >= 10)
+ return threatcount
+
+ if(auth_weapons && !src.allowed(perp))
+ if(istype(perp.l_hand, /obj/item/weapon/gun) || istype(perp.l_hand, /obj/item/weapon/melee))
+ if(!istype(perp.l_hand, /obj/item/weapon/gun/energy/laser/bluetag) \
+ && !istype(perp.l_hand, /obj/item/weapon/gun/energy/laser/redtag) \
+ && !istype(perp.l_hand, /obj/item/weapon/gun/energy/laser/practice))
+ threatcount += 4
+
+ if(istype(perp.r_hand, /obj/item/weapon/gun) || istype(perp.r_hand, /obj/item/weapon/melee))
+ if(!istype(perp.r_hand, /obj/item/weapon/gun/energy/laser/bluetag) \
+ && !istype(perp.r_hand, /obj/item/weapon/gun/energy/laser/redtag) \
+ && !istype(perp.r_hand, /obj/item/weapon/gun/energy/laser/practice))
+ threatcount += 4
+
+ if(istype(perp.belt, /obj/item/weapon/gun) || istype(perp.belt, /obj/item/weapon/melee))
+ if(!istype(perp.belt, /obj/item/weapon/gun/energy/laser/bluetag) \
+ && !istype(perp.belt, /obj/item/weapon/gun/energy/laser/redtag) \
+ && !istype(perp.belt, /obj/item/weapon/gun/energy/laser/practice))
+ threatcount += 2
+
+ if(perp.dna && perp.dna.mutantrace && perp.dna.mutantrace != "none")
+ threatcount += 2
+
+ //Agent cards lower threatlevel.
+ if(perp.wear_id && istype(perp.wear_id.GetID(), /obj/item/weapon/card/id/syndicate))
+ threatcount -= 2
+
+ if(lasercolor == "b")//Lasertag turrets target the opposing team, how great is that? -Sieve
+ threatcount = 0//They will not, however shoot at people who have guns, because it gets really fucking annoying
+ if(istype(perp.wear_suit, /obj/item/clothing/suit/redtag))
+ threatcount += 4
+ if((istype(perp.r_hand,/obj/item/weapon/gun/energy/laser/redtag)) || (istype(perp.l_hand,/obj/item/weapon/gun/energy/laser/redtag)))
+ threatcount += 4
+ if(istype(perp.belt, /obj/item/weapon/gun/energy/laser/redtag))
+ threatcount += 2
+
+ if(lasercolor == "r")
+ threatcount = 0
+ if(istype(perp.wear_suit, /obj/item/clothing/suit/bluetag))
+ threatcount += 4
+ if((istype(perp.r_hand,/obj/item/weapon/gun/energy/laser/bluetag)) || (istype(perp.l_hand,/obj/item/weapon/gun/energy/laser/bluetag)))
+ threatcount += 4
+ if(istype(perp.belt, /obj/item/weapon/gun/energy/laser/bluetag))
+ threatcount += 2
+
+ if(check_records)
+ var/perpname = perp.name
+ if(perp.wear_id)
+ var/obj/item/weapon/card/id/id = perp.wear_id.GetID()
+ if(id)
+ perpname = id.registered_name
+
+ var/datum/data/record/R = find_record("name", perpname, data_core.security)
+ if(!R || (R.fields["criminal"] == "*Arrest*"))
+ threatcount += 4
+
+ return threatcount
diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm
index dabdebb380..4701669b24 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -1,13 +1,11 @@
-/*
- Portable Turrets:
-
+/* Portable Turrets:
Constructed from metal, a gun of choice, and a prox sensor.
- Gun can be a taser or laser or energy gun.
-
This code is slightly more documented than normal, as requested by XSI on IRC.
-
*/
+#define TURRET_PRIORITY_TARGET 2
+#define TURRET_SECONDARY_TARGET 1
+#define TURRET_NOT_TARGET 0
/obj/machinery/porta_turret
name = "turret"
@@ -15,216 +13,187 @@
icon_state = "grey_target_prism"
anchored = 1
layer = 3
- invisibility = INVISIBILITY_LEVEL_TWO // the turret is invisible if it's inside its cover
+ invisibility = INVISIBILITY_LEVEL_TWO //the turret is invisible if it's inside its cover
density = 1
- use_power = 1 // this turret uses and requires power
- idle_power_usage = 50 // when inactive, this turret takes up constant 50 Equipment power
- active_power_usage = 300// when active, this turret takes up constant 300 Equipment power
- req_access = list(access_security)
- power_channel = EQUIP // drains power from the EQUIPMENT channel
+ use_power = 1 //this turret uses and requires power
+ idle_power_usage = 50 //when inactive, this turret takes up constant 50 Equipment power
+ active_power_usage = 300 //when active, this turret takes up constant 300 Equipment power
+ req_access = null
+ req_one_access = list(access_security, access_heads)
+ power_channel = EQUIP //drains power from the EQUIPMENT channel
- var/lasercolor = "" // Something to do with lasertag turrets, blame Sieve for not adding a comment.
- var/raised = 0 // if the turret cover is "open" and the turret is raised
- var/raising= 0 // if the turret is currently opening or closing its cover
- var/health = 80 // the turret's health
- var/locked = 1 // if the turret's behaviour control access is locked
+ var/lasercolor = "" //Something to do with lasertag turrets, blame Sieve for not adding a comment.
+ var/raised = 0 //if the turret cover is "open" and the turret is raised
+ var/raising= 0 //if the turret is currently opening or closing its cover
+ var/health = 80 //the turret's health
+ var/locked = 1 //if the turret's behaviour control access is locked
+ var/controllock = 0 //if the turret responds to control panels
- var/installation // the type of weapon installed
- var/gun_charge = 0 // the charge of the gun inserted
+ var/installation = /obj/item/weapon/gun/energy/gun //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/sound = null//So the taser can have sound
- var/iconholder = null//holder for the icon_state
- var/egun = null//holder to handle certain guns switching bullettypes
+ var/eprojectile = null //holder for the shot when emagged
+ var/reqpower = 500 //holder for power needed
+ var/iconholder = null //holder for the icon_state. 1 for orange sprite, null for blue.
+ var/egun = null //holder to handle certain guns switching bullettypes
- 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
- var/shot_delay = 15 // 1.5 seconds between each 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
+ var/shot_delay = 15 //1.5 seconds between each shot
- var/check_records = 1 // checks if it can use the security records
- var/criminals = 1 // checks if it can shoot people on arrest
- var/auth_weapons = 0 // checks if it can shoot people that have a weapon they aren't authorized to have
- var/stun_all = 0 // if this is active, the turret shoots everything that isn't security or head of staff
- var/check_anomalies = 1 // checks if it can shoot at unidentified lifeforms (ie xenos)
- var/ai = 0 // if active, will shoot at anything not an AI or cyborg
+ var/check_records = 1 //checks if it can use the security records
+ var/auth_weapons = 0 //checks if it can shoot people that have a weapon they aren't authorized to have
+ var/stun_all = 1 //if this is active, the turret shoots everything that does not meet the access requirements
+ var/check_anomalies = 1 //checks if it can shoot at unidentified lifeforms (ie xenos)
+ var/ai = 0 //if active, will shoot at anything not an AI or cyborg
+ var/ailock = 0 // AI cannot use this
- var/attacked = 0 // if set to 1, the turret gets pissed off and shoots at people nearby (unless they have sec access!)
+ 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/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?
+ var/shot_sound //what sound should play when the turret fires
+ var/eshot_sound //what sound should play when the emagged turret fires
- New()
- ..()
- icon_state = "[lasercolor]grey_target_prism"
- // Sets up a spark system
- spark_system = new /datum/effect/effect/system/spark_spread
- spark_system.set_up(5, 0, src)
- spark_system.attach(src)
- sleep(10)
- if(!installation)// if for some reason the turret has no gun (ie, admin spawned) it resorts to basic taser shots
- projectile = /obj/item/projectile/beam/stun//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
- sound = 1
+ var/datum/effect/effect/system/spark_spread/spark_system //the spark system, used for generating... sparks?
+
+/obj/machinery/porta_turret/New()
+ ..()
+ icon_state = "[lasercolor]grey_target_prism"
+ //Sets up a spark system
+ spark_system = new /datum/effect/effect/system/spark_spread
+ spark_system.set_up(5, 0, src)
+ spark_system.attach(src)
+
+ cover = new /obj/machinery/porta_turret_cover(loc)
+ cover.Parent_Turret = src
+ setup()
+
+/obj/machinery/porta_turret/proc/setup()
+
+ var/obj/item/weapon/gun/energy/E = new installation //All energy-based weapons are applicable
+ //var/obj/item/ammo_casing/shottype = E.projectile_type
+
+ projectile = E.projectile_type
+ eprojectile = projectile
+ shot_sound = E.fire_sound
+ eshot_sound = shot_sound
+
+ switch(E.type)
+ if(/obj/item/weapon/gun/energy/laser/bluetag)
+ eprojectile = /obj/item/weapon/gun/energy/laser/bluetag
+ lasercolor = "b"
+ req_access = list(access_maint_tunnels, access_theatre)
+ check_records = 0
+ auth_weapons = 1
+ stun_all = 0
+ check_anomalies = 0
+ shot_delay = 30
+
+ if(/obj/item/weapon/gun/energy/laser/redtag)
+ eprojectile = /obj/item/weapon/gun/energy/laser/redtag
+ lasercolor = "r"
+ req_access = list(access_maint_tunnels, access_theatre)
+ check_records = 0
+ auth_weapons = 1
+ stun_all = 0
+ check_anomalies = 0
+ shot_delay = 30
iconholder = 1
- else
- var/obj/item/weapon/gun/energy/E=new installation
- // All energy-based weapons are applicable
- switch(E.type)
- if(/obj/item/weapon/gun/energy/laser/bluetag)
- projectile = /obj/item/projectile/beam/lastertag/blue
- eprojectile = /obj/item/projectile/beam/lastertag/omni//This bolt will stun ERRYONE with a vest
- iconholder = null
- reqpower = 100
- lasercolor = "b"
- req_access = list(access_maint_tunnels)
- check_records = 0
- criminals = 0
- 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/lastertag/red
- eprojectile = /obj/item/projectile/beam/lastertag/omni
- iconholder = null
- reqpower = 100
- lasercolor = "r"
- req_access = list(access_maint_tunnels)
- check_records = 0
- criminals = 0
- auth_weapons = 1
- stun_all = 0
- check_anomalies = 0
- shot_delay = 30
+ if(/obj/item/weapon/gun/energy/laser/practice)
+ iconholder = 1
+ eprojectile = /obj/item/projectile/beam
- 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/laser/practice/sc_laser)
+// iconholder = 1
+// eprojectile = /obj/item/projectile/beam
- if(/obj/item/weapon/gun/energy/pulse_rifle)
- projectile = /obj/item/projectile/beam/pulse
- eprojectile = projectile
- iconholder = null
- reqpower = 700
+ if(/obj/item/weapon/gun/energy/laser/retro)
+ iconholder = 1
- if(/obj/item/weapon/gun/energy/staff)
- projectile = /obj/item/projectile/change
- eprojectile = projectile
- iconholder = 1
- reqpower = 700
+// if(/obj/item/weapon/gun/energy/laser/retro/sc_retro)
+// iconholder = 1
- if(/obj/item/weapon/gun/energy/ionrifle)
- projectile = /obj/item/projectile/ion
- eprojectile = projectile
- iconholder = 1
- reqpower = 700
+ if(/obj/item/weapon/gun/energy/laser/captain)
+ iconholder = 1
- if(/obj/item/weapon/gun/energy/taser)
- projectile = /obj/item/projectile/beam/stun
- eprojectile = projectile
- iconholder = 1
- reqpower = 200
+ if(/obj/item/weapon/gun/energy/lasercannon)
+ iconholder = 1
- if(/obj/item/weapon/gun/energy/stunrevolver)
- projectile = /obj/item/projectile/energy/electrode
- eprojectile = projectile
- iconholder = 1
- reqpower = 200
+ if(/obj/item/weapon/gun/energy/taser)
+ eprojectile = /obj/item/projectile/beam
+ eshot_sound = 'sound/weapons/Laser.ogg'
- if(/obj/item/weapon/gun/energy/lasercannon)
- projectile = /obj/item/projectile/beam/heavylaser
- eprojectile = projectile
- iconholder = null
- reqpower = 600
+ if(/obj/item/weapon/gun/energy/stunrevolver)
+ eprojectile = /obj/item/projectile/beam
+ eshot_sound = 'sound/weapons/Laser.ogg'
- if(/obj/item/weapon/gun/energy/decloner)
- projectile = /obj/item/projectile/energy/declone
- eprojectile = projectile
- iconholder = null
- reqpower = 600
+ if(/obj/item/weapon/gun/energy/gun)
+ eprojectile = /obj/item/projectile/beam //If it has, going to kill mode
+ eshot_sound = 'sound/weapons/Laser.ogg'
+ egun = 1
- if(/obj/item/weapon/gun/energy/crossbow/largecrossbow)
- projectile = /obj/item/projectile/energy/bolt/large
- eprojectile = projectile
- iconholder = null
- reqpower = 125
-
- if(/obj/item/weapon/gun/energy/crossbow)
- projectile = /obj/item/projectile/energy/bolt
- eprojectile = projectile
- iconholder = null
- reqpower = 50
-
- if(/obj/item/weapon/gun/energy/laser)
- projectile = /obj/item/projectile/beam
- eprojectile = projectile
- iconholder = null
- reqpower = 500
-
- else // Energy gun shots
- projectile = /obj/item/projectile/beam/stun// 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
-
- Del()
- // deletes its own cover with it
- del(cover)
- ..()
+ if(/obj/item/weapon/gun/energy/gun/nuclear)
+ eprojectile = /obj/item/projectile/beam //If it has, going to kill mode
+ eshot_sound = 'sound/weapons/Laser.ogg'
+ egun = 1
-/obj/machinery/porta_turret/attack_ai(mob/user as mob)
- return attack_hand(user)
+/obj/machinery/porta_turret/Del()
+ //deletes its own cover with it
+ del(cover) // qdel
+ ..()
-/obj/machinery/porta_turret/attack_hand(mob/user as mob)
+
+/obj/machinery/porta_turret/attack_ai(mob/user)
+ if(!ailock)
+ return attack_hand(user)
+ else
+ user << "There seems to be a firewall preventing you from accessing this device."
+
+
+/obj/machinery/porta_turret/attack_hand(mob/user)
. = ..()
- if (.)
+ if(.)
return
var/dat
- // The browse() text, similar to ED-209s and beepskies.
- if(!(src.lasercolor))//Lasertag turrets have less options
+ //The browse() text, similar to ED-209s and beepskies.
+ if(!lasercolor) //Lasertag turrets have less options
dat += text({"
-Automatic Portable Turret Installation
-Status: []
-Behaviour controls are [src.locked ? "locked" : "unlocked"]"},
+ Automatic Portable Turret Installation
+ Status: []
+ Behaviour controls are [locked ? "locked" : "unlocked"]"},
-"[src.on ? "On" : "Off"]" )
+ "[on ? "On" : "Off"]" )
- if(!src.locked)
- dat += text({"
-Check for Weapon Authorization: []
-Check Security Records: []
-Neutralize Identified Criminals: []
-Neutralize All Non-Security and Non-Command Personnel: []
-Neutralize All Unidentified Life Signs: []
"},
+ if(!locked || issilicon(user))
+ dat += text({"
+ Neutralize All Non-Synthetics: []
+ Check for Weapon Authorization: []
+ Check Security Records: []
+ Neutralize All Non-Authorized Personnel: []
+ Neutralize All Unidentified Life Signs: []
"},
-"[src.auth_weapons ? "Yes" : "No"]",
-"[src.check_records ? "Yes" : "No"]",
-"[src.criminals ? "Yes" : "No"]",
-"[stun_all ? "Yes" : "No"]",
-"[check_anomalies ? "Yes" : "No"]" )
+ "[ai ? "Yes" : "No"]",
+ "[auth_weapons ? "Yes" : "No"]",
+ "[check_records ? "Yes" : "No"]",
+ "[stun_all ? "Yes" : "No"]",
+ "[check_anomalies ? "Yes" : "No"]" )
else
if(istype(user,/mob/living/carbon/human))
var/mob/living/carbon/human/H = user
- if(((src.lasercolor) == "b") && (istype(H.wear_suit, /obj/item/clothing/suit/redtag)))
+ if(lasercolor == "b" && istype(H.wear_suit, /obj/item/clothing/suit/redtag))
return
- if(((src.lasercolor) == "r") && (istype(H.wear_suit, /obj/item/clothing/suit/bluetag)))
+ if(lasercolor == "r" && istype(H.wear_suit, /obj/item/clothing/suit/bluetag))
return
dat += text({"
-Automatic Portable Turret Installation
-Status: []
"},
+ Automatic Portable Turret Installation
+ Status: []
"},
-"[src.on ? "On" : "Off"]" )
+ "[on ? "On" : "Off"]" )
user << browse("
Automatic Portable Turret Installation[dat]", "window=autosec")
@@ -232,28 +201,26 @@ Status: []
"},
return
/obj/machinery/porta_turret/Topic(href, href_list)
- if (..())
+ if(..())
return
usr.set_machine(src)
- src.add_fingerprint(usr)
- if ((href_list["power"]) && (src.allowed(usr)))
- if(anchored) // you can't turn a turret on/off if it's not anchored/secured
- on = !on // toggle on/off
+ add_fingerprint(usr)
+ if(href_list["power"] && (!locked || issilicon(usr)))
+ if(anchored) //you can't turn a turret on/off if it's not anchored/secured
+ on = !on //toggle on/off
else
- usr << "\red It has to be secured first!"
+ usr << "It has to be secured first!"
updateUsrDialog()
return
- switch(href_list["operation"])
- // toggles customizable behavioural protocols
-
- if ("authweapon")
- src.auth_weapons = !src.auth_weapons
- if ("checkrecords")
- src.check_records = !src.check_records
- if ("shootcrooks")
- src.criminals = !src.criminals
+ switch(href_list["operation"]) //toggles customizable behavioural protocols
+ if("toggleai")
+ ai = !ai
+ if("authweapon")
+ auth_weapons = !auth_weapons
+ if("checkrecords")
+ check_records = !check_records
if("shootall")
stun_all = !stun_all
updateUsrDialog()
@@ -264,94 +231,94 @@ Status: []
"},
if(!anchored)
icon_state = "turretCover"
return
-
- ..()
if(stat & BROKEN)
icon_state = "[lasercolor]destroyed_target_prism"
else
- if( !(stat & NOPOWER) )
- 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(powered())
+ if(on)
+ if(iconholder)
+ //lasers have a orange icon
icon_state = "[lasercolor]orange_target_prism"
else
- // anything else has a blue icon
+ //almost everything has a blue icon
icon_state = "[lasercolor]target_prism"
else
icon_state = "[lasercolor]grey_target_prism"
+ stat &= ~NOPOWER
else
spawn(rand(0, 15))
- src.icon_state = "[lasercolor]grey_target_prism"
+ icon_state = "[lasercolor]grey_target_prism"
+ stat |= NOPOWER
-/obj/machinery/porta_turret/attackby(obj/item/W as obj, mob/user as mob)
+/obj/machinery/porta_turret/attackby(obj/item/I, mob/user)
if(stat & BROKEN)
- if(istype(W, /obj/item/weapon/crowbar))
-
- // If the turret is destroyed, you can remove it with a crowbar to
- // try and salvage its components
- user << "You begin prying the metal coverings off."
+ if(istype(I, /obj/item/weapon/crowbar))
+ //If the turret is destroyed, you can remove it with a crowbar to
+ //try and salvage its components
+ user << "You begin prying the metal coverings off."
sleep(20)
if(prob(70))
- user << "You remove the turret and salvage some components."
+ 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
+ var/obj/item/weapon/gun/energy/Gun = new installation(loc)
+ Gun.power_supply.charge = gun_charge
Gun.update_icon()
lasercolor = null
- if(prob(50)) new /obj/item/stack/sheet/metal( loc, rand(1,4))
- if(prob(50)) new /obj/item/device/assembly/prox_sensor(locate(x,y,z))
+ if(prob(50))
+ new /obj/item/stack/sheet/metal(loc, rand(1,4))
+ if(prob(50))
+ new /obj/item/device/assembly/prox_sensor(loc)
else
- user << "You remove the turret but did not manage to salvage anything."
- del(src)
+ user << "You remove the turret but did not manage to salvage anything."
+ del(src) // qdel
-
- if ((istype(W, /obj/item/weapon/card/emag)) && (!src.emagged))
- // Emagging the turret makes it go bonkers and stun everyone. It also makes
- // the turret shoot much, much faster.
-
- user << "\red You short out [src]'s threat assessment circuits."
- spawn(0)
- for(var/mob/O in hearers(src, null))
- O.show_message("\red [src] hums oddly...", 1)
+ if(istype(I, /obj/item/weapon/card/emag) && !emagged)
+ //Emagging the turret makes it go bonkers and stun everyone. It also makes
+ //the turret shoot much, much faster.
+ user << "You short out [src]'s threat assessment circuits."
+ visible_message("[src] hums oddly...")
emagged = 1
- src.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
+ iconholder = 1
+ controllock = 1
+ 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
- else if((istype(W, /obj/item/weapon/wrench)) && (!on))
+ else if((istype(I, /obj/item/weapon/wrench)) && (!on))
if(raised) return
- // This code handles moving the turret around. After all, it's a portable turret!
-
- if(!anchored)
+ //This code handles moving the turret around. After all, it's a portable turret!
+ if(!anchored && !isinspace())
anchored = 1
invisibility = INVISIBILITY_LEVEL_TWO
icon_state = "[lasercolor]grey_target_prism"
- 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.Parent_Turret = src // make the cover's parent src
- else
+ user << "You secure the exterior bolts on the turret."
+ cover = new /obj/machinery/porta_turret_cover(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.Parent_Turret = src //make the cover's parent src
+ else if(anchored)
anchored = 0
- user << "You unsecure the exterior bolts on the turret."
+ user << "You unsecure the exterior bolts on the turret."
icon_state = "turretCover"
invisibility = 0
- del(cover) // deletes the cover, and the turret instance itself becomes its own cover.
+ del(cover) //deletes the cover, and the turret instance itself becomes its own cover. - qdel
- else if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
- // Behavior lock/unlock mangement
- if (allowed(user))
- locked = !src.locked
- user << "Controls are now [locked ? "locked." : "unlocked."]"
+ else if(istype(I, /obj/item/weapon/card/id)||istype(I, /obj/item/device/pda))
+ //Behavior lock/unlock mangement
+ if(allowed(user))
+ locked = !locked
+ user << "Controls are now [locked ? "locked" : "unlocked"]."
+ updateUsrDialog()
else
- user << "\red Access denied."
+ user << "Access denied."
else
- // 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 the turret was attacked with the intention of harming it:
+ user.changeNext_move(CLICK_CD_MELEE)
+ health -= I.force * 0.5
+ if(health <= 0)
+ die()
+ if(I.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()
@@ -360,8 +327,7 @@ Status: []
"},
..()
-
-/obj/machinery/porta_turret/bullet_act(var/obj/item/projectile/Proj)
+/obj/machinery/porta_turret/bullet_act(obj/item/projectile/Proj)
if(on)
if(!attacked && !emagged)
attacked = 1
@@ -369,34 +335,40 @@ Status: []
"},
sleep(60)
attacked = 0
- src.health -= Proj.damage
+ if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
+ health -= Proj.damage
+
..()
- if(prob(45) && Proj.damage > 0) src.spark_system.start()
- if (src.health <= 0)
- src.die() // the death process :(
- if((src.lasercolor == "b") && (src.disabled == 0))
- if(istype(Proj, /obj/item/projectile/beam/lastertag/red))
- src.disabled = 1
- del (Proj)
+
+ if(prob(45) && Proj.damage > 0)
+ spark_system.start()
+ if(health <= 0)
+ die() //the death process :(
+
+ if(lasercolor == "b" && disabled == 0)
+ if(istype(Proj, /obj/item/weapon/gun/energy/laser/redtag))
+ disabled = 1
+ del(Proj) // qdel
sleep(100)
- src.disabled = 0
- if((src.lasercolor == "r") && (src.disabled == 0))
- if(istype(Proj, /obj/item/projectile/beam/lastertag/blue))
- src.disabled = 1
- del (Proj)
+ disabled = 0
+ if(lasercolor == "r" && disabled == 0)
+ if(istype(Proj, /obj/item/weapon/gun/energy/laser/bluetag))
+ disabled = 1
+ del(Proj) // qdel
sleep(100)
- src.disabled = 0
- return
+ disabled = 0
+
/obj/machinery/porta_turret/emp_act(severity)
if(on)
- // if the turret is on, the EMP no matter how severe disables the turret for a while
- // and scrambles its settings, with a slight chance of having an emag effect
- check_records=pick(0,1)
- criminals=pick(0,1)
- 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
+ //if the turret is on, the EMP no matter how severe disables the turret for a while
+ //and scrambles its settings, with a slight chance of having an emag effect
+ check_records = pick(0, 1)
+ 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
+
on=0
sleep(rand(60,600))
if(!on)
@@ -405,225 +377,181 @@ Status: []
"},
..()
/obj/machinery/porta_turret/ex_act(severity)
- if(severity >= 3) // turret dies if an explosion touches it!
- del(src)
+ if(severity >= 3) //turret dies if an explosion touches it!
+ del(src) // qdel
else
- src.die()
+ die()
-/obj/machinery/porta_turret/proc/die() // called when the turret dies, ie, health <= 0
- src.health = 0
- src.density = 0
- src.stat |= BROKEN // enables the BROKEN bit
- src.icon_state = "[lasercolor]destroyed_target_prism"
- invisibility=0
- src.spark_system.start() // creates some sparks because they look cool
- src.density=1
- del(cover) // deletes the cover - no need on keeping it there!
+/obj/machinery/porta_turret/proc/die() //called when the turret dies, ie, health <= 0
+ health = 0
+ density = 0
+ stat |= BROKEN //enables the BROKEN bit
+ icon_state = "[lasercolor]destroyed_target_prism"
+ invisibility = 0
+ spark_system.start() //creates some sparks because they look cool
+ density = 1
+ del(cover) //deletes the cover - no need on keeping it there! - del
/obj/machinery/porta_turret/process()
- // the main machinery process
+ //the main machinery process
- set background = 1
+ set background = BACKGROUND_ENABLED
- if(src.cover==null && anchored) // if it has no cover and is anchored
- if (stat & BROKEN) // if the turret is borked
- del(cover) // delete its cover, assuming it has one. Workaround for a pesky little bug
+ if(cover == null && anchored) //if it has no cover and is anchored
+ if(stat & BROKEN) //if the turret is borked
+ del(cover) //delete its cover, assuming it has one. Workaround for a pesky little bug - qdel
else
- src.cover = new /obj/machinery/porta_turret_cover(src.loc) // if the turret has no cover and is anchored, give it a cover
- src.cover.Parent_Turret = src // assign the cover its Parent_Turret, which would be this (src)
+ cover = new /obj/machinery/porta_turret_cover(loc) //if the turret has no cover and is anchored, give it a cover
+ cover.Parent_Turret = src //assign the cover its Parent_Turret, which would be this (src)
if(stat & (NOPOWER|BROKEN))
- // if the turret has no power or is broken, make the turret pop down if it hasn't already
+ //if the turret has no power or is broken, make the turret pop down if it hasn't already
popDown()
return
if(!on)
- // if the turret is off, make it pop down
+ //if the turret is off, make it pop down
popDown()
return
- var/list/targets = list() // list of primary targets
- var/list/secondarytargets = list() // targets that are least important
+ 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)
- targets += C
+ for(var/obj/mecha/ME in view(7,src))
+ assess_and_assign(ME.occupant, targets, secondarytargets)
- for (var/mob/living/carbon/C in view(7,src)) // loops through all living carbon-based lifeforms in view(12)
- 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
+ for(var/obj/vehicle/train/T in view(7,src))
+ assess_and_assign(T.load, targets, secondarytargets)
- else
- if(emagged) // if emagged, HOLY SHIT EVERYONE IS DANGEROUS beep boop beep
- targets += C
+ for(var/mob/living/C in view(7,src)) //loops through all living lifeforms in view
+ assess_and_assign(C, targets, secondarytargets)
+
+ if(!tryToShootAt(targets))
+ if(!tryToShootAt(secondarytargets)) // if no valid targets, go for secondary targets
+ spawn()
+ popDown() // no valid targets, close the cover
+
+/obj/machinery/porta_turret/proc/assess_and_assign(var/mob/living/L, var/list/targets, var/list/secondarytargets)
+ switch(assess_living(L))
+ if(TURRET_PRIORITY_TARGET)
+ targets += L
+ if(TURRET_SECONDARY_TARGET)
+ secondarytargets += L
+
+/obj/machinery/porta_turret/proc/assess_living(var/mob/living/L)
+ if(!L)
+ return TURRET_NOT_TARGET
+
+ if(emagged && !isAI(L)) //if emagged, target everything (except the AI, otherwise lethal-set turrets attempt to fire at it in the core)
+ return TURRET_PRIORITY_TARGET
+
+ if(issilicon(L)) // Don't target silica
+ return TURRET_NOT_TARGET
+
+ if(L.stat) //if the perp is dead/dying, no need to bother really
+ return TURRET_NOT_TARGET //move onto next potential victim!
+
+ var/dst = get_dist(src, L) //if it's too far away, why bother?
+ if(dst > 7)
+ return 0
+
+ if(ai) //If it's set to attack all non-silicons, target them!
+ if(L.lying)
+ if(lasercolor)
+ return TURRET_NOT_TARGET
else
- if (C.stat || C.handcuffed) // 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
- else
- targets += C
- 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
-
- else if (istype(C, /mob/living/carbon/monkey))
- 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
- continue
-
- targets += C // 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
-
- var/atom/t = pick(targets) // pick a perp from the list of targets. Targets go first because they are the most important
-
- if (istype(t, /mob/living)) // if a mob
- var/mob/living/M = t // simple typecasting
- if (M.stat!=2) // if the target is not dead
- spawn() popUp() // pop the turret up if it's not already up.
- dir=get_dir(src,M) // even if you can't shoot, follow the target
- spawn() shootAt(M) // shoot the target, finally
-
- else
- if(secondarytargets.len>0) // if there are no primary targets, go for secondary targets
- var/mob/t = pick(secondarytargets)
- if (istype(t, /mob/living))
- if (t.stat!=2)
- spawn() popUp()
- dir=get_dir(src,t)
- shootAt(t)
+ return TURRET_SECONDARY_TARGET
else
- spawn() popDown()
+ return TURRET_PRIORITY_TARGET
-/obj/machinery/porta_turret/proc
- popUp() // pops the turret up
- if(disabled)
- return
- if(raising || raised) return
- if(stat & BROKEN) return
- invisibility=0
- raising=1
- flick("popup",cover)
- sleep(5)
- sleep(5)
- raising=0
- cover.icon_state="openTurretCover"
- raised=1
- layer=4
+ if(iscuffed(L)) // If the target is handcuffed, leave it alone
+ return TURRET_NOT_TARGET
- popDown() // pops the turret down
- if(disabled)
- return
- if(raising || !raised) return
- if(stat & BROKEN) return
- layer=3
- raising=1
- flick("popdown",cover)
- sleep(10)
- raising=0
- cover.icon_state="turretCover"
- raised=0
- invisibility=2
- icon_state="[lasercolor]grey_target_prism"
+ if(isanimal(L)) // Animals are not so dangerous
+ return check_anomalies ? TURRET_SECONDARY_TARGET : TURRET_NOT_TARGET
+ if(isxenomorph(L) || isalien(L)) // Xenos are dangerous
+ return check_anomalies ? TURRET_PRIORITY_TARGET : TURRET_NOT_TARGET
+
+ if(ishuman(L)) //if the target is a human, analyze threat level
+ if(assess_perp(L, auth_weapons, check_records, lasercolor) < 4)
+ return TURRET_NOT_TARGET //if threat level < 4, keep going
+ else if(ismonkey(L))
+ return TURRET_NOT_TARGET //Don't target monkeys or borgs/AIs
+
+ if(L.lying) //if the perp is lying down, it's still a target but a less-important target
+ return TURRET_SECONDARY_TARGET
+
+ return TURRET_PRIORITY_TARGET //if the perp has passed all previous tests, congrats, it is now a "shoot-me!" nominee
+
+/obj/machinery/porta_turret/proc/tryToShootAt(var/list/mob/living/targets)
+ while(targets.len > 0)
+ var/mob/living/M = pick(targets)
+ targets -= M
+ if(target(M))
+ return 1
-/obj/machinery/porta_turret/proc/assess_perp(mob/living/carbon/human/perp as mob)
- var/threatcount = 0 // the integer returned
-
- if(src.emagged) return 10 // if emagged, always return 10.
-
- 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
-
- if(auth_weapons) // check for weapon authorization
- if((isnull(perp.wear_id)) || (istype(perp.wear_id.GetID(), /obj/item/weapon/card/id/syndicate)))
-
- if((src.allowed(perp)) && !(src.lasercolor)) // if the perp has security access, return 0
- return 0
-
- if((istype(perp.l_hand, /obj/item/weapon/gun) && !istype(perp.l_hand, /obj/item/weapon/gun/projectile/shotgun)) || istype(perp.l_hand, /obj/item/weapon/melee/baton))
- threatcount += 4
-
- if((istype(perp.r_hand, /obj/item/weapon/gun) && !istype(perp.r_hand, /obj/item/weapon/gun/projectile/shotgun)) || istype(perp.r_hand, /obj/item/weapon/melee/baton))
- threatcount += 4
-
- if(istype(perp.belt, /obj/item/weapon/gun) || istype(perp.belt, /obj/item/weapon/melee/baton))
- threatcount += 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
- if((istype(perp.r_hand,/obj/item/weapon/gun/energy/laser/redtag)) || (istype(perp.l_hand,/obj/item/weapon/gun/energy/laser/redtag)))
- threatcount += 4
- if(istype(perp.belt, /obj/item/weapon/gun/energy/laser/redtag))
- threatcount += 2
-
- if((src.lasercolor) == "r")
- threatcount = 0
- if(istype(perp.wear_suit, /obj/item/clothing/suit/bluetag))
- threatcount += 4
- if((istype(perp.r_hand,/obj/item/weapon/gun/energy/laser/bluetag)) || (istype(perp.l_hand,/obj/item/weapon/gun/energy/laser/bluetag)))
- threatcount += 4
- if(istype(perp.belt, /obj/item/weapon/gun/energy/laser/bluetag))
- threatcount += 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)
-
- var/perpname = perp.name
- if (perp.wear_id)
- var/obj/item/weapon/card/id/id = perp.wear_id.GetID()
- if (id)
- perpname = id.registered_name
-
- 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
- break
-
-
-
- return threatcount
-
-
-
-
-
-/obj/machinery/porta_turret/proc/shootAt(var/atom/movable/target) // shoots at a target
+/obj/machinery/porta_turret/proc/popUp() //pops the turret up
if(disabled)
return
+ if(raising || raised)
+ return
+ if(stat & BROKEN)
+ return
+ invisibility = 0
+ raising = 1
+ flick("popup", cover)
+ sleep(10)
+ raising = 0
+ cover.icon_state = "openTurretCover"
+ raised = 1
+ layer = 4
- if(lasercolor && (istype(target,/mob/living/carbon/human)))
- var/mob/living/carbon/human/H = target
- if(H.lying)
+/obj/machinery/porta_turret/proc/popDown() //pops the turret down
+ if(disabled)
+ return
+ if(raising || !raised)
+ return
+ if(stat & BROKEN)
+ return
+ layer = 3
+ raising = 1
+ flick("popdown", cover)
+ sleep(10)
+ raising = 0
+ cover.icon_state = "turretCover"
+ raised = 0
+ invisibility = 2
+ icon_state = "[lasercolor]grey_target_prism"
+
+
+/obj/machinery/porta_turret/on_assess_perp(mob/living/carbon/human/perp)
+ if((stun_all || attacked) && !allowed(perp))
+ //if the turret has been attacked or is angry, target all non-authorized personnel, see req_access
+ return 10
+
+ return ..()
+
+
+/obj/machinery/porta_turret/proc/target(var/mob/living/target)
+ if(disabled)
+ return
+ if(target && (target.stat != DEAD) && (!(target.lying) || emagged))
+ spawn()
+ popUp() //pop the turret up if it's not already up.
+ dir = get_dir(src, target) //even if you can't shoot, follow the target
+ spawn()
+ shootAt(target)
+ return 1
+ return
+
+/obj/machinery/porta_turret/proc/shootAt(var/mob/living/target)
+ if(!emagged) //if it hasn't been emagged, it has to obey a cooldown rate
+ if(last_fired || !raised) //prevents rapid-fire shooting, unless it's been emagged
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)
@@ -631,47 +559,47 @@ Status: []
"},
var/turf/T = get_turf(src)
var/turf/U = get_turf(target)
- if (!istype(T) || !istype(U))
+ if(!istype(T) || !istype(U))
return
- if (!raised) // the turret has to be raised in order to fire - makes sense, right?
+ 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!
-
+ //any emagged turrets will shoot extremely fast! This not only is deadly, but drains a lot power!
if(iconholder)
- icon_state = "[lasercolor]target_prism"
- else
icon_state = "[lasercolor]orange_target_prism"
- if(sound)
- playsound(src.loc, 'sound/weapons/Taser.ogg', 75, 1)
+ else
+ icon_state = "[lasercolor]target_prism"
var/obj/item/projectile/A
if(emagged)
- A = new eprojectile( loc )
+ A = new eprojectile(loc)
+ playsound(loc, eshot_sound, 75, 1)
else
- A = new projectile( loc )
- A.original = target.loc
+ A = new projectile(loc)
+ playsound(loc, shot_sound, 75, 1)
+ A.original = target
if(!emagged)
use_power(reqpower)
else
- use_power((reqpower*2))
- // Shooting Code:
+ use_power(reqpower * 2)
+ //Shooting Code:
A.current = T
A.yo = U.y - T.y
A.xo = U.x - T.x
- spawn( 1 )
+ spawn(1)
A.process()
- return
-
+/obj/machinery/porta_turret/proc/setState(var/on, var/emagged)
+ if(controllock)
+ return
+ src.on = on
+ src.emagged = emagged
+ src.iconholder = emagged
+ src.power_change()
/*
-
Portable turret constructions
-
Known as "turret frame"s
-
*/
/obj/machinery/porta_turret_construct
@@ -679,66 +607,65 @@ Status: []
"},
icon = 'icons/obj/turrets.dmi'
icon_state = "turret_frame"
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/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
-
-/obj/machinery/porta_turret_construct/attackby(obj/item/W as obj, mob/user as mob)
-
- // this is a bit unweildy but self-explanitory
+/obj/machinery/porta_turret_construct/attackby(obj/item/I, mob/user)
+ //this is a bit unwieldy but self-explanatory
switch(build_step)
- if(0) // first step
- if(istype(W, /obj/item/weapon/wrench) && !anchored)
- playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
- user << "\blue You secure the external bolts."
+ if(0) //first step
+ if(istype(I, /obj/item/weapon/wrench) && !anchored)
+ playsound(loc, 'sound/items/Ratchet.ogg', 100, 1)
+ user << "You secure the external bolts."
anchored = 1
build_step = 1
return
- else if(istype(W, /obj/item/weapon/crowbar) && !anchored)
- playsound(src.loc, 'sound/items/Crowbar.ogg', 75, 1)
- user << "You dismantle the turret construction."
+ else if(istype(I, /obj/item/weapon/crowbar) && !anchored)
+ playsound(loc, 'sound/items/Crowbar.ogg', 75, 1)
+ user << "You dismantle the turret construction."
new /obj/item/stack/sheet/metal( loc, 5)
- del(src)
+ del(src) // qdel
return
if(1)
- if(istype(W, /obj/item/stack/sheet/metal))
- var/obj/item/stack/sheet/metal/M = W
- if (M.use(2))
+ if(istype(I, /obj/item/stack/sheet/metal))
+ var/obj/item/stack/sheet/metal/M = I
+ if(M.use(2))
user << "You add some metal armor to the interior frame."
build_step = 2
icon_state = "turret_frame2"
else
- user << "You need two sheets of metal to add armor ot the frame."
+ user << "You need two sheets of metal to continue construction."
return
- else if(istype(W, /obj/item/weapon/wrench))
- playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
- user << "You unfasten the external bolts."
+ else if(istype(I, /obj/item/weapon/wrench))
+ playsound(loc, 'sound/items/Ratchet.ogg', 75, 1)
+ user << "You unfasten the external bolts."
anchored = 0
build_step = 0
return
if(2)
- if(istype(W, /obj/item/weapon/wrench))
- playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
- user << "\blue You bolt the metal armor into place."
+ if(istype(I, /obj/item/weapon/wrench))
+ playsound(loc, 'sound/items/Ratchet.ogg', 100, 1)
+ user << "You bolt the metal armor into place."
build_step = 3
return
- else if(istype(W, /obj/item/weapon/weldingtool))
- var/obj/item/weapon/weldingtool/WT = W
- if(!WT.isOn()) return
- if (WT.get_fuel() < 5) // uses up 5 fuel.
- user << "\red You need more fuel to complete this task."
+ else if(istype(I, /obj/item/weapon/weldingtool))
+ var/obj/item/weapon/weldingtool/WT = I
+ if(!WT.isOn())
+ return
+ if(WT.get_fuel() < 5) //uses up 5 fuel.
+ user << "You need more fuel to complete this task."
return
- playsound(src.loc, pick('sound/items/Welder.ogg', 'sound/items/Welder2.ogg'), 50, 1)
+ playsound(loc, pick('sound/items/Welder.ogg', 'sound/items/Welder2.ogg'), 50, 1)
if(do_after(user, 20))
if(!src || !WT.remove_fuel(5, user)) return
build_step = 1
@@ -748,130 +675,136 @@ Status: []
"},
if(3)
- if(istype(W, /obj/item/weapon/gun/energy)) // the gun installation part
+ if(istype(I, /obj/item/weapon/gun/energy)) //the gun installation part
- 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
- user << "\blue You add \the [W] to the turret."
+ if(isrobot(user))
+ return
+ var/obj/item/weapon/gun/energy/E = I //typecasts the item to an energy gun
+ if(!user.unEquip(I))
+ user << "\the [I] is stuck to your hand, you cannot put it in \the [src]"
+ return
+ installation = I.type //installation becomes I.type
+ gun_charge = E.power_supply.charge //the gun's charge is stored in gun_charge
+ user << "You add [I] to the turret."
build_step = 4
- del(W) // delete the gun :(
+ del(I) //delete the gun :( qdel
return
- else if(istype(W, /obj/item/weapon/wrench))
- playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
- user << "You remove the turret's metal armor bolts."
+ else if(istype(I, /obj/item/weapon/wrench))
+ playsound(loc, 'sound/items/Ratchet.ogg', 100, 1)
+ user << "You remove the turret's metal armor bolts."
build_step = 2
return
if(4)
- if(isprox(W))
+ if(isprox(I))
build_step = 5
- user << "\blue You add the prox sensor to the turret."
- del(W)
+ if(!user.unEquip(I))
+ user << "\the [I] is stuck to your hand, you cannot put it in \the [src]"
+ return
+ user << "You add the prox sensor to the turret."
+ del(I) // qdel
return
- // attack_hand() removes the gun
+ //attack_hand() removes the gun
if(5)
- if(istype(W, /obj/item/weapon/screwdriver))
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1)
+ if(istype(I, /obj/item/weapon/screwdriver))
+ playsound(loc, 'sound/items/Screwdriver.ogg', 100, 1)
build_step = 6
- user << "\blue You close the internal access hatch."
+ user << "You close the internal access hatch."
return
- // attack_hand() removes the prox sensor
+ //attack_hand() removes the prox sensor
if(6)
- if(istype(W, /obj/item/stack/sheet/metal))
- var/obj/item/stack/sheet/metal/M = W
- if (M.use(2))
+ if(istype(I, /obj/item/stack/sheet/metal))
+ var/obj/item/stack/sheet/metal/M = I
+ if(M.use(2))
user << "You add some metal armor to the exterior frame."
build_step = 7
else
- user << "You need two sheets of metal to add armor to the frame."
+ user << "You need two sheets of metal to continue construction."
return
- else if(istype(W, /obj/item/weapon/screwdriver))
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1)
+ else if(istype(I, /obj/item/weapon/screwdriver))
+ playsound(loc, 'sound/items/Screwdriver.ogg', 100, 1)
build_step = 5
- user << "You open the internal access hatch."
+ user << "You open the internal access hatch."
return
if(7)
- if(istype(W, /obj/item/weapon/weldingtool))
- var/obj/item/weapon/weldingtool/WT = W
+ if(istype(I, /obj/item/weapon/weldingtool))
+ var/obj/item/weapon/weldingtool/WT = I
if(!WT.isOn()) return
- if (WT.get_fuel() < 5)
- user << "\red You need more fuel to complete this task."
+ if(WT.get_fuel() < 5)
+ user << "You need more fuel to complete this task."
- playsound(src.loc, pick('sound/items/Welder.ogg', 'sound/items/Welder2.ogg'), 50, 1)
+ playsound(loc, pick('sound/items/Welder.ogg', 'sound/items/Welder2.ogg'), 50, 1)
if(do_after(user, 30))
- if(!src || !WT.remove_fuel(5, user)) return
+ if(!src || !WT.remove_fuel(5, user))
+ return
build_step = 8
- user << "\blue You weld the turret's armor down."
+ user << "You weld the turret's armor down."
- // The final step: create a full turret
- var/obj/machinery/porta_turret/Turret = new/obj/machinery/porta_turret(locate(x,y,z))
+ //The final step: create a full turret
+ var/obj/machinery/porta_turret/Turret = new/obj/machinery/porta_turret(loc)
Turret.name = finish_name
- Turret.installation = src.installation
- Turret.gun_charge = src.gun_charge
+ Turret.installation = installation
+ Turret.gun_charge = gun_charge
+ Turret.setup()
-// Turret.cover=new/obj/machinery/porta_turret_cover(src.loc)
+// Turret.cover=new/obj/machinery/porta_turret_cover(loc)
// Turret.cover.Parent_Turret=Turret
// Turret.cover.name = finish_name
- Turret.New()
- del(src)
+ del(src) // qdel
- else if(istype(W, /obj/item/weapon/crowbar))
- playsound(src.loc, 'sound/items/Crowbar.ogg', 75, 1)
- user << "You pry off the turret's exterior armor."
- new /obj/item/stack/sheet/metal( loc, 2)
+ else if(istype(I, /obj/item/weapon/crowbar))
+ playsound(loc, 'sound/items/Crowbar.ogg', 75, 1)
+ user << "You pry off the turret's exterior armor."
+ new /obj/item/stack/sheet/metal(loc, 2)
build_step = 6
return
- if (istype(W, /obj/item/weapon/pen)) // you can rename turrets like bots!
- var/t = input(user, "Enter new turret name", src.name, src.finish_name) as text
+ if(istype(I, /obj/item/weapon/pen)) //you can rename turrets like bots!
+ var/t = input(user, "Enter new turret name", name, finish_name) as text
t = copytext(sanitize(t), 1, MAX_MESSAGE_LEN)
- if (!t)
+ if(!t)
return
- if (!in_range(src, usr) && src.loc != usr)
+ if(!in_range(src, usr) && loc != usr)
return
- src.finish_name = t
+ finish_name = t
return
..()
-
-/obj/machinery/porta_turret_construct/attack_hand(mob/user as mob)
+/obj/machinery/porta_turret_construct/attack_hand(mob/user)
switch(build_step)
if(4)
- if(!installation) return
+ if(!installation)
+ return
build_step = 3
- var/obj/item/weapon/gun/energy/Gun = new installation(src.loc)
- Gun.power_supply.charge=gun_charge
+ var/obj/item/weapon/gun/energy/Gun = new installation(loc)
+ Gun.power_supply.charge = gun_charge
Gun.update_icon()
installation = null
gun_charge = 0
- user << "You remove \the [Gun] from the turret frame."
+ user << "You remove [Gun] from the turret frame."
if(5)
- user << "You remove the prox sensor from the turret frame."
- new/obj/item/device/assembly/prox_sensor(locate(x,y,z))
+ user << "You remove the prox sensor from the turret frame."
+ new /obj/item/device/assembly/prox_sensor(loc)
build_step = 4
+/obj/machinery/porta_turret_construct/attack_ai()
+ return
-
-
-
-
-
-
-
-
+/************************
+* PORTABLE TURRET COVER *
+************************/
/obj/machinery/porta_turret_cover
name = "turret"
@@ -883,116 +816,84 @@ Status: []
"},
var/obj/machinery/porta_turret/Parent_Turret = null
+//The below code is pretty much just recoded from the initial turret object. It's necessary but uncommented because it's exactly the same!
+//>necessary
+//I'm not fixing it because i'm fucking bored of this code already, but someone should just reroute these to the parent turret's procs.
-// 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
- var/dat
- if(!(Parent_Turret.lasercolor))
- dat += text({"
-Automatic Portable Turret Installation
-Status: []
-Behaviour controls are [Parent_Turret.locked ? "locked" : "unlocked"]"},
-
-"[Parent_Turret.on ? "On" : "Off"]" )
-
-
- dat += text({"
-Check for Weapon Authorization: []
-Check Security Records: []
-Neutralize Identified Criminals: []
-Neutralize All Non-Security and Non-Command Personnel: []
-Neutralize All Unidentified Life Signs: []
"},
-
-"[Parent_Turret.auth_weapons ? "Yes" : "No"]",
-"[Parent_Turret.check_records ? "Yes" : "No"]",
-"[Parent_Turret.criminals ? "Yes" : "No"]",
-"[Parent_Turret.stun_all ? "Yes" : "No"]" ,
-"[Parent_Turret.check_anomalies ? "Yes" : "No"]" )
+/obj/machinery/porta_turret_cover/attack_ai(mob/user)
+ if(!Parent_Turret.ailock)
+ return attack_hand(user)
else
- dat += text({"
-Automatic Portable Turret Installation
-Status: []
"},
+ user << "There seems to be a firewall preventing you from accessing this device."
-"[Parent_Turret.on ? "On" : "Off"]" )
-
- user << browse("Automatic Portable Turret Installation[dat]", "window=autosec")
- onclose(user, "autosec")
- return
-
-/obj/machinery/porta_turret_cover/attack_hand(mob/user as mob)
+/obj/machinery/porta_turret_cover/attack_hand(mob/user)
. = ..()
- if (.)
+ if(.)
return
var/dat
- if(!(Parent_Turret.lasercolor))
+ if(!Parent_Turret.lasercolor)
dat += text({"
-Automatic Portable Turret Installation
-Status: []
-Behaviour controls are [Parent_Turret.locked ? "locked" : "unlocked"]"},
+ Automatic Portable Turret Installation
+ Status: []
+ Behaviour controls are [Parent_Turret.locked ? "locked" : "unlocked"]"},
-"[Parent_Turret.on ? "On" : "Off"]" )
+ "[Parent_Turret.on ? "On" : "Off"]" )
- if(!Parent_Turret.locked)
- dat += text({"
-Check for Weapon Authorization: []
-Check Security Records: []
-Neutralize Identified Criminals: []
-Neutralize All Non-Security and Non-Command Personnel: []
-Neutralize All Unidentified Life Signs: []
"},
+ if(!src.Parent_Turret.locked || issilicon(user))
+ dat += text({"
+ Neutralize All Non-Synthetics: []
+ Check for Weapon Authorization: []
+ Check Security Records: []
+ Neutralize All Non-Authorized Personnel: []
+ Neutralize All Unidentified Life Signs: []
"},
-"[Parent_Turret.auth_weapons ? "Yes" : "No"]",
-"[Parent_Turret.check_records ? "Yes" : "No"]",
-"[Parent_Turret.criminals ? "Yes" : "No"]",
-"[Parent_Turret.stun_all ? "Yes" : "No"]" ,
-"[Parent_Turret.check_anomalies ? "Yes" : "No"]" )
+ "[Parent_Turret.ai ? "Yes" : "No"]",
+ "[Parent_Turret.auth_weapons ? "Yes" : "No"]",
+ "[Parent_Turret.check_records ? "Yes" : "No"]",
+ "[Parent_Turret.stun_all ? "Yes" : "No"]" ,
+ "[Parent_Turret.check_anomalies ? "Yes" : "No"]" )
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)))
+ 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)))
+ if(Parent_Turret.lasercolor == "r" && istype(H.wear_suit, /obj/item/clothing/suit/bluetag))
return
dat += text({"
-Automatic Portable Turret Installation
-Status: []
"},
-
-"[Parent_Turret.on ? "On" : "Off"]" )
-
+ Automatic Portable Turret Installation
+ Status: []
"},
+ "[Parent_Turret.on ? "On" : "Off"]" )
user << browse("Automatic Portable Turret Installation[dat]", "window=autosec")
onclose(user, "autosec")
- return
+
/obj/machinery/porta_turret_cover/Topic(href, href_list)
- if (..())
+ if(..())
return
usr.set_machine(src)
Parent_Turret.add_fingerprint(usr)
- src.add_fingerprint(usr)
- if ((href_list["power"]) && (Parent_Turret.allowed(usr)))
+ add_fingerprint(usr)
+ if(href_list["power"] && (!src.Parent_Turret.locked || issilicon(usr)))
if(Parent_Turret.anchored)
- if (Parent_Turret.on)
- Parent_Turret.on=0
+ if(Parent_Turret.on)
+ Parent_Turret.on = 0
else
- Parent_Turret.on=1
+ Parent_Turret.on = 1
else
- usr << "\red It has to be secured first!"
+ usr << "It has to be secured first!"
updateUsrDialog()
return
switch(href_list["operation"])
- if ("authweapon")
+ if("toggleai")
+ Parent_Turret.ai = !Parent_Turret.ai
+ if("authweapon")
Parent_Turret.auth_weapons = !Parent_Turret.auth_weapons
- if ("checkrecords")
+ 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")
@@ -1001,47 +902,44 @@ Status: []
"},
updateUsrDialog()
-
-/obj/machinery/porta_turret_cover/attackby(obj/item/W as obj, mob/user as mob)
-
- if ((istype(W, /obj/item/weapon/card/emag)) && (!Parent_Turret.emagged))
- user << "\red You short out [Parent_Turret]'s threat assessment circuits."
- spawn(0)
- for(var/mob/O in hearers(Parent_Turret, null))
- O.show_message("\red [Parent_Turret] hums oddly...", 1)
+/obj/machinery/porta_turret_cover/attackby(obj/item/I, mob/user)
+ if(istype(I, /obj/item/weapon/card/emag) && !Parent_Turret.emagged)
+ user << "You short out [Parent_Turret]'s threat assessment circuits."
+ visible_message("[Parent_Turret] hums oddly...")
Parent_Turret.emagged = 1
Parent_Turret.on = 0
sleep(40)
Parent_Turret.on = 1
- else if((istype(W, /obj/item/weapon/wrench)) && (!Parent_Turret.on))
+ else if(istype(I, /obj/item/weapon/wrench) && !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"
- user << "You secure the exterior bolts on the turret."
+ user << "You secure the exterior bolts on the turret."
else
Parent_Turret.anchored = 0
- user << "You unsecure the exterior bolts on the turret."
+ user << "You unsecure the exterior bolts on the turret."
Parent_Turret.icon_state = "turretCover"
Parent_Turret.invisibility = 0
- del(src)
+ del(src) // qdel
- else if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
- if (Parent_Turret.allowed(user))
+ else if(istype(I, /obj/item/weapon/card/id)||istype(I, /obj/item/device/pda))
+ if(Parent_Turret.allowed(user))
Parent_Turret.locked = !Parent_Turret.locked
- user << "Controls are now [Parent_Turret.locked ? "locked." : "unlocked."]"
+ user << "Controls are now [Parent_Turret.locked ? "locked" : "unlocked"]."
updateUsrDialog()
else
- user << "\red Access denied."
+ user << "Access denied."
else
- Parent_Turret.health -= W.force * 0.5
- if (Parent_Turret.health <= 0)
+ user.changeNext_move(CLICK_CD_MELEE)
+ Parent_Turret.health -= I.force * 0.5
+ if(Parent_Turret.health <= 0)
Parent_Turret.die()
- if ((W.force * 0.5) > 2)
+ if(I.force * 0.5 > 2)
if(!Parent_Turret.attacked && !Parent_Turret.emagged)
Parent_Turret.attacked = 1
spawn()
@@ -1050,11 +948,9 @@ Status: []
"},
..()
-
-
/obj/machinery/porta_turret/stationary
emagged = 1
New()
- installation = new/obj/item/weapon/gun/energy/laser(src.loc)
+ installation = /obj/item/weapon/gun/energy/laser
..()
diff --git a/code/game/machinery/turret_control.dm b/code/game/machinery/turret_control.dm
new file mode 100644
index 0000000000..6c1b6acd11
--- /dev/null
+++ b/code/game/machinery/turret_control.dm
@@ -0,0 +1,150 @@
+////////////////////////
+//Turret Control Panel//
+////////////////////////
+
+/obj/machinery/turretid
+ name = "turret control panel"
+ desc = "Used to control a room's automated defenses."
+ icon = 'icons/obj/machines/turret_control.dmi'
+ icon_state = "control_standby"
+ anchored = 1
+ density = 0
+ var/enabled = 0
+ var/lethal = 0
+ var/locked = 1
+ var/control_area //can be area name, path or nothing.
+ var/ailock = 0 // AI cannot use this
+ req_access = list(access_ai_upload)
+
+/obj/machinery/turretid/stun
+ enabled = 1
+ icon_state = "control_stun"
+
+/obj/machinery/turretid/lethal
+ enabled = 1
+ lethal = 1
+ icon_state = "control_kill"
+
+/obj/machinery/turretid/initialize()
+ if(!control_area)
+ var/area/CA = get_area(src)
+ if(CA.master && CA.master != CA)
+ control_area = CA.master
+ else
+ control_area = CA
+ else if(istext(control_area))
+ for(var/area/A in world)
+ if(A.name && A.name==control_area)
+ control_area = A
+ break
+ power_change() //Checks power and initial settings
+ //don't have to check if control_area is path, since get_area_all_atoms can take path.
+ return
+
+/obj/machinery/turretid/attackby(obj/item/weapon/W, mob/user)
+ if(stat & BROKEN) return
+ if (istype(user, /mob/living/silicon))
+ return src.attack_hand(user)
+
+ if (istype(W, /obj/item/weapon/card/emag) && !emagged)
+ user << "You short out the turret controls' access analysis module."
+ emagged = 1
+ locked = 0
+ if(user.machine==src)
+ src.attack_hand(user)
+
+ return
+
+ else if( get_dist(src, user) == 0 ) // trying to unlock the interface
+ if (src.allowed(usr))
+ if(emagged)
+ user << "The turret control is unresponsive."
+ return
+
+ locked = !locked
+ user << "You [ locked ? "lock" : "unlock"] the panel."
+ if (locked)
+ if (user.machine==src)
+ user.unset_machine()
+ user << browse(null, "window=turretid")
+ else
+ if (user.machine==src)
+ src.attack_hand(user)
+ else
+ user << "Access denied."
+
+/obj/machinery/turretid/attack_ai(mob/user as mob)
+ if(!ailock)
+ return attack_hand(user)
+ else
+ user << "There seems to be a firewall preventing you from accessing this device."
+
+/obj/machinery/turretid/attack_hand(mob/user as mob)
+ if (get_dist(src, user) > 0 && !issilicon(user))
+ user << "You are too far away."
+ user.unset_machine()
+ user << browse(null, "window=turretid")
+ return
+
+ user.set_machine(src)
+ var/loc = src.loc
+ if (istype(loc, /turf))
+ var/turf/T = loc
+ loc = T.loc
+ if (!istype(loc, /area))
+ return
+ var/area/area = loc
+ var/t = ""
+
+ if(src.locked && (!istype(user, /mob/living/silicon)))
+ t += "Swipe ID card to unlock interface
"
+ else
+ if (!istype(user, /mob/living/silicon))
+ t += "Swipe ID card to lock interface
"
+ t += text("Turrets [] - []?
\n", src.enabled?"activated":"deactivated", src, src.enabled?"Disable":"Enable")
+ t += text("Currently set for [] - Change to []?
\n", src.lethal?"lethal":"stun repeatedly", src, src.lethal?"Stun repeatedly":"Lethal")
+
+ //user << browse(t, "window=turretid")
+ //onclose(user, "turretid")
+ var/datum/browser/popup = new(user, "turretid", "Turret Control Panel ([area.name])")
+ popup.set_content(t)
+ popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
+ popup.open()
+
+/obj/machinery/turretid/Topic(href, href_list)
+ if(..())
+ return
+ if (src.locked)
+ if (!istype(usr, /mob/living/silicon))
+ usr << "Control panel is locked!"
+ return
+ if (href_list["toggleOn"])
+ src.enabled = !src.enabled
+ src.updateTurrets()
+ else if (href_list["toggleLethal"])
+ src.lethal = !src.lethal
+ src.updateTurrets()
+ src.attack_hand(usr)
+
+/obj/machinery/turretid/proc/updateTurrets()
+ if(control_area)
+ for (var/obj/machinery/porta_turret/aTurret in get_area_all_atoms(control_area))
+ aTurret.setState(enabled, lethal)
+ src.update_icon()
+
+/obj/machinery/turretid/power_change()
+ ..()
+ updateTurrets()
+ update_icon()
+
+/obj/machinery/turretid/update_icon()
+ ..()
+ if(stat & NOPOWER)
+ icon_state = "control_off"
+ else if (enabled)
+ if (lethal)
+ icon_state = "control_kill"
+ else
+ icon_state = "control_stun"
+ else
+ icon_state = "control_standby"
diff --git a/code/game/machinery/turrets.dm b/code/game/machinery/turrets.dm
index af5b67c16d..f9e8a94747 100644
--- a/code/game/machinery/turrets.dm
+++ b/code/game/machinery/turrets.dm
@@ -338,101 +338,6 @@
spawn(13)
del(src)
-/obj/machinery/turretid
- name = "Turret deactivation control"
- icon = 'icons/obj/device.dmi'
- icon_state = "motion3"
- anchored = 1
- density = 0
- var/enabled = 1
- var/lethal = 0
- var/locked = 1
- var/control_area //can be area name, path or nothing.
- var/ailock = 0 // AI cannot use this
- req_access = list(access_ai_upload)
-
-/obj/machinery/turretid/New()
- ..()
- if(!control_area)
- var/area/CA = get_area(src)
- if(CA.master && CA.master != CA)
- control_area = CA.master
- else
- control_area = CA
- else if(istext(control_area))
- for(var/area/A in world)
- if(A.name && A.name==control_area)
- control_area = A
- break
- //don't have to check if control_area is path, since get_area_all_atoms can take path.
- return
-
-/obj/machinery/turretid/attackby(obj/item/weapon/W, mob/user)
- if(stat & BROKEN) return
- if (istype(user, /mob/living/silicon))
- return src.attack_hand(user)
-
- if (istype(W, /obj/item/weapon/card/emag) && !emagged)
- user << "\red You short out the turret controls' access analysis module."
- emagged = 1
- locked = 0
- if(user.machine==src)
- src.attack_hand(user)
-
- return
-
- else if( get_dist(src, user) == 0 ) // trying to unlock the interface
- if (src.allowed(usr))
- if(emagged)
- user << "The turret control is unresponsive."
- return
-
- locked = !locked
- user << "You [ locked ? "lock" : "unlock"] the panel."
- if (locked)
- if (user.machine==src)
- user.unset_machine()
- user << browse(null, "window=turretid")
- else
- if (user.machine==src)
- src.attack_hand(user)
- else
- user << "Access denied."
-
-/obj/machinery/turretid/attack_ai(mob/user as mob)
- if(!ailock)
- return attack_hand(user)
- else
- user << "There seems to be a firewall preventing you from accessing this device."
-
-/obj/machinery/turretid/attack_hand(mob/user as mob)
- if ( get_dist(src, user) > 0 )
- if ( !issilicon(user) )
- user << "You are too far away."
- user.unset_machine()
- user << browse(null, "window=turretid")
- return
-
- user.set_machine(src)
- var/loc = src.loc
- if (istype(loc, /turf))
- loc = loc:loc
- if (!istype(loc, /area))
- user << text("Turret badly positioned - loc.loc is [].", loc)
- return
- var/area/area = loc
- var/t = "Turret Control Panel ([area.name])
"
-
- if(src.locked && (!istype(user, /mob/living/silicon)))
- t += "(Swipe ID card to unlock control panel.)
"
- else
- t += text("Turrets [] - []?
\n", src.enabled?"activated":"deactivated", src, src.enabled?"Disable":"Enable")
- t += text("Currently set for [] - Change to []?
\n", src.lethal?"lethal":"stun repeatedly", src, src.lethal?"Stun repeatedly":"Lethal")
-
- user << browse(t, "window=turretid")
- onclose(user, "turretid")
-
-
/obj/machinery/turret/attack_animal(mob/living/M as mob)
if(M.melee_damage_upper == 0) return
if(!(stat & BROKEN))
@@ -446,47 +351,6 @@
M << "\red That object is useless to you."
return
-/obj/machinery/turretid/Topic(href, href_list, var/nowindow = 0)
- if(..(href, href_list))
- return
- if (src.locked)
- if (!istype(usr, /mob/living/silicon))
- usr << "Control panel is locked!"
- return
- if ( get_dist(src, usr) == 0 || issilicon(usr))
- if (href_list["toggleOn"])
- src.enabled = !src.enabled
- src.updateTurrets()
- else if (href_list["toggleLethal"])
- src.lethal = !src.lethal
- src.updateTurrets()
- if(!nowindow)
- src.attack_hand(usr)
-
-/obj/machinery/turretid/proc/updateTurrets()
- if(control_area)
- for (var/obj/machinery/turret/aTurret in get_area_all_atoms(control_area))
- aTurret.setState(enabled, lethal)
- src.update_icons()
-
-/obj/machinery/turretid/proc/update_icons()
- if (src.enabled)
- if (src.lethal)
- icon_state = "motion1"
- else
- icon_state = "motion3"
- else
- icon_state = "motion0"
- //CODE FIXED BUT REMOVED
-// if(control_area) //USE: updates other controls in the area
-// for (var/obj/machinery/turretid/Turret_Control in world) //I'm not sure if this is what it was
-// if( Turret_Control.control_area != src.control_area ) continue //supposed to do. Or whether the person
-// Turret_Control.icon_state = icon_state //who coded it originally was just tired
-// Turret_Control.enabled = enabled //or something. I don't see any situation
-// Turret_Control.lethal = lethal //in which this would be used on the current map.
- //If he wants it back he can uncomment it
-
-
/obj/structure/turret/gun_turret
name = "Gun Turret"
density = 1
diff --git a/code/game/objects/items/weapons/manuals.dm b/code/game/objects/items/weapons/manuals.dm
index b301a77e76..99c4f960b0 100644
--- a/code/game/objects/items/weapons/manuals.dm
+++ b/code/game/objects/items/weapons/manuals.dm
@@ -1060,7 +1060,7 @@
- Or: What the fuck does a "passive gate" do?
+ Or: What the fuck does a "pressure regulator" do?
Alright. It has come to my attention that a variety of people are unsure of what a "pipe" is and what it does.
Apparently, there is an unnatural fear of these arcane devices and their "gases." Spooky, spooky. So,
@@ -1085,6 +1085,9 @@
Manual T-valve: Like a manual valve, but at the center of a manifold instead of a straight pipe.
+ An important note here is that pipes are now done in three distinct lines - general, supply, and scrubber. You can move gases between these with a universal adapter. Use the correct position for the correct location.
+ Connecting scrubbers to a supply position pipe makes you an idiot who gives everyone a difficult job. Insulated and HE pipes don't go through these positions.
+
Bent pipes: Pipes with a 90 degree bend at the half-meter mark. My goodness.
Pipe manifolds: Pipes that are essentially a "T" shape, allowing you to connect three things at one point.
@@ -1103,22 +1106,19 @@
Stop it. It's unbecoming. Most of these are fairly straightforward.
- - Gas pump: Take a wild guess. It moves gas in the direction it's pointing (marked by the red line on one end). It moves it based on pressure, the maximum output being 4500 kPa (kilopascals).
+
- Gas pump: Take a wild guess. It moves gas in the direction it's pointing (marked by the red line on one end). It moves it based on pressure, the maximum output being 15000 kPa (kilopascals).
Ordinary atmospheric pressure, for comparison, is 101.3 kPa, and the minimum pressure of room-temperature pure oxygen needed to not suffocate in a matter of minutes is 16 kPa
- (though 18 kPa is preferred using internals, for various reasons).
- - Volume pump: This pump goes based on volume, instead of pressure, and the possible maximum pressure it can create in the pipe on the receiving end is double the gas pump because of this,
- clocking in at an incredible 9000 kPa. If a pipe with this is destroyed or damaged, and this pressure of gas escapes, it can be incredibly dangerous depending on the size of the pipe filled.
- Don't hook this to the distribution loop, or you will make babies cry and the Chief Engineer brutally beat you.
- - Passive gate: This is essentially a cap on the pressure of gas allowed to flow in a specific direction.
- When turned on, instead of actively pumping gas, it measures the pressure flowing through it, and whatever pressure you set is the maximum: it'll cap after that.
- In addition, it only lets gas flow one way. The direction the gas flows is opposite the red handle on it, which is confusing to people used to the red stripe on pumps pointing the way.
+ (though 18 kPa is preferred when using internals with pure oxygen, for various reasons). A high-powered variant will move gas more quickly at the expense of consuming more power. Do not turn the distribution loop up to 15000 kPa.
+ You will make engiborgs cry and the Chief Engineer will beat you.
+ - Pressure regulator: These replaced the old passive gates. You can choose to regulate pressure by input or output, and regulate flow rate. Regulating by input means that when input pressure is above the limit, gas will flow.
+ Regulating by output means that when pressure is below the limit, gas will flow. Flow rate can be controlled.
- Unary vent: The basic vent used in rooms. It pumps gas into the room, but can't suck it back out. Controlled by the room's air alarm system.
- Scrubber: The other half of room equipment. Filters air, and can suck it in entirely in what's called a "panic siphon." Activating a panic siphon without very good reason will kill someone. Don't do it.
- Meter: A little box with some gauges and numbers. Fasten it to any pipe or manifold and it'll read you the pressure in it. Very useful.
- - Gas mixer: Two sides are input, one side is output. Mixes the gases pumped into it at the ratio defined. The side perpendicular to the other two is "node 2," for reference.
- Can output this gas at pressures from 0-4500 kPa.
+ - Gas mixer: Two sides are input, one side is output. Mixes the gases pumped into it at the ratio defined. The side perpendicular to the other two is "node 2," for reference, on non-mirrored mixers..
+ Output is controlled by flow rate. There is also an "omni" variant that allows you to set input and output sections freely..
- Gas filter: Essentially the opposite of a gas mixer. One side is input. The other two sides are output. One gas type will be filtered into the perpendicular output pipe,
- the rest will continue out the other side. Can also output from 0-4500 kPa.
+ the rest will continue out the other side. Can also output from 0-4500 kPa. The "omni" vairant allows you to set input and output sections freely.
@@ -1130,10 +1130,11 @@
Bent pipe: Take a wild guess.
Junction: The point where you connect your normal pipes to heat exchange pipes. Not necessary for heat exchangers, but necessary for H/E pipes/bent pipes.
Heat exchanger: These funky-looking bits attach to an open pipe end. Put another heat exchanger directly across from it, and you can transfer heat across two pipes without having to have the gases touch.
- This normally shouldn't exchange with the ambient air, despite being totally exposed. Just don't ask questions...
+ This normally shouldn't exchange with the ambient air, despite being totally exposed. Just don't ask questions.
That's about it for pipes. Go forth, armed with this knowledge, and try not to break, burn down, or kill anything. Please.
+