Tasty tasty bot features

This commit is contained in:
Chris
2014-09-07 10:42:20 -05:00
parent af30f426e3
commit 10dbc4b918
23 changed files with 312 additions and 190 deletions

View File

@@ -206,6 +206,7 @@
#include "code\game\atoms_movable.dm" #include "code\game\atoms_movable.dm"
#include "code\game\centcomm_orders.dm" #include "code\game\centcomm_orders.dm"
#include "code\game\communications.dm" #include "code\game\communications.dm"
#include "code\game\data_huds.dm"
#include "code\game\response_team.dm" #include "code\game\response_team.dm"
#include "code\game\shuttle_engines.dm" #include "code\game\shuttle_engines.dm"
#include "code\game\skincmd.dm" #include "code\game\skincmd.dm"

View File

@@ -43,6 +43,11 @@ var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Al
// This is stupid as fuck. // This is stupid as fuck.
var/list/hit_appends = list("-OOF", "-ACK", "-UGH", "-HRNK", "-HURGH", "-GLORF") var/list/hit_appends = list("-OOF", "-ACK", "-UGH", "-HRNK", "-HURGH", "-GLORF")
//*-hud user lists
var/global/list/table_recipes = list() //list of all table craft recipes
var/global/list/med_hud_users = list() //list of all entities using a medical HUD.
var/global/list/sec_hud_users = list() //list of all entities using a security HUD.
////////////////////////// //////////////////////////
/////Initial Building///// /////Initial Building/////
////////////////////////// //////////////////////////

View File

@@ -396,3 +396,8 @@ proc/listclearnulls(list/list)
L.Swap(start++,end--) L.Swap(start++,end--)
return L return L
/proc/find_record(field, value, list/L)
for(var/datum/data/record/R in L)
if(R.fields[field] == value)
return R

View File

@@ -65,7 +65,7 @@
/var/const/access_sec_doors = 63 // Security front doors /var/const/access_sec_doors = 63 // Security front doors
/var/const/access_psychiatrist = 64 // Psychiatrist's office /var/const/access_psychiatrist = 64 // Psychiatrist's office
/var/const/access_salvage_captain = 65 // Salvage ship captain's quarters /var/const/access_salvage_captain = 65 // Salvage ship captain's quarters
/var/const/access_weapons = 66 //Weapon authorization for secbots
//BEGIN CENTCOM ACCESS //BEGIN CENTCOM ACCESS
/*Should leave plenty of room if we need to add more access levels. /*Should leave plenty of room if we need to add more access levels.
/var/const/Mostly for admin fun times.*/ /var/const/Mostly for admin fun times.*/
@@ -214,7 +214,7 @@
access_tech_storage, access_chapel_office, access_atmospherics, access_kitchen, access_tech_storage, access_chapel_office, access_atmospherics, access_kitchen,
access_bar, access_janitor, access_crematorium, access_robotics, access_cargo, access_construction, access_bar, access_janitor, access_crematorium, access_robotics, access_cargo, access_construction,
access_hydroponics, access_library, access_lawyer, access_virology, access_psychiatrist, access_cmo, access_qm, access_clown, access_mime, access_surgery, access_hydroponics, access_library, access_lawyer, access_virology, access_psychiatrist, access_cmo, access_qm, access_clown, access_mime, 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_heads_vault, access_mining_station, access_xenobiology, access_ce, access_hop, access_hos, access_RC_announce,
access_keycard_auth, access_tcomsat, access_gateway, /*vg paramedic*/, access_paramedic) access_keycard_auth, access_tcomsat, access_gateway, /*vg paramedic*/, access_paramedic)
@@ -229,7 +229,7 @@
if(0) if(0)
return get_all_accesses() return get_all_accesses()
if(1) //security if(1) //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(2) //medbay if(2) //medbay
return list(access_medical, access_genetics, access_morgue, access_chemistry, access_paramedic, access_virology, access_surgery, access_cmo) return list(access_medical, access_genetics, access_morgue, access_chemistry, access_paramedic, access_virology, access_surgery, access_cmo)
if(3) //research if(3) //research
@@ -396,6 +396,8 @@
// /vg/ shit // /vg/ shit
if(access_paramedic) if(access_paramedic)
return "Paramedic Station" return "Paramedic Station"
if(access_weapons)
return "Weapon Permit"
/proc/get_centcom_access_desc(A) /proc/get_centcom_access_desc(A)
switch(A) switch(A)

View File

@@ -61,13 +61,13 @@
idtype = /obj/item/weapon/card/id/silver idtype = /obj/item/weapon/card/id/silver
req_admin_notify = 1 req_admin_notify = 1
minimal_player_age = 10 minimal_player_age = 10
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_weapons, access_forensics_lockers,
access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads, 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_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_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_theatre, access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station,
access_clown, access_mime, access_hop, access_RC_announce, access_keycard_auth, access_gateway) access_clown, access_mime, access_hop, access_RC_announce, access_keycard_auth, access_gateway)
minimal_access = list(access_security, access_sec_doors, access_brig, access_court, access_forensics_lockers, minimal_access = list(access_security, access_sec_doors, access_brig, access_court, access_weapons, access_forensics_lockers,
access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads, 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_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_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer,

View File

@@ -8,8 +8,8 @@
spawn_positions = 1 spawn_positions = 1
supervisors = "the head of personnel" supervisors = "the head of personnel"
selection_color = "#dddddd" selection_color = "#dddddd"
access = list(access_hydroponics, access_bar, access_kitchen, access_morgue) access = list(access_hydroponics, access_bar, access_kitchen, access_morgue, access_weapons)
minimal_access = list(access_bar) minimal_access = list(access_bar,access_weapons)
pdaslot=slot_belt pdaslot=slot_belt
pdatype=/obj/item/device/pda/bar pdatype=/obj/item/device/pda/bar

View File

@@ -9,11 +9,11 @@
selection_color = "#ffdddd" selection_color = "#ffdddd"
idtype = /obj/item/weapon/card/id/hos idtype = /obj/item/weapon/card/id/hos
req_admin_notify = 1 req_admin_notify = 1
access = list(access_security, access_sec_doors, access_brig, access_armory, access_court, access = list(access_weapons, access_security, access_sec_doors, access_brig, access_armory, access_court,
access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers, 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_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting,
access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway) 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_weapons, access_security, access_sec_doors, access_brig, access_armory, access_court,
access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers, 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_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting,
access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway) access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway)
@@ -62,8 +62,8 @@
supervisors = "the head of security" supervisors = "the head of security"
selection_color = "#ffeeee" selection_color = "#ffeeee"
idtype = /obj/item/weapon/card/id/security idtype = /obj/item/weapon/card/id/security
access = list(access_security, access_sec_doors, access_brig, access_armory, access_court, access_maint_tunnels, access_morgue) access = list(access_weapons, 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, access_maint_tunnels) minimal_access = list(access_weapons, access_security, access_sec_doors, access_brig, access_armory, access_court, access_maint_tunnels)
minimal_player_age = 7 minimal_player_age = 7
pdaslot=slot_belt pdaslot=slot_belt
@@ -110,8 +110,8 @@
selection_color = "#ffeeee" selection_color = "#ffeeee"
idtype = /obj/item/weapon/card/id/security idtype = /obj/item/weapon/card/id/security
access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court) access = list(access_weapons, access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court)
minimal_access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court) minimal_access = list(access_weapons, access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court)
alt_titles = list("Forensic Technician") alt_titles = list("Forensic Technician")
minimal_player_age = 7 minimal_player_age = 7
@@ -172,8 +172,8 @@
supervisors = "the head of security" supervisors = "the head of security"
selection_color = "#ffeeee" selection_color = "#ffeeee"
idtype = /obj/item/weapon/card/id/security idtype = /obj/item/weapon/card/id/security
access = list(access_security, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_morgue) access = list(access_weapons, 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, access_maint_tunnels) minimal_access = list(access_weapons, access_security, access_sec_doors, access_brig, access_court, access_maint_tunnels)
minimal_player_age = 7 minimal_player_age = 7
pdaslot=slot_belt pdaslot=slot_belt

View File

@@ -13,6 +13,13 @@
var/brute_dam_coeff = 1.0 var/brute_dam_coeff = 1.0
var/open = 0//Maint panel var/open = 0//Maint panel
var/locked = 1 var/locked = 1
var/bot_type
var/declare_message = "" //What the bot will display to the HUD user.
#define SEC_BOT 1 // Secutritrons (Beepsky) and ED-209s
#define MULE_BOT 2 // MULEbots
#define FLOOR_BOT 3 // Floorbots
#define CLEAN_BOT 4 // Cleanbots
#define MED_BOT 5 // Medibots
//var/emagged = 0 //Urist: Moving that var to the general /bot tree as it's used by most bots //var/emagged = 0 //Urist: Moving that var to the general /bot tree as it's used by most bots
@@ -69,7 +76,18 @@
new /obj/effect/decal/cleanable/blood/oil(src.loc) new /obj/effect/decal/cleanable/blood/oil(src.loc)
healthcheck() healthcheck()
/obj/machinery/bot/proc/declare() //Signals a medical or security HUD user to a relevant bot's activity.
var/hud_user_list = list() //Determines which userlist to use.
switch(bot_type) //Made into a switch so more HUDs can be added easily.
if(SEC_BOT) //Securitrons and ED-209
hud_user_list = sec_hud_users
if(MED_BOT) //Medibots
hud_user_list = med_hud_users
var/area/myturf = get_turf(src)
for(var/mob/huduser in hud_user_list)
var/turf/mobturf = get_turf(huduser)
if(mobturf.z == myturf.z)
huduser.show_message(declare_message,1)
/obj/machinery/bot/attackby(obj/item/weapon/W as obj, mob/user as mob) /obj/machinery/bot/attackby(obj/item/weapon/W as obj, mob/user as mob)

View File

@@ -27,13 +27,13 @@
var/last_found //There's a delay var/last_found //There's a delay
var/frustration = 0 var/frustration = 0
//var/emagged = 0 //Emagged Secbots view everyone as a criminal //var/emagged = 0 //Emagged Secbots view everyone as a criminal
var/idcheck = 1 //If false, all station IDs are authorized for weapons.
var/check_records = 1 //Does it check security records? var/check_records = 1 //Does it check security records?
var/arrest_type = 0 //If true, don't handcuff var/arrest_type = 0 //If true, don't handcuff
var/declare_arrests = 0 //When making an arrest, should it notify everyone wearing sechuds?
var/projectile = null//Holder for projectile type, to avoid so many else if chains var/projectile = null//Holder for projectile type, to avoid so many else if chains
var/mode = 0 var/mode = 0
bot_type = SEC_BOT
#define SECBOT_IDLE 0 // idle #define SECBOT_IDLE 0 // idle
#define SECBOT_HUNT 1 // found target, hunting #define SECBOT_HUNT 1 // found target, hunting
#define SECBOT_PREP_ARREST 2 // at target, preparing to arrest #define SECBOT_PREP_ARREST 2 // at target, preparing to arrest
@@ -59,6 +59,14 @@
var/nearest_beacon // the nearest beacon's tag var/nearest_beacon // the nearest beacon's tag
var/turf/nearest_beacon_loc // the nearest beacon's location var/turf/nearest_beacon_loc // the nearest beacon's location
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
//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)
/obj/item/weapon/ed209_assembly /obj/item/weapon/ed209_assembly
@@ -129,13 +137,16 @@ Maintenance panel panel is [src.open ? "opened" : "closed"]"},
if(!src.locked || issilicon(user)) if(!src.locked || issilicon(user))
if(!lasercolor) if(!lasercolor)
dat += text({"<BR> dat += text({"<BR>
Check for Weapon Authorization: []<BR> Arrest for No ID: [] <BR>
Check Security Records: []<BR> Arrest for Unauthorized Weapons: [] <BR>
Arrest for Warrant: [] <BR>
<BR>
Operating Mode: []<BR> Operating Mode: []<BR>
Report Arrests: []<BR> Report Arrests: []<BR>
Auto Patrol: []"}, Auto Patrol: []"},
"<A href='?src=\ref[src];operation=idcheck'>[src.idcheck ? "Yes" : "No"]</A>", "<A href='?src=\ref[src];operation=idcheck'>[src.idcheck ? "Yes" : "No"]</A>",
"<A href='?src=\ref[src];operation=weaponscheck'>[weaponscheck ? "Yes" : "No"]</A>",
"<A href='?src=\ref[src];operation=ignorerec'>[src.check_records ? "Yes" : "No"]</A>", "<A href='?src=\ref[src];operation=ignorerec'>[src.check_records ? "Yes" : "No"]</A>",
"<A href='?src=\ref[src];operation=switchmode'>[src.arrest_type ? "Detain" : "Arrest"]</A>", "<A href='?src=\ref[src];operation=switchmode'>[src.arrest_type ? "Detain" : "Arrest"]</A>",
"<A href='?src=\ref[src];operation=declarearrests'>[src.declare_arrests ? "Yes" : "No"]</A>", "<A href='?src=\ref[src];operation=declarearrests'>[src.declare_arrests ? "Yes" : "No"]</A>",
@@ -173,6 +184,9 @@ Auto Patrol: []"},
if ("idcheck") if ("idcheck")
src.idcheck = !src.idcheck src.idcheck = !src.idcheck
src.updateUsrDialog() src.updateUsrDialog()
if("weaponscheck")
weaponscheck = !weaponscheck
updateUsrDialog()
if ("ignorerec") if ("ignorerec")
src.check_records = !src.check_records src.check_records = !src.check_records
src.updateUsrDialog() src.updateUsrDialog()
@@ -203,6 +217,9 @@ Auto Patrol: []"},
..() ..()
if (!istype(W, /obj/item/weapon/screwdriver) && (!src.target)) if (!istype(W, /obj/item/weapon/screwdriver) && (!src.target))
if(hasvar(W,"force") && W.force)//If force is defined and non-zero if(hasvar(W,"force") && W.force)//If force is defined and non-zero
threatlevel = user.assess_threat(src)
threatlevel +=6
if(threatlevel > 0)
src.target = user src.target = user
if(lasercolor)//To make up for the fact that lasertag bots don't hunt if(lasercolor)//To make up for the fact that lasertag bots don't hunt
src.shootAt(user) src.shootAt(user)
@@ -224,6 +241,7 @@ Auto Patrol: []"},
src.icon_state = "[lasercolor]ed209[src.on]" src.icon_state = "[lasercolor]ed209[src.on]"
src.projectile = null src.projectile = null
mode = SECBOT_IDLE mode = SECBOT_IDLE
declare_arrests = 0
/obj/machinery/bot/ed209/process() /obj/machinery/bot/ed209/process()
//set background = 1 //set background = 1
@@ -236,7 +254,7 @@ Auto Patrol: []"},
if ((C.stat) || (C.lying)) if ((C.stat) || (C.lying))
continue continue
if (istype(C, /mob/living/carbon/human)) if (istype(C, /mob/living/carbon/human))
threatlevel = src.assess_perp(C) threatlevel = C.assess_threat(src,lasercolor)
else if ((istype(C, /mob/living/carbon/monkey)) && (C.client) && (ticker.mode.name == "monkey")) else if ((istype(C, /mob/living/carbon/monkey)) && (C.client) && (ticker.mode.name == "monkey"))
threatlevel = 4 threatlevel = 4
//src.speak(C.real_name + text(": threat: []", threatlevel)) //src.speak(C.real_name + text(": threat: []", threatlevel))
@@ -1056,3 +1074,14 @@ Auto Patrol: []"},
/obj/machinery/bot/ed209/redtag/New() /obj/machinery/bot/ed209/redtag/New()
new /obj/machinery/bot/ed209(get_turf(src),null,"r") new /obj/machinery/bot/ed209(get_turf(src),null,"r")
del(src) del(src)
/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/declare()
var/area/location = get_area(src)
declare_message = "<span class='info'>\icon[src] [name] is [arrest_type ? "detaining" : "arresting"] level [threatlevel] scumbag <b>[target]</b> in <b>[location]</b></span>"
..()

View File

@@ -38,6 +38,9 @@
var/treatment_virus = "spaceacillin" var/treatment_virus = "spaceacillin"
var/declare_treatment = 0 //When attempting to treat a patient, should it notify everyone wearing medhuds? var/declare_treatment = 0 //When attempting to treat a patient, should it notify everyone wearing medhuds?
var/shut_up = 0 //self explanatory :) var/shut_up = 0 //self explanatory :)
var/declare_crit = 1 //If active, the bot will transmit a critical patient alert to MedHUD users.
var/declare_cooldown = 0 //Prevents spam of critical patient alerts.
bot_type = MED_BOT
/obj/machinery/bot/medbot/mysterious /obj/machinery/bot/medbot/mysterious
name = "Mysterious Medibot" name = "Mysterious Medibot"
@@ -68,7 +71,6 @@
/obj/machinery/bot/medbot/New() /obj/machinery/bot/medbot/New()
..() ..()
src.icon_state = "medibot[src.on]" src.icon_state = "medibot[src.on]"
spawn(4) spawn(4)
if(src.skin) if(src.skin)
src.overlays += image('icons/obj/aibots.dmi', "medskin_[src.skin]") src.overlays += image('icons/obj/aibots.dmi', "medskin_[src.skin]")
@@ -135,6 +137,8 @@
dat += "The speaker switch is [src.shut_up ? "off" : "on"]. <a href='?src=\ref[src];togglevoice=[1]'>Toggle</a><br>" dat += "The speaker switch is [src.shut_up ? "off" : "on"]. <a href='?src=\ref[src];togglevoice=[1]'>Toggle</a><br>"
dat += "Critical Patient Alerts: <a href='?src=\ref[src];critalerts=1'>[declare_crit ? "Yes" : "No"]</a><br>"
user << browse("<HEAD><TITLE>Medibot v1.0 controls</TITLE></HEAD>[dat]", "window=automed") user << browse("<HEAD><TITLE>Medibot v1.0 controls</TITLE></HEAD>[dat]", "window=automed")
onclose(user, "automed") onclose(user, "automed")
return return
@@ -182,6 +186,9 @@
else if ((href_list["declaretreatment"]) && (!src.locked || issilicon(usr))) else if ((href_list["declaretreatment"]) && (!src.locked || issilicon(usr)))
src.declare_treatment = !src.declare_treatment src.declare_treatment = !src.declare_treatment
else if ((href_list["critalerts"]) && (!locked || issilicon(usr)))
declare_crit = !declare_crit
src.updateUsrDialog() src.updateUsrDialog()
return return
@@ -222,6 +229,7 @@
/obj/machinery/bot/medbot/Emag(mob/user as mob) /obj/machinery/bot/medbot/Emag(mob/user as mob)
..() ..()
if(open && !locked) if(open && !locked)
declare_crit = 0
if(user) user << "<span class='warning'>You short out [src]'s reagent synthesis circuits.</span>" if(user) user << "<span class='warning'>You short out [src]'s reagent synthesis circuits.</span>"
spawn(0) spawn(0)
for(var/mob/O in hearers(src, null)) for(var/mob/O in hearers(src, null))
@@ -341,6 +349,9 @@
if(src.emagged == 2) //Everyone needs our medicine. (Our medicine is toxins) if(src.emagged == 2) //Everyone needs our medicine. (Our medicine is toxins)
return 1 return 1
if(declare_crit && C.health <= 0) //Critical condition! Call for help!
declare()
//If they're injured, we're using a beaker, and don't have one of our WONDERCHEMS. //If they're injured, we're using a beaker, and don't have one of our WONDERCHEMS.
if((src.reagent_glass) && (src.use_beaker) && ((C.getBruteLoss() >= heal_threshold) || (C.getToxLoss() >= heal_threshold) || (C.getToxLoss() >= heal_threshold) || (C.getOxyLoss() >= (heal_threshold + 15)))) if((src.reagent_glass) && (src.use_beaker) && ((C.getBruteLoss() >= heal_threshold) || (C.getToxLoss() >= heal_threshold) || (C.getToxLoss() >= heal_threshold) || (C.getOxyLoss() >= (heal_threshold + 15))))
for(var/datum/reagent/R in src.reagent_glass.reagents.reagent_list) for(var/datum/reagent/R in src.reagent_glass.reagents.reagent_list)
@@ -599,3 +610,13 @@
user.drop_from_inventory(src) user.drop_from_inventory(src)
del(src) del(src)
/obj/machinery/bot/medbot/declare()
if(declare_cooldown)
return
var/area/location = get_area(src)
declare_message = "<span class='info'>\icon[src] Medical emergency! A patient is in critical condition at [location]!</span>"
..()
declare_cooldown = 1
spawn(100) //Ten seconds
declare_cooldown = 0

View File

@@ -18,9 +18,11 @@
var/target_lastloc //Loc of target when arrested. var/target_lastloc //Loc of target when arrested.
var/last_found //There's a delay var/last_found //There's a delay
var/frustration = 0 var/frustration = 0
var/check_records = 1
// var/emagged = 0 //Emagged Secbots view everyone as a criminal // var/emagged = 0 //Emagged Secbots view everyone as a criminal
var/idcheck = 0 //If false, all station IDs are authorized for weapons.
var/check_records = 1 //Does it check security records? var/idcheck = 0 //If true, arrest people with no IDs
var/weaponscheck = 0 //If true, arrest people for weapons if they lack access var/check_records = 1 //Does it check security records?
var/arrest_type = 0 //If true, don't handcuff var/arrest_type = 0 //If true, don't handcuff
var/declare_arrests = 0 //When making an arrest, should it notify everyone wearing sechuds? var/declare_arrests = 0 //When making an arrest, should it notify everyone wearing sechuds?
var/next_harm_time = 0 var/next_harm_time = 0
@@ -51,7 +53,11 @@
var/nearest_beacon // the nearest beacon's tag var/nearest_beacon // the nearest beacon's tag
var/turf/nearest_beacon_loc // the nearest beacon's location var/turf/nearest_beacon_loc // the nearest beacon's location
var/weapons_check = 0
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)
l_color = "#B40000" l_color = "#B40000"
power_change() power_change()
..() ..()
@@ -66,6 +72,7 @@
desc = "It's Officer Beep O'sky! Powered by a potato and a shot of whiskey." desc = "It's Officer Beep O'sky! Powered by a potato and a shot of whiskey."
idcheck = 0 idcheck = 0
auto_patrol = 1 auto_patrol = 1
weapons_check = 0
/obj/item/weapon/secbot_assembly /obj/item/weapon/secbot_assembly
name = "helmet/signaler assembly" name = "helmet/signaler assembly"
@@ -124,13 +131,16 @@ Maintenance panel panel is [src.open ? "opened" : "closed"]"},
if(!src.locked || issilicon(user)) if(!src.locked || issilicon(user))
dat += text({"<BR> dat += text({"<BR>
Check for Weapon Authorization: []<BR> Arrest for No ID: [] <BR>
Check Security Records: []<BR> Arrest for Unauthorized Weapons: []<BR>
Arrest for Warrant: []<BR>
<BR>
Operating Mode: []<BR> Operating Mode: []<BR>
Report Arrests: []<BR> Report Arrests: []<BR>
Auto Patrol: []"}, Auto Patrol: []"},
"<A href='?src=\ref[src];operation=idcheck'>[src.idcheck ? "Yes" : "No"]</A>", "<A href='?src=\ref[src];operation=idcheck'>[src.idcheck ? "Yes" : "No"]</A>",
"<A href='?src=\ref[src];operation=weaponscheck'>[weaponscheck ? "Yes" : "No"]</A>",
"<A href='?src=\ref[src];operation=ignorerec'>[src.check_records ? "Yes" : "No"]</A>", "<A href='?src=\ref[src];operation=ignorerec'>[src.check_records ? "Yes" : "No"]</A>",
"<A href='?src=\ref[src];operation=switchmode'>[src.arrest_type ? "Detain" : "Arrest"]</A>", "<A href='?src=\ref[src];operation=switchmode'>[src.arrest_type ? "Detain" : "Arrest"]</A>",
"<A href='?src=\ref[src];operation=declarearrests'>[src.declare_arrests ? "Yes" : "No"]</A>", "<A href='?src=\ref[src];operation=declarearrests'>[src.declare_arrests ? "Yes" : "No"]</A>",
@@ -155,6 +165,9 @@ Auto Patrol: []"},
if("idcheck") if("idcheck")
src.idcheck = !src.idcheck src.idcheck = !src.idcheck
src.updateUsrDialog() src.updateUsrDialog()
if("weaponscheck")
weaponscheck = !weaponscheck
updateUsrDialog()
if("ignorerec") if("ignorerec")
src.check_records = !src.check_records src.check_records = !src.check_records
src.updateUsrDialog() src.updateUsrDialog()
@@ -183,9 +196,14 @@ Auto Patrol: []"},
user << "\red Access denied." user << "\red Access denied."
else else
..() ..()
if(!istype(W, /obj/item/weapon/screwdriver) && (W.force) && (!src.target)) if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != "harm") // Any intent but harm will heal, so we shouldn't get angry.
src.target = user return
src.mode = SECBOT_HUNT if(!istype(W, /obj/item/weapon/screwdriver) && (W.force) && (!target) ) // Added check for welding tool to fix #2432. Welding tool behavior is handled in superclass.
threatlevel = user.assess_threat(src)
threatlevel += 6
if(threatlevel > 0)
target = user
mode = SECBOT_HUNT
/obj/machinery/bot/secbot/Emag(mob/user as mob) /obj/machinery/bot/secbot/Emag(mob/user as mob)
..() ..()
@@ -250,6 +268,10 @@ Auto Patrol: []"},
M.Weaken(10) M.Weaken(10)
M.stuttering = 10 M.stuttering = 10
M.Stun(10) M.Stun(10)
if(declare_arrests)
declare()
target.visible_message("<span class='danger'>[target] has been stunned by [src]!</span>",\
"<span class='userdanger'>[target] has been stunned by [src]!</span>")
maxstuns-- maxstuns--
if(maxstuns <= 0) if(maxstuns <= 0)
target = null target = null
@@ -257,7 +279,7 @@ Auto Patrol: []"},
if(declare_arrests) if(declare_arrests)
var/area/location = get_area(src) var/area/location = get_area(src)
broadcast_security_hud_message("[src.name] is [arrest_type ? "detaining" : "arresting"] level [threatlevel] suspect <b>[target]</b> in <b>[location]</b>", src) broadcast_security_hud_message("[src.name] is [arrest_type ? "detaining" : "arresting"] level [threatlevel] suspect <b>[target]</b> in <b>[location]</b>", src)
visible_message("\red <B>[src.target] has been stunned by [src]!</B>") //visible_message("\red <B>[src.target] has been stunned by [src]!</B>")
mode = SECBOT_PREP_ARREST mode = SECBOT_PREP_ARREST
src.anchored = 1 src.anchored = 1
@@ -823,3 +845,14 @@ Auto Patrol: []"},
if(!in_range(src, usr) && src.loc != usr) if(!in_range(src, usr) && src.loc != usr)
return return
src.created_name = t src.created_name = t
/obj/machinery/bot/secbot/declare()
var/area/location = get_area(src)
declare_message = "<span class='info'>\icon[src] [name] is [arrest_type ? "detaining" : "arresting"] level [threatlevel] scumbag <b>[target]</b> in <b>[location]</b></span>"
..()
/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))
return 1
return 0

View File

@@ -14,68 +14,9 @@
name = "Health Scanner HUD" name = "Health Scanner HUD"
desc = "A heads-up display that scans the humans in view and provides accurate data about their health status." desc = "A heads-up display that scans the humans in view and provides accurate data about their health status."
icon_state = "healthhud" icon_state = "healthhud"
proc
RoundHealth(health)
/obj/item/clothing/glasses/hud/health/process_hud(var/mob/M)
RoundHealth(health) process_med_hud(M)
switch(health)
if(100 to INFINITY)
return "health100"
if(70 to 100)
return "health80"
if(50 to 70)
return "health60"
if(30 to 50)
return "health40"
if(18 to 30)
return "health25"
if(5 to 18)
return "health10"
if(1 to 5)
return "health1"
if(-99 to 0)
return "health0"
else
return "health-100"
return "0"
process_hud(var/mob/M)
if(!M) return
if(!M.client) return
var/client/C = M.client
var/image/holder
for(var/mob/living/carbon/human/patient in view(get_turf(M)))
if(M.see_invisible < patient.invisibility)
continue
var/foundVirus = 0
for(var/datum/disease/D in patient.viruses)
if(!D.hidden[SCANNER])
foundVirus++
for (var/ID in patient.virus2)
if (ID in virusDB)
foundVirus = 1
break
if(!C) continue
holder = patient.hud_list[HEALTH_HUD]
if(patient.stat == 2)
holder.icon_state = "hudhealth-100"
else
holder.icon_state = "hud[RoundHealth(patient.health)]"
C.images += holder
holder = patient.hud_list[STATUS_HUD]
if(patient.stat == 2)
holder.icon_state = "huddead"
else if(patient.status_flags & XENO_HOST)
holder.icon_state = "hudxeno"
else if(foundVirus)
holder.icon_state = "hudill"
else
holder.icon_state = "hudhealthy"
C.images += holder
/obj/item/clothing/glasses/hud/security /obj/item/clothing/glasses/hud/security
@@ -92,62 +33,4 @@
invisa_view = 2 invisa_view = 2
/obj/item/clothing/glasses/hud/security/process_hud(var/mob/M) /obj/item/clothing/glasses/hud/security/process_hud(var/mob/M)
if(!M) return process_sec_hud(M,1)
if(!M.client) return
var/client/C = M.client
var/image/holder
for(var/mob/living/carbon/human/perp in view(get_turf(M)))
if(M.see_invisible < perp.invisibility)
continue
if(!C) continue
var/perpname = perp.name
holder = perp.hud_list[ID_HUD]
if(perp.wear_id)
var/obj/item/weapon/card/id/I = perp.wear_id.GetID()
if(I)
perpname = I.registered_name
holder.icon_state = "hud[ckey(I.GetJobName())]"
C.images += holder
else
perpname = perp.name
holder.icon_state = "hudunknown"
C.images += holder
else
perpname = perp.name
holder.icon_state = "hudunknown"
C.images += holder
for(var/datum/data/record/E in data_core.general)
if(E.fields["name"] == perpname)
holder = perp.hud_list[WANTED_HUD]
for (var/datum/data/record/R in data_core.security)
if((R.fields["id"] == E.fields["id"]) && (R.fields["criminal"] == "*Arrest*"))
holder.icon_state = "hudwanted"
C.images += holder
break
else if((R.fields["id"] == E.fields["id"]) && (R.fields["criminal"] == "Incarcerated"))
holder.icon_state = "hudprisoner"
C.images += holder
break
else if((R.fields["id"] == E.fields["id"]) && (R.fields["criminal"] == "Parolled"))
holder.icon_state = "hudparolled"
C.images += holder
break
else if((R.fields["id"] == E.fields["id"]) && (R.fields["criminal"] == "Released"))
holder.icon_state = "hudreleased"
C.images += holder
break
for(var/obj/item/weapon/implant/I in perp)
if(I.implanted)
if(istype(I,/obj/item/weapon/implant/tracking))
holder = perp.hud_list[IMPTRACK_HUD]
holder.icon_state = "hud_imp_tracking"
C.images += holder
if(istype(I,/obj/item/weapon/implant/loyalty))
holder = perp.hud_list[IMPLOYAL_HUD]
holder.icon_state = "hud_imp_loyal"
C.images += holder
if(istype(I,/obj/item/weapon/implant/chem))
holder = perp.hud_list[IMPCHEM_HUD]
holder.icon_state = "hud_imp_chem"
C.images += holder

View File

@@ -689,7 +689,8 @@
/mob/living/carbon/human/Topic(href, href_list) /mob/living/carbon/human/Topic(href, href_list)
var/pickpocket = 0 var/pickpocket = 0
var/list/ourlist = list() var/list/ourlist = list()
if(!usr.stat && usr.canmove && !usr.restrained() && in_range(src, usr) && Adjacent(usr)) var/able = (!usr.stat && usr.canmove && !usr.restrained() && in_range(src, usr) && Adjacent(usr))
/* /*
if(!usr.stat && usr.canmove && !usr.restrained() && in_range(src, usr) && Adjacent(usr)) if(!usr.stat && usr.canmove && !usr.restrained() && in_range(src, usr) && Adjacent(usr))
@@ -702,7 +703,7 @@
*/ */
if(href_list["item"]) if(href_list["item"] && able)
var/slot = href_list["item"] var/slot = href_list["item"]
var/obj/item/place_item = usr.get_active_hand() var/obj/item/place_item = usr.get_active_hand()
var/obj/item/id_item = src.wear_id var/obj/item/id_item = src.wear_id
@@ -756,7 +757,7 @@
return return
if(href_list["pockets"]) if(href_list["pockets"] && able)
var/pocket_side = href_list["pockets"] var/pocket_side = href_list["pockets"]
var/pocket_id = (pocket_side == "right" ? slot_r_store : slot_l_store) var/pocket_id = (pocket_side == "right" ? slot_r_store : slot_l_store)
var/obj/item/pocket_item = (pocket_id == slot_r_store ? src.r_store : src.l_store) var/obj/item/pocket_item = (pocket_id == slot_r_store ? src.r_store : src.l_store)
@@ -789,9 +790,6 @@
// Display a warning if the user mocks up // Display a warning if the user mocks up
src << "<span class='warning'>You feel your [pocket_side] pocket being fumbled with!</span>" src << "<span class='warning'>You feel your [pocket_side] pocket being fumbled with!</span>"
..()
return
if (href_list["refresh"]) if (href_list["refresh"])
if((machine)&&(in_range(src, usr))) if((machine)&&(in_range(src, usr)))
@@ -821,10 +819,11 @@
return return
*/ */
if (href_list["criminal"]) if (href_list["criminal"])
var/sechud = hasHUD(usr,"security")
if(hasHUD(usr,"security")) if(hasHUD(usr,"security"))
var/modified = 0
var/perpname = "wot" var/perpname = "wot"
var/modified
if(wear_id) if(wear_id)
var/obj/item/weapon/card/id/I = wear_id.GetID() var/obj/item/weapon/card/id/I = wear_id.GetID()
if(I) if(I)
@@ -836,6 +835,7 @@
if(perpname) if(perpname)
for (var/datum/data/record/E in data_core.general) for (var/datum/data/record/E in data_core.general)
usr << E.fields["name"]
if (E.fields["name"] == perpname) if (E.fields["name"] == perpname)
for (var/datum/data/record/R in data_core.security) for (var/datum/data/record/R in data_core.security)
if (R.fields["id"] == E.fields["id"]) if (R.fields["id"] == E.fields["id"])
@@ -1771,3 +1771,75 @@ mob/living/carbon/human/yank_out_object()
if(wear_id) if(wear_id)
ACL |= wear_id.GetAccess() ACL |= wear_id.GetAccess()
return ACL return ACL
/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
if(lasercolor)
if(lasercolor == "b")//Lasertag turrets target the opposing team.
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(judgebot.idcheck && !idcard)
threatcount += 4
//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"])
switch(R.fields["criminal"])
if("*Arrest*")
threatcount += 5
if("Incarcerated")
threatcount += 2
if("Parolled")
threatcount += 2
//Check for dresscode violations
if(istype(head, /obj/item/clothing/head/wizard) || istype(head, /obj/item/clothing/head/helmet/space/rig/wizard))
threatcount += 2
//Loyalty implants imply trustworthyness
if(isloyal(src))
threatcount -= 1
//Secbots are racist!
if(dna && dna.mutantrace && dna.mutantrace != "none")
threatcount += 2
//Agent cards lower threatlevel.
if(istype(idcard, /obj/item/weapon/card/id/syndicate))
threatcount -= 2
return threatcount

View File

@@ -1093,20 +1093,11 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
return 1 return 1
proc/handle_regular_hud_updates() proc/handle_regular_hud_updates()
if(hud_updateflag)
handle_hud_list()
if(!client) return 0 if(!client) return 0
if(hud_updateflag) regular_hud_updates()
handle_hud_list()
for(var/image/hud in client.images)
if(copytext(hud.icon_state,1,4) == "hud") //ugly, but icon comparison is worse, I believe
client.images.Remove(hud)
client.screen.Remove(global_hud.blurry, global_hud.druggy, global_hud.vimpaired, global_hud.darkMask/*, global_hud.nvg*/) client.screen.Remove(global_hud.blurry, global_hud.druggy, global_hud.vimpaired, global_hud.darkMask/*, global_hud.nvg*/)
update_action_buttons() update_action_buttons()

View File

@@ -1,4 +1,4 @@
/mob/living/carbon/slime/proc/regular_hud_updates() /mob/living/carbon/slime/regular_hud_updates()
return return

View File

@@ -523,3 +523,34 @@
if(istype(I)) if(istype(I))
ACL |= I.GetAccess() ACL |= I.GetAccess()
return ACL return ACL
/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

View File

@@ -1,4 +1,4 @@
/mob/living/silicon/pai/proc/regular_hud_updates() /mob/living/silicon/pai/regular_hud_updates()
if(client) if(client)
for(var/image/hud in client.images) for(var/image/hud in client.images)
if(copytext(hud.icon_state,1,4) == "hud") if(copytext(hud.icon_state,1,4) == "hud")

View File

@@ -9,10 +9,10 @@
del(src.cable) del(src.cable)
regular_hud_updates() regular_hud_updates()
if(src.secHUD == 1) if(src.secHUD)
src.securityHUD() process_sec_hud(src)
if(src.medHUD == 1) if(src.medHUD)
src.medicalHUD() process_med_hud(src)
if(silence_time) if(silence_time)
if(world.timeofday >= silence_time) if(world.timeofday >= silence_time)
silence_time = null silence_time = null

View File

@@ -168,12 +168,13 @@
src.see_in_dark = 8 src.see_in_dark = 8
src.see_invisible = SEE_INVISIBLE_LEVEL_TWO src.see_invisible = SEE_INVISIBLE_LEVEL_TWO
for(var/image/hud in client.images) //COPIED FROM the human handle_regular_hud_updates() proc regular_hud_updates() //Handles MED/SEC HUDs for borgs.
if(copytext(hud.icon_state,1,4) == "hud") //ugly, but icon comparison is worse, I believe
client.images.Remove(hud)
var/obj/item/borg/sight/hud/hud = (locate(/obj/item/borg/sight/hud) in src) switch(sensor_mode)
if(hud && hud.hud) hud.hud.process_hud(src) if (SEC_HUD)
process_sec_hud(src, 1)
if (MED_HUD)
process_med_hud(src)
if (src.healths) if (src.healths)
if (src.stat != 2) if (src.stat != 2)

View File

@@ -1268,6 +1268,10 @@
statelaws() statelaws()
return return
/mob/living/silicon/robot/sensor_mode() //Medical/Security HUD controller for borgs
set category = "Robot Commands"
set desc = "Augment visual feed with internal sensor overlays."
..()
/mob/living/silicon/robot/proc/radio_menu() /mob/living/silicon/robot/proc/radio_menu()
radio.interact(src)//Just use the radio's Topic() instead of bullshit special-snowflake code radio.interact(src)//Just use the radio's Topic() instead of bullshit special-snowflake code

View File

@@ -67,7 +67,7 @@
New() New()
..() ..()
src.modules += new /obj/item/borg/sight/hud/med(src) //src.modules += new /obj/item/borg/sight/hud/med(src)
src.modules += new /obj/item/device/healthanalyzer(src) src.modules += new /obj/item/device/healthanalyzer(src)
src.modules += new /obj/item/weapon/reagent_containers/borghypo(src) src.modules += new /obj/item/weapon/reagent_containers/borghypo(src)
src.modules += new /obj/item/weapon/reagent_containers/glass/beaker/large(src) src.modules += new /obj/item/weapon/reagent_containers/glass/beaker/large(src)
@@ -191,7 +191,7 @@
New() New()
..() ..()
src.modules += new /obj/item/borg/sight/hud/sec(src) //src.modules += new /obj/item/borg/sight/hud/sec(src)
src.modules += new /obj/item/weapon/handcuffs/cyborg(src) src.modules += new /obj/item/weapon/handcuffs/cyborg(src)
src.modules += new /obj/item/weapon/melee/baton/loaded(src) src.modules += new /obj/item/weapon/melee/baton/loaded(src)
src.modules += new /obj/item/weapon/gun/energy/taser/cyborg(src) src.modules += new /obj/item/weapon/gun/energy/taser/cyborg(src)

View File

@@ -8,6 +8,9 @@
var/list/alarms_to_clear = list() var/list/alarms_to_clear = list()
immune_to_ssd = 1 immune_to_ssd = 1
var/sensor_mode = 0 //Determines the current HUD.
#define SEC_HUD 1 //Security HUD mode
#define MED_HUD 2 //Medical HUD mode
var/list/alarm_types_show = list("Motion" = 0, "Fire" = 0, "Atmosphere" = 0, "Power" = 0, "Camera" = 0) var/list/alarm_types_show = list("Motion" = 0, "Fire" = 0, "Atmosphere" = 0, "Power" = 0, "Camera" = 0)
var/list/alarm_types_clear = list("Motion" = 0, "Fire" = 0, "Atmosphere" = 0, "Power" = 0, "Camera" = 0) var/list/alarm_types_clear = list("Motion" = 0, "Fire" = 0, "Atmosphere" = 0, "Power" = 0, "Camera" = 0)
@@ -225,3 +228,23 @@
return damage return damage
return 0 return 0
/mob/living/silicon/assess_threat() //Secbots will not target silicons!
return -10
/mob/living/silicon/verb/sensor_mode()
set name = "Set Sensor Augmentation"
var/sensor_type = input("Please select sensor type.", "Sensor Integration", null) in list("Security", "Medical"/*,"Light Amplification"*/,"Disable")
switch(sensor_type)
if ("Security")
sensor_mode = SEC_HUD
src << "<span class='notice'>Security records overlay enabled.</span>"
if ("Medical")
sensor_mode = MED_HUD
src << "<span class='notice'>Life signs monitor overlay enabled.</span>"/*
if ("Light Amplification")
src.sensor_mode = NIGHT
src << "<span class='notice'>Light amplification mode enabled.</span>"*/
if ("Disable")
sensor_mode = 0
src << "Sensor augmentations disabled."

View File

@@ -1456,3 +1456,6 @@ mob/verb/yank_out_object()
// Skip over all the complex list checks. // Skip over all the complex list checks.
/mob/proc/hasFullAccess() /mob/proc/hasFullAccess()
return 0 return 0
mob/proc/assess_threat()
return 0