diff --git a/_maps/map_files/tgstation.2.1.3.dmm b/_maps/map_files/tgstation.2.1.3.dmm index 2cd7fe99609..eba522c9592 100644 --- a/_maps/map_files/tgstation.2.1.3.dmm +++ b/_maps/map_files/tgstation.2.1.3.dmm @@ -8921,6 +8921,7 @@ "dpC" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/medical/virology) "dpD" = (/obj/machinery/atmospherics/valve{dir = 4; icon_state = "valve1"; open = 1; openDuringInit = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/medical/virology) "dpE" = (/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/obj/item/weapon/wrench,/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/medical/virology) +"dpF" = (/obj/machinery/bot/secbot/pingsky,/turf/simulated/floor/carpet,/area/turret_protected/aisat_interior) "dpH" = (/turf/simulated/wall,/area/aisat) "dpI" = (/obj/effect/landmark/start{name = "Cyborg"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/aisat_interior) "dpJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/wall/r_wall,/area/aisat) @@ -8999,7 +9000,6 @@ "dre" = (/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/aisat_interior) "drf" = (/turf/simulated/floor/carpet,/area/turret_protected/aisat_interior) "drg" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/bluegrid,/area/assembly/chargebay) -"drh" = (/obj/machinery/bot/secbot/beepsky{auto_patrol = 0; desc = "It's Officer Pingsky! Loyal, vigilent and lonely."; name = "Officer Pingsky"},/turf/simulated/floor/carpet,/area/turret_protected/aisat_interior) "dri" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/aisat_interior) "drj" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/light/small{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/camera{c_tag = "MiniSat Exterior North East"; dir = 4; network = list("MiniSat"); pixel_x = 0; pixel_y = 0},/turf/simulated/floor/plating,/area/aisat) "drk" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/engine/gravity_generator) @@ -9354,7 +9354,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsdcsdcsdcsdcsdcsdcsdcsdcsdcsdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdrEdrGdqpdqpdrFdrAdrzdredredredrDdrCdrBdqedqedrxdrydqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdpYdrRcMfdrQdrcdrpdredredrudredredrodrcdrQdrQdrPdpZdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahlaaGcKWdpYcLyahlaaadrcdrvdrwdrtdpIdrrdrsdrqdrcaaaahldqfdpZdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahlaaGcKWdradpHdpHdpHdrcdrddredrfdrhdrfdredridrcdpHdpHdpHdrjdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahlaaGcKWdradpHdpHdpHdrcdrddredrfdpFdrfdredridrcdpHdpHdpHdrjdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahlaaGcKWdpYcLyahlaaadrcdsYdrmdrfdrfdtqdrmdsZdrcaaaahldqfdpZdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacslcslcslcslcslcslcslcslcslaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdpYdqmahlahldqudqQdqtdqTdqUaXNdqvdqWdquahlahldqfdpZdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacslcslcslcslcslcslcslcslcslaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdcsdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahlahlahlahlahlahlahlahlahlahlahlahldpXdqfdpYdqmahldquaXNdqZdqDdqYbandqXdqDdqVaXNdquahldqfdpZdqmdpXahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacslcslcslcslcslcslcslcslcslaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index ff5bde8bf06..a9ee8f00c16 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -63,6 +63,7 @@ /var/const/access_sec_doors = 63 // Security front doors /var/const/access_mineral_storeroom = 64 /var/const/access_minisat = 65 +/var/const/access_weapons = 66 //Weapon authorization for secbots //BEGIN CENTCOM ACCESS /*Should leave plenty of room if we need to add more access levels. @@ -197,7 +198,7 @@ access_tech_storage, access_chapel_office, access_atmospherics, access_kitchen, access_bar, access_janitor, access_crematorium, access_robotics, access_cargo, access_construction, access_hydroponics, access_library, access_lawyer, access_virology, access_cmo, access_qm, access_surgery, - access_theatre, access_research, access_mining, access_mailsorting, + access_theatre, access_research, access_mining, access_mailsorting, access_weapons, access_heads_vault, access_mining_station, access_xenobiology, access_ce, access_hop, access_hos, access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_mineral_storeroom, access_minisat) @@ -214,7 +215,7 @@ if(1) //station general return list(access_kitchen,access_bar, access_hydroponics, access_janitor, access_chapel_office, access_crematorium, access_library, access_theatre, access_lawyer) if(2) //security - return list(access_sec_doors, access_security, access_brig, access_armory, access_forensics_lockers, access_court, access_hos) + return list(access_sec_doors, access_weapons, access_security, access_brig, access_armory, access_forensics_lockers, access_court, access_hos) if(3) //medbay return list(access_medical, access_genetics, access_morgue, access_chemistry, access_virology, access_surgery, access_cmo) if(4) //research @@ -373,6 +374,8 @@ return "Mineral Storage" if(access_minisat) return "AI Satellite" + if(access_weapons) + return "Weapon Permit" /proc/get_centcom_access_desc(A) switch(A) diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm index 62b93744f17..008fc7d59f6 100644 --- a/code/game/jobs/job/captain.dm +++ b/code/game/jobs/job/captain.dm @@ -68,13 +68,13 @@ Head of Personnel default_pda = /obj/item/device/pda/heads/hop default_headset = /obj/item/device/radio/headset/heads/hop - access = list(access_security, access_sec_doors, access_brig, access_court, access_forensics_lockers, + access = list(access_security, access_sec_doors, access_brig, access_court, access_forensics_lockers, access_weapons, access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads, access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue, access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer, access_theatre, access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station, access_hop, access_RC_announce, access_keycard_auth, access_gateway, access_mineral_storeroom) - minimal_access = list(access_security, access_sec_doors, access_court, + minimal_access = list(access_security, access_sec_doors, access_court, access_weapons, access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads, access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue, access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer, diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm index a22b5635455..7ea6afcadf5 100644 --- a/code/game/jobs/job/civilian.dm +++ b/code/game/jobs/job/civilian.dm @@ -15,7 +15,7 @@ Bartender default_pda = /obj/item/device/pda/bar default_headset = /obj/item/device/radio/headset/headset_srv - access = list(access_hydroponics, access_bar, access_kitchen, access_morgue, access_mineral_storeroom) + access = list(access_hydroponics, access_bar, access_kitchen, access_morgue, access_mineral_storeroom, access_weapons) minimal_access = list(access_bar, access_mineral_storeroom) /datum/job/bartender/equip_backpack(var/mob/living/carbon/human/H) diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index 960908c55f5..b255a90830d 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -5,7 +5,7 @@ return list() /* -Head of Shitcurity +Head of Security */ /datum/job/hos title = "Head of Security" @@ -26,11 +26,11 @@ Head of Shitcurity default_backpack = /obj/item/weapon/storage/backpack/security default_satchel = /obj/item/weapon/storage/backpack/satchel_sec - access = list(access_security, access_sec_doors, access_brig, access_armory, access_court, + access = list(access_security, access_sec_doors, access_brig, access_armory, access_court, access_weapons, access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers, access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting, access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway) - minimal_access = list(access_security, access_sec_doors, access_brig, access_armory, access_court, + minimal_access = list(access_security, access_sec_doors, access_brig, access_armory, access_court, access_weapons, access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers, access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting, access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway) @@ -73,8 +73,8 @@ Warden default_backpack = /obj/item/weapon/storage/backpack/security default_satchel = /obj/item/weapon/storage/backpack/satchel_sec - access = list(access_security, access_sec_doors, access_brig, access_armory, access_court, access_maint_tunnels, access_morgue) - minimal_access = list(access_security, access_sec_doors, access_brig, access_armory, access_court) //See /datum/job/warden/get_access() + access = list(access_security, access_sec_doors, access_brig, access_armory, access_court, access_maint_tunnels, access_morgue, access_weapons) + minimal_access = list(access_security, access_sec_doors, access_brig, access_armory, access_court, access_weapons) //See /datum/job/warden/get_access() /datum/job/warden/equip_items(var/mob/living/carbon/human/H) H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/warden(H), slot_w_uniform) @@ -117,8 +117,8 @@ Detective default_pda = /obj/item/device/pda/detective default_headset = /obj/item/device/radio/headset/headset_sec - access = list(access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court) - minimal_access = list(access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court) + access = list(access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court, access_weapons) + minimal_access = list(access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court, access_weapons) /datum/job/detective/equip_items(var/mob/living/carbon/human/H) H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/det(H), slot_w_uniform) @@ -164,8 +164,8 @@ Security Officer default_backpack = /obj/item/weapon/storage/backpack/security default_satchel = /obj/item/weapon/storage/backpack/satchel_sec - access = list(access_security, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_morgue) - minimal_access = list(access_security, access_sec_doors, access_brig, access_court) //But see /datum/job/warden/get_access() + access = list(access_security, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_morgue, access_weapons) + minimal_access = list(access_security, access_sec_doors, access_brig, access_court, access_weapons) //But see /datum/job/warden/get_access() /datum/job/officer/equip_items(var/mob/living/carbon/human/H) assign_sec_to_department(H) diff --git a/code/game/machinery/bots/ed209bot.dm b/code/game/machinery/bots/ed209bot.dm index 5cb9d67a849..09736957cc2 100644 --- a/code/game/machinery/bots/ed209bot.dm +++ b/code/game/machinery/bots/ed209bot.dm @@ -7,7 +7,7 @@ density = 1 anchored = 0 // weight = 1.0E7 - req_one_access = list(access_security, access_forensics_lockers) + req_access = list(access_security) health = 100 maxhealth = 100 fire_dam_coeff = 0.7 @@ -27,7 +27,9 @@ var/last_found //There's a delay var/frustration = 0 //var/emagged = 0 //Emagged Secbots view everyone as a criminal - var/idcheck = 1 //If false, all station IDs are authorized for weapons. + var/declare_arrests = 1 //When making an arrest, should it notify everyone wearing sechuds? + var/idcheck = 1 //If true, arrest people with no IDs + var/weaponscheck = 1 //If true, arrest people for weapons if they don't have access var/check_records = 1 //Does it check security records? var/arrest_type = 0 //If true, don't handcuff var/projectile = null//Holder for projectile type, to avoid so many else if chains @@ -46,6 +48,11 @@ var/beacon_freq = 1445 // navigation beacon frequency var/control_freq = 1447 // bot control frequency + //List of weapons that secbots will not arrest for + var/safe_weapons = list(\ + /obj/item/weapon/gun/energy/laser/bluetag,\ + /obj/item/weapon/gun/energy/laser/redtag,\ + /obj/item/weapon/gun/energy/laser/practice) var/turf/patrol_target // this is turf to navigate to (location of beacon) var/new_destination // pending new destination (waiting for beacon response) @@ -118,34 +125,33 @@ var/dat dat += hack(user) dat += text({" -Automatic Security Unit v2.5

Status: []
Behaviour controls are [src.locked ? "locked" : "unlocked"]
-Maintenance panel panel is [src.open ? "opened" : "closed"]"}, +Maintenance panel panel is [src.open ? "opened" : "closed"]
"}, "[src.on ? "On" : "Off"]" ) if(!src.locked || issilicon(user)) if(!lasercolor) dat += text({"
-Check for Weapon Authorization: []
-Check Security Records: []
+Arrest for No ID: []
+Arrest for Unauthorized Weapons: []
+Arrest for Warrant: []
+
Operating Mode: []
+Report Arrests[]
Auto Patrol: []"}, "[src.idcheck ? "Yes" : "No"]", +"[src.weaponscheck ? "Yes" : "No"]", "[src.check_records ? "Yes" : "No"]", "[src.arrest_type ? "Detain" : "Arrest"]", -"[auto_patrol ? "On" : "Off"]" ) - else - dat += text({"
-Auto Patrol: []"}, - +"[src.declare_arrests ? "Yes" : "No"]", "[auto_patrol ? "On" : "Off"]" ) - - user << browse("Securitron v2.5 controls[dat]", "window=autosec") - onclose(user, "autosec") + var/datum/browser/popup = new(user, "autosec", "Securitron v2.6 controls") + popup.set_content(dat) + popup.open() return /obj/machinery/bot/ed209/Topic(href, href_list) @@ -170,16 +176,22 @@ Auto Patrol: []"}, if ("idcheck") src.idcheck = !src.idcheck src.updateUsrDialog() - if ("ignorerec") + if("weaponscheck") + src.weaponscheck = !src.weaponscheck + src.updateUsrDialog() + if("ignorerec") src.check_records = !src.check_records src.updateUsrDialog() - if ("switchmode") + if("switchmode") src.arrest_type = !src.arrest_type src.updateUsrDialog() if("patrol") auto_patrol = !auto_patrol mode = SECBOT_IDLE updateUsrDialog() + if("declarearrests") + src.declare_arrests = !src.declare_arrests + src.updateUsrDialog() if("hack") if(!src.emagged) src.emagged = 2 @@ -242,7 +254,7 @@ Auto Patrol: []"}, if ((C.stat) || (C.lying)) continue if (istype(C, /mob/living/carbon/human)) - threatlevel = src.assess_perp(C) + threatlevel = C.assess_threat(src, lasercolor) //src.speak(C.real_name + text(": threat: []", threatlevel)) if (threatlevel < 4 ) continue @@ -297,10 +309,15 @@ Auto Patrol: []"}, M.Weaken(5) M.stuttering = 5 M.Stun(5) + + if(declare_arrests) + declare_arrest() + target.visible_message("[src.target] has been stunned by [src]!",\ + "[src.target] has been stunned by [src]!") + maxstuns-- - if (maxstuns <= 0) + if(maxstuns <= 0) target = null - visible_message("\red [src.target] has been stunned by [src]!") mode = SECBOT_PREP_ARREST src.anchored = 1 @@ -333,7 +350,8 @@ Auto Patrol: []"}, if (!src.target.handcuffed && !src.arrest_type) playsound(src.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -2) mode = SECBOT_ARREST - visible_message("\red [src] is trying to put handcuffs on [src.target]!") + target.visible_message("[src] is trying to put handcuffs on [src.target]!",\ + "[src] is trying to put handcuffs on [src.target]!") spawn(60) if (get_dist(src, src.target) <= 1) @@ -646,8 +664,7 @@ Auto Patrol: []"}, if ((C.name == src.oldtarget_name) && (world.time < src.last_found + 100)) continue - if (istype(C, /mob/living/carbon/human)) - src.threatlevel = src.assess_perp(C) + src.threatlevel = C.assess_threat(src, lasercolor) if (!src.threatlevel) continue @@ -666,73 +683,11 @@ 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/ed209/proc/assess_perp(mob/living/carbon/human/perp as mob) - if(!istype(perp) || emagged == 2) - return 10 - - var/threatcount = 0 - - if((src.idcheck) || (isnull(perp.wear_id)) || (istype(perp.wear_id.GetID(), /obj/item/weapon/card/id/syndicate))) - - 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)) - 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 when normal idchecking is off. - if((perp.wear_id && istype(perp:wear_id.GetID(), /obj/item/weapon/card/id/syndicate)) && src.idcheck) - 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(check_records) //check if they are set to *Arrest* on records - var/perpname = perp.get_face_name(perp.get_id_name()) - var/datum/data/record/R = find_record("name", perpname, data_core.security) - if(R && (R.fields["criminal"] == "*Arrest*")) - threatcount += 4 - - if((src.idcheck) && (src.allowed(perp)) && !(src.lasercolor)) - threatcount = 0//Corrupt cops cannot exist beep boop - - return threatcount +/obj/machinery/bot/ed209/proc/check_for_weapons(var/obj/item/slot_item) + if(istype(slot_item, /obj/item/weapon/gun) || istype(slot_item, /obj/item/weapon/melee)) + if(!(slot_item.type in safe_weapons)) + return 1 + return 0 /obj/machinery/bot/ed209/Bump(M as mob|obj) //Leave no door unopened! if ((istype(M, /obj/machinery/door)) && (!isnull(src.botcard))) @@ -811,7 +766,7 @@ Auto Patrol: []"}, return //if(lastfired && world.time - lastfired < 100) - // playsound(src.loc, 'ed209_shoot.ogg', 50, 0) + var/shoot_sound = 'sound/weapons/laser.ogg' if(!projectile) if(!lasercolor) @@ -819,6 +774,7 @@ Auto Patrol: []"}, projectile = /obj/item/projectile/beam else projectile = /obj/item/projectile/energy/electrode + shoot_sound = 'sound/weapons/Taser.ogg' else if(lasercolor == "b") if (src.emagged == 2) projectile = /obj/item/projectile/lasertag @@ -833,6 +789,7 @@ Auto Patrol: []"}, if (!( istype(U, /turf) )) return var/obj/item/projectile/A = new projectile (loc) + playsound(src.loc, shoot_sound, 50, 1) A.current = U A.yo = U.y - T.y A.xo = U.x - T.x @@ -1052,3 +1009,10 @@ Auto Patrol: []"}, /obj/machinery/bot/ed209/redtag/New() new /obj/machinery/bot/ed209(get_turf(src),null,"r") qdel(src) + + +/obj/machinery/bot/ed209/proc/declare_arrest() + var/area/location = get_area(src) + for(var/mob/living/carbon/human/human in world) + if((human.z == src.z) && istype(human.glasses, /obj/item/clothing/glasses/hud/security) && !human.blinded) + human << "\icon[human.glasses] [src.name] requesting assistance [arrest_type ? "detaining" : "arresting"] scumbag [target] in [location]" \ No newline at end of file diff --git a/code/game/machinery/bots/secbot.dm b/code/game/machinery/bots/secbot.dm index e14f870ce67..8cc2ef72d12 100644 --- a/code/game/machinery/bots/secbot.dm +++ b/code/game/machinery/bots/secbot.dm @@ -11,7 +11,7 @@ fire_dam_coeff = 0.7 brute_dam_coeff = 0.5 // weight = 1.0E7 - req_one_access = list(access_security, access_forensics_lockers) + req_access = list(access_security) var/mob/living/carbon/target var/oldtarget_name var/threatlevel = 0 @@ -19,7 +19,9 @@ var/last_found //There's a delay var/frustration = 0 // var/emagged = 0 //Emagged Secbots view everyone as a criminal - var/idcheck = 0 //If false, all station IDs are authorized for weapons. + var/declare_arrests = 1 //When making an arrest, should it notify everyone wearing sechuds? + var/idcheck = 0 //If true, arrest people with no IDs + var/weaponscheck = 0 //If true, arrest people for weapons if they don't have access var/check_records = 1 //Does it check security records? var/arrest_type = 0 //If true, don't handcuff @@ -60,8 +62,14 @@ name = "Officer Beep O'sky" desc = "It's Officer Beep O'sky! Powered by a potato and a shot of whiskey." idcheck = 0 + weaponscheck = 0 auto_patrol = 1 +/obj/machinery/bot/secbot/pingsky + name = "Officer Pingsky" + desc = "It's Officer Pingsky! Delegated to satellite guard duty for harbouring anti-human sentiment." + declare_arrests = 0 + /obj/item/weapon/secbot_assembly name = "helmet/signaler assembly" desc = "Some sort of bizarre assembly." @@ -112,28 +120,32 @@ var/dat dat += hack(user) dat += text({" -Automatic Security Unit v1.3

