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 @@

HOW TO NOT SUCK QUITE SO HARD AT ATMOSPHERICS


- 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. +

    Insulated Pipes

  • 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.

    Heat Exchange Systems

    @@ -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. + "} @@ -1164,6 +1165,7 @@
  • A foreword on using EVA gear
  • Donning a Civilian Suit
  • Putting on a Hardsuit
  • +
  • Cyclers and Other Modification Equipment
  • Final Checks

  • @@ -1185,6 +1187,8 @@ There is a small slot on the side of the suit where an emergency oxygen tank or extended emergency oxygen tank will fit, but it is recommended to have a full-sized tank on your back for EVA.

    + These suits tend to be wearable by most species. They're large and flexible. They might be pretty uncomfortable for some, though, so keep that in mind.

    +

    Hardsuits

    Heavy, uncomfortable, still the best option.
    These suits come in Engineering, Mining, and the Armory. There's also a couple Medical Hardsuits in EVA. These provide a lot more protection than the standard suits.

    @@ -1194,9 +1198,22 @@ and then is screwed in for one and a quarter full rotations clockwise, leaving the faceplate directly in front of you. There is a small button on the right side of the helmet that activates the helmet light. The tanks that fasten onto the side slot are emergency tanks, as well as full-sized oxygen tanks, leaving your back free for a backpack or satchel.

    + These suits generally only fit one species. Nanotrasen's are usually human-fitting by default, but there's equipment that can make modifications to the hardsuits to fit them to other species.

    + +

    Modification Equipment

    + How to actually make hardsuits fit you.
    + There's a variety of equipment that can modify hardsuits to fit species that can't fit into them, making life quite a bit easier.

    + + The first piece of equipment is a suit cycler. This is a large machine resembling the storage pods that are in place in some places. These are machines that will automatically tailor a suit to certain specifications. + The largest uses of them are for their cleaning functions and their ability to tailor suits for a species. Do not enter them physically. You will die from any of the functions being activated, and it will be painful. + These machines can both tailor a suit between species, and between types. This means you can convert engineering hardsuits to atmospherics, or the other way. This is useful. Use it if you can.

    + + There's also modification kits that let you modify suits yourself. These are extremely difficult to use unless you understand the actual construction of the suit. I do not reccomend using them unless no other option is available. +

    Final Checks