Status: []
Behaviour controls are [src.locked ? "locked" : "unlocked"]
-Maintenance panel panel is [src.open ? "opened" : "closed"]"}, +Maintenance panel panel is [src.open ? "opened" : "closed"]
"}, "[src.on ? "On" : "Off"]" ) if(!src.locked || issilicon(user)) dat += text({"
-Check for Weapon Authorization: []
-Check Security Records: []
+Arrest for No ID: []
+Arrest for Unauthorized Weapons: []
+Arrest for Warrant: []
+
Operating Mode: []
+Report Arrests[]
Auto Patrol: []"}, "[src.idcheck ? "Yes" : "No"]", +"[src.weaponscheck ? "Yes" : "No"]", "[src.check_records ? "Yes" : "No"]", "[src.arrest_type ? "Detain" : "Arrest"]", +"[src.declare_arrests ? "Yes" : "No"]", "[auto_patrol ? "On" : "Off"]" ) - - user << browse("Securitron v1.3 controls[dat]", "window=autosec") - onclose(user, "autosec") + var/datum/browser/popup = new(user, "autosec", "Securitron v1.5 controls") + popup.set_content(dat) + popup.open() return /obj/machinery/bot/secbot/Topic(href, href_list) @@ -151,6 +163,9 @@ Auto Patrol: []"}, if("idcheck") src.idcheck = !src.idcheck src.updateUsrDialog() + if("weaponscheck") + src.weaponscheck = !src.weaponscheck + src.updateUsrDialog() if("ignorerec") src.check_records = !src.check_records src.updateUsrDialog() @@ -161,6 +176,9 @@ Auto Patrol: []"}, auto_patrol = !auto_patrol mode = SECBOT_IDLE updateUsrDialog() + if("declarearrests") + src.declare_arrests = !src.declare_arrests + src.updateUsrDialog() if("hack") if(!src.emagged) src.emagged = 2 @@ -252,10 +270,15 @@ Auto Patrol: []"}, M.Weaken(5) M.stuttering = 5 M.Stun(5) + + if(declare_arrests) + declare_arrest() + target.visible_message("[src.target] has been stunned by [src]!",\ + "[src.target] has been stunned by [src]!") + maxstuns-- if(maxstuns <= 0) target = null - visible_message("\red [src.target] has been stunned by [src]!") mode = SECBOT_PREP_ARREST src.anchored = 1 @@ -282,7 +305,8 @@ Auto Patrol: []"}, if(!src.target.handcuffed && !src.arrest_type) playsound(src.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -2) mode = SECBOT_ARREST - visible_message("\red [src] is trying to put handcuffs on [src.target]!") + target.visible_message("[src] is trying to put handcuffs on [src.target]!",\ + "[src] is trying to put handcuffs on [src.target]!") spawn(60) if(get_dist(src, src.target) <= 1) @@ -586,8 +610,7 @@ Auto Patrol: []"}, if((C.name == src.oldtarget_name) && (world.time < src.last_found + 100)) continue - if(istype(C, /mob/living/carbon)) - src.threatlevel = src.assess_perp(C) + src.threatlevel = C.assess_threat(src) if(!src.threatlevel) continue @@ -605,48 +628,6 @@ 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/perp as mob) - var/threatcount = 0 - - if(src.emagged == 2) return 10 //Everyone is a criminal! - - if(src.idcheck && !src.allowed(perp)) - - if(check_for_weapons(perp.l_hand)) - threatcount += 4 - if(check_for_weapons(perp.r_hand)) - threatcount += 4 - - if(istype(perp, /mob/living/carbon/human)) - var/mob/living/carbon/human/humanperp = perp - - if(src.idcheck && !src.allowed(perp)) - if(check_for_weapons(humanperp.belt)) - threatcount += 2 - - if(istype(humanperp.head, /obj/item/clothing/head/wizard) || istype(humanperp.head, /obj/item/clothing/head/helmet/space/rig/wizard)) - threatcount += 2 - - if(humanperp.dna && humanperp.dna.mutantrace && humanperp.dna.mutantrace != "none") - threatcount += 2 - - //Agent cards lower threatlevel. - if(humanperp.wear_id && istype(humanperp.wear_id.GetID(), /obj/item/weapon/card/id/syndicate)) - threatcount -= 2 - - if(check_records) //check if they are set to *Arrest* on records - var/perpname = humanperp.get_face_name(humanperp.get_id_name()) - var/datum/data/record/R = find_record("name", perpname, data_core.security) - if(R && (R.fields["criminal"] == "*Arrest*")) - threatcount += 4 - else - threatcount += 2 - - return threatcount - /obj/machinery/bot/secbot/proc/check_for_weapons(var/obj/item/slot_item) if(istype(slot_item, /obj/item/weapon/gun) || istype(slot_item, /obj/item/weapon/melee)) if(!(slot_item.type in safe_weapons)) @@ -789,4 +770,10 @@ Auto Patrol: []"}, overlays -= "hs_arm" new /obj/item/robot_parts/l_arm(get_turf(src)) user << "You remove the robot arm from [src]." - build_step-- \ No newline at end of file + build_step-- + +/obj/machinery/bot/secbot/proc/declare_arrest() + var/area/location = get_area(src) + for(var/mob/living/carbon/human/human in world) + if((human.z == src.z) && istype(human.glasses, /obj/item/clothing/glasses/hud/security) && !human.blinded) + human << "\icon[human.glasses] [src.name] requesting assistance [arrest_type ? "detaining" : "arresting"] scumbag [target] in [location]" \ No newline at end of file diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 0be71e2376b..b34264724c4 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -937,6 +937,7 @@ var/global/list/g_fancy_list_of_safe_types = null var/obj/item/weapon/card/id/W = new(M) W.icon_state = "centcom" W.access = get_centcom_access("Centcom Official") + W.access += access_weapons W.assignment = "Centcom Official" W.registered_name = M.real_name W.update_label() diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 5745bcea0e5..fb18d49c673 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -483,3 +483,7 @@ var/const/GALOSHES_DONT_HELP = 8 /mob/living/carbon/fall(var/forced) loc.handle_fall(src, forced)//it's loc so it doesn't call the mob's handle_fall which does nothing + + +/mob/living/carbon/proc/assess_threat() + return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 7030742e370..9b09c58af85 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -516,4 +516,72 @@ if(obscured.len > 0) return obscured else - return null + return null + +/mob/living/carbon/human/assess_threat(var/obj/machinery/bot/secbot/judgebot, var/lasercolor) + if(judgebot.emagged == 2) + return 10 //Everyone is a criminal! + + var/threatcount = 0 + + //Lasertag bullshit + if(lasercolor) + if(lasercolor == "b")//Lasertag turrets target the opposing team, how great is that? -Sieve + if(istype(wear_suit, /obj/item/clothing/suit/redtag)) + threatcount += 4 + if((istype(r_hand,/obj/item/weapon/gun/energy/laser/redtag)) || (istype(l_hand,/obj/item/weapon/gun/energy/laser/redtag))) + threatcount += 4 + if(istype(belt, /obj/item/weapon/gun/energy/laser/redtag)) + threatcount += 2 + + if(lasercolor == "r") + if(istype(wear_suit, /obj/item/clothing/suit/bluetag)) + threatcount += 4 + if((istype(r_hand,/obj/item/weapon/gun/energy/laser/bluetag)) || (istype(l_hand,/obj/item/weapon/gun/energy/laser/bluetag))) + threatcount += 4 + if(istype(belt, /obj/item/weapon/gun/energy/laser/bluetag)) + threatcount += 2 + + return threatcount + + //Check for ID + var/obj/item/weapon/card/id/idcard = get_idcard() + if(!idcard) + threatcount += 1 + if(judgebot.idcheck) + threatcount += 3 + + //Loyalty implants imply trustworthyness + if(isloyal(src)) + threatcount -= 1 + + //Agent cards lower threatlevel. + if(istype(idcard, /obj/item/weapon/card/id/syndicate)) + threatcount -= 2 + + //Check for weapons + if(judgebot.weaponscheck) + if(!idcard || !(access_weapons in idcard.access)) + if(judgebot.check_for_weapons(l_hand)) + threatcount += 4 + if(judgebot.check_for_weapons(r_hand)) + threatcount += 4 + if(judgebot.check_for_weapons(belt)) + threatcount += 2 + + //Check for arrest warrant + if(judgebot.check_records) + var/perpname = get_face_name(get_id_name()) + var/datum/data/record/R = find_record("name", perpname, data_core.security) + if(R && (R.fields["criminal"] == "*Arrest*")) + threatcount += 5 + + //Check for dresscode violations + if(istype(head, /obj/item/clothing/head/wizard) || istype(head, /obj/item/clothing/head/helmet/space/rig/wizard)) + threatcount += 2 + + //Check for nonhuman scum + if(dna && dna.mutantrace && dna.mutantrace != "none") + threatcount += 2 + + return threatcount \ No newline at end of file diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index d1f94f76d29..7c3e37ac686 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -360,4 +360,35 @@ return 0 /mob/living/carbon/monkey/canBeHandcuffed() - return 1 + return 1 + + +/mob/living/carbon/monkey/assess_threat(var/obj/machinery/bot/secbot/judgebot, var/lasercolor) + if(judgebot.emagged == 2) + return 10 //Everyone is a criminal! + var/threatcount = 0 + + //Lasertag bullshit + if(lasercolor) + if(lasercolor == "b")//Lasertag turrets target the opposing team, how great is that? -Sieve + if((istype(r_hand,/obj/item/weapon/gun/energy/laser/redtag)) || (istype(l_hand,/obj/item/weapon/gun/energy/laser/redtag))) + threatcount += 4 + + if(lasercolor == "r") + if((istype(r_hand,/obj/item/weapon/gun/energy/laser/bluetag)) || (istype(l_hand,/obj/item/weapon/gun/energy/laser/bluetag))) + threatcount += 4 + + return threatcount + + //Check for weapons + if(judgebot.weaponscheck) + if(judgebot.check_for_weapons(l_hand)) + threatcount += 4 + if(judgebot.check_for_weapons(r_hand)) + threatcount += 4 + + //Loyalty implants imply trustworthyness + if(isloyal(src)) + threatcount -= 1 + + return threatcount \ No newline at end of file