diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index 21b3b0cb144..4bd75185e3a 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -54,12 +54,6 @@
//data HUD (medhud, sechud) defines
//Don't forget to update human/New() if you change these!
-#define DATA_HUD_SECURITY 1
-#define DATA_HUD_MEDICAL 2
-
-#define DATA_HUD_BASIC 1
-#define DATA_HUD_ADVANCED 2
-
#define DATA_HUD_SECURITY_BASIC 1
#define DATA_HUD_SECURITY_ADVANCED 2
#define DATA_HUD_MEDICAL_BASIC 3
diff --git a/code/__DEFINES/sight.dm b/code/__DEFINES/sight.dm
index 6d8865816df..69ced6e7ec2 100644
--- a/code/__DEFINES/sight.dm
+++ b/code/__DEFINES/sight.dm
@@ -22,7 +22,9 @@
#define BORGTHERM 2
#define BORGXRAY 4
-// for secHUDs and medHUDs and variants. The number is the location of the image on the list hud_list of humans.
+// for secHUDs and medHUDs and variants. The number is the location of the image on the list hud_list
+// note: if you add more HUDs, even for non-human atoms, make sure to use unique numbers for the defines!
+// /datum/hud expects these to be unique
#define HEALTH_HUD 1 // dead, alive, sick, health status
#define STATUS_HUD 2 // a simple line rounding the mob's number health
#define ID_HUD 3 // the job asigned to your ID
diff --git a/code/datums/hud.dm b/code/datums/hud.dm
new file mode 100644
index 00000000000..01175665528
--- /dev/null
+++ b/code/datums/hud.dm
@@ -0,0 +1,51 @@
+/* HUD DATUMS */
+
+var/datum/hud/huds = list( \
+ DATA_HUD_SECURITY_BASIC = new/datum/hud/data/security/basic(), \
+ DATA_HUD_SECURITY_ADVANCED = new/datum/hud/data/security/advanced(), \
+ DATA_HUD_MEDICAL_BASIC = new/datum/hud/data/medical/basic(), \
+ DATA_HUD_MEDICAL_ADVANCED = new/datum/hud/data/medical/advanced() \
+ )
+
+/atom/proc/add_to_all_huds()
+ for(var/datum/hud/hud in huds) hud.add_to_hud(src)
+
+/atom/proc/remove_from_all_huds()
+ for(var/datum/hud/hud in huds) hud.remove_from_hud(src)
+
+/datum/hud
+ var/list/atom/hudatoms = list() //list of all atoms which display this hud
+ var/list/mob/hudusers = list() //list with all mobs who can see the hud
+ var/list/hud_icons = list() //these will be the indexes for the atom's hud_list
+
+/datum/hud/proc/remove_hud_from(var/mob/M)
+ for(var/atom/A in hudatoms)
+ remove_from_single_hud(M, A)
+ hudusers -= M
+
+/datum/hud/proc/remove_from_hud(var/atom/A)
+ for(var/mob/M in hudusers)
+ remove_from_single_hud(M, A)
+ hudatoms -= A
+
+/datum/hud/proc/remove_from_single_hud(var/mob/M, var/atom/A) //unsafe, no sanity apart from client
+ if(!M.client)
+ return
+ for(var/i in hud_icons)
+ M.client.images -= A.hud_list[i]
+
+/datum/hud/proc/add_hud_to(var/mob/M)
+ hudusers |= M
+ for(var/atom/A in hudatoms)
+ add_to_single_hud(M, A)
+
+/datum/hud/proc/add_to_hud(var/atom/A)
+ hudatoms |= A
+ for(var/mob/M in hudusers)
+ add_to_single_hud(M, A)
+
+/datum/hud/proc/add_to_single_hud(var/mob/M, var/atom/A) //unsafe, no sanity apart from client
+ if(!M.client)
+ return
+ for(var/i in hud_icons)
+ M.client.images |= A.hud_list[i]
diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm
index 77c2ebf1f6a..908024c2835 100644
--- a/code/game/data_huds.dm
+++ b/code/game/data_huds.dm
@@ -1,136 +1,35 @@
- /*
+/*
* Data HUDs are now passive in order to reduce lag.
* Add then to a mob using add_data_hud.
* Update them when needed with the appropriate proc. (see below)
*/
-/* HUD DATUMS */
-
-var/datum/hud/huds = list( \
- DATA_HUD_SECURITY_BASIC = new/datum/hud/data/security/basic(), \
- DATA_HUD_SECURITY_ADVANCED = new/datum/hud/data/security/advanced(), \
- DATA_HUD_MEDICAL_BASIC = new/datum/hud/data/medical/basic(), \
- DATA_HUD_MEDICAL_ADVANCED = new/datum/hud/data/medical/advanced() \
- )
-
-/atom/proc/add_to_all_huds()
- for(var/datum/hud/hud in huds) hud.add_to_hud(src)
-
-/atom/proc/remove_from_all_huds()
- for(var/datum/hud/hud in huds) hud.remove_from_hud(src)
-
-//this is ugly
-//don't use these if you don't need to
-/proc/get_data_hud_datum(hud_type, hud_level)
- var/myhud = 0
- switch(hud_type)
- if(DATA_HUD_SECURITY)
- switch(hud_level)
- if(DATA_HUD_BASIC)
- myhud = DATA_HUD_SECURITY_BASIC
- if(DATA_HUD_ADVANCED)
- myhud = DATA_HUD_SECURITY_ADVANCED
- if(DATA_HUD_MEDICAL)
- switch(hud_level)
- if(DATA_HUD_BASIC)
- myhud = DATA_HUD_MEDICAL_BASIC
- if(DATA_HUD_ADVANCED)
- myhud = DATA_HUD_MEDICAL_ADVANCED
- return myhud
-
-/mob/proc/access_data_hud(hud_type, hud_level)
- var/myhud = get_data_hud_datum(hud_type, hud_level)
- if(myhud)
- var/datum/hud/data/H = huds[myhud]
- H.add_hud_to(src)
-
-/mob/proc/reset_data_hud(hud_type, hud_level)
- var/myhud = get_data_hud_datum(hud_type, hud_level)
- if(myhud)
- var/datum/hud/data/H = huds[myhud]
- H.remove_hud_from(src)
-
-/datum/hud
- var/list/image/hudimages = list() //list of all hud image overlays
- var/list/mob/hudusers = list() //list with all mobs who can see the hud
- var/hud_type = 0 //hud_list[hud_type] will have icons to be shown. see __DEFINES/misc.dm for a list of the available types
- var/list/hud_icons = list() //these will be the indexes for hud_list[hud_type][]
-
-/datum/hud/proc/remove_hud_from(var/mob/M)
- if(!M.client)
- return
- M.client.images -= hudimages
- hudusers -= M
-
-/datum/hud/proc/remove_from_hud(var/atom/A)
- for(var/image/I in hudimages)
- if(I.loc == A)
- hudimages -= I
- for(var/mob/M in hudusers)
- M.client.images -= I
-
-/datum/hud/proc/remove_from_single_hud(var/mob/M, var/atom/A)
- if(!M.client || !(hud_type in A.hud_list) || !(M in hudusers))
- return
- for(var/icontype in hud_icons)
- M.client.images -= A.hud_list[hud_type][hud_icons]
-
-/datum/hud/proc/add_hud_to(var/mob/M)
- if(!M.client)
- return
- hudusers |= M
- add_images_to(M)
-
-/datum/hud/proc/add_images_to(var/mob/M)
- M.client.images += hudimages
-
-/datum/hud/proc/add_to_hud(var/atom/A)
- if(hud_type in A.hud_list)
- for(var/icontype in hud_icons)
- var/list/image/AH = A.hud_list[hud_type][hud_icons]
- hudimages += AH
- for(var/mob/M in hudusers)
- if(M.client)
- M.client.images += AH
-
-/datum/hud/proc/add_to_single_hud(var/mob/M, var/atom/A)
- if(!M.client || !(hud_type in A.hud_list) || !(M in hudusers))
- return
- for(var/icontype in hud_icons)
- M.client.images |= A.hud_list[hud_type][hud_icons]
+//see code/datum/hud.dm for the generic hud datum
/datum/hud/data
/datum/hud/data/medical
- hud_type = DATA_HUD_MEDICAL
hud_icons = list(HEALTH_HUD, STATUS_HUD)
/datum/hud/data/medical/basic
-/datum/hud/data/medical/basic/add_images_to(var/mob/M)
- for(var/image/I in hudimages)
- var/mob/living/carbon/human/H = I.loc
- var/obj/item/clothing/under/U = H.w_uniform
- if(!istype(U)) continue
- if(U.sensor_mode <= 2) continue
- M.client.images += I
+/datum/hud/data/medical/basic/proc/check_sensors(var/mob/living/carbon/human/H)
+ if(!istype(H)) return 0
+ var/obj/item/clothing/under/U = H.w_uniform
+ if(!istype(U)) return 0
+ if(U.sensor_mode <= 2) return 0
+ return 1
-/datum/hud/data/medical/basic/proc/update_suit_sensors(var/mob/living/carbon/human/H, sensor_level)
- if(!istype(H)) return
- var/list/image/Himages = list()
- for(var/image/I in hudimages)
- if(I.loc == H) Himages |= I
- for(var/mob/M in hudusers)
- if(!M.client) continue
- if(sensor_level <= 2)
- M.client.images -= Himages
- else
- M.client.images |= Himages
+/datum/hud/data/medical/basic/add_to_single_hud(var/mob/M, var/mob/living/carbon/human/H)
+ if(check_sensors(H))
+ ..()
+
+/datum/hud/data/medical/basic/proc/update_suit_sensors(var/mob/living/carbon/human/H)
+ check_sensors(H) ? add_to_hud(H) : remove_from_hud(H)
/datum/hud/data/medical/advanced
/datum/hud/data/security
- hud_type = DATA_HUD_SECURITY
/datum/hud/data/security/basic
hud_icons = list(ID_HUD)
@@ -183,15 +82,13 @@ var/datum/hud/huds = list( \
//HOOKS
//called when a human changes suit sensors
-/mob/living/carbon/human/proc/update_suit_sensors(var/obj/item/clothing/under/w_uniform)
- var/sensor_level = 0
- if(w_uniform) sensor_level = w_uniform.sensor_mode
+/mob/living/carbon/human/proc/update_suit_sensors()
var/datum/hud/data/medical/basic/B = huds[DATA_HUD_MEDICAL_BASIC]
- B.update_suit_sensors(src, sensor_level)
+ B.update_suit_sensors(src)
//called when a human changes health
/mob/living/carbon/human/proc/med_hud_set_health()
- var/image/holder = hud_list[DATA_HUD_MEDICAL][HEALTH_HUD]
+ var/image/holder = hud_list[HEALTH_HUD]
if(stat == 2)
holder.icon_state = "hudhealth-100"
else
@@ -199,7 +96,7 @@ var/datum/hud/huds = list( \
//called when a human changes stat, virus or XENO_HOST
/mob/living/carbon/human/proc/med_hud_set_status()
- var/image/holder = hud_list[DATA_HUD_MEDICAL][STATUS_HUD]
+ var/image/holder = hud_list[STATUS_HUD]
if(stat == 2)
holder.icon_state = "huddead"
else if(status_flags & XENO_HOST)
@@ -217,26 +114,26 @@ var/datum/hud/huds = list( \
//HOOKS
/mob/living/carbon/human/proc/sec_hud_set_ID()
- var/image/holder = hud_list[DATA_HUD_SECURITY][ID_HUD]
+ var/image/holder = hud_list[ID_HUD]
holder.icon_state = "hudno_id"
if(wear_id)
holder.icon_state = "hud[ckey(wear_id.GetJobName())]"
/mob/living/carbon/human/proc/sec_hud_set_implants()
var/image/holder
- for(var/I in list(IMPTRACK_HUD, IMPLOYAL_HUD, IMPCHEM_HUD))
- holder = hud_list[DATA_HUD_SECURITY][I]
+ for(var/i in list(IMPTRACK_HUD, IMPLOYAL_HUD, IMPCHEM_HUD))
+ holder = hud_list[i]
holder.icon_state = null
for(var/obj/item/weapon/implant/I in src)
if(I.implanted)
if(istype(I,/obj/item/weapon/implant/tracking))
- holder = hud_list[DATA_HUD_SECURITY][IMPTRACK_HUD]
+ holder = hud_list[IMPTRACK_HUD]
holder.icon_state = "hud_imp_tracking"
else if(istype(I,/obj/item/weapon/implant/loyalty))
- holder = hud_list[DATA_HUD_SECURITY][IMPLOYAL_HUD]
+ holder = hud_list[IMPLOYAL_HUD]
holder.icon_state = "hud_imp_loyal"
else if(istype(I,/obj/item/weapon/implant/chem))
- holder = hud_list[DATA_HUD_SECURITY][IMPCHEM_HUD]
+ holder = hud_list[IMPCHEM_HUD]
holder.icon_state = "hud_imp_chem"
/mob/living/carbon/human/proc/sec_hud_set_security_status()
@@ -245,10 +142,11 @@ var/datum/hud/huds = list( \
if(perpname)
var/datum/data/record/R = find_record("name", perpname, data_core.security)
if(R)
- holder = hud_list[DATA_HUD_SECURITY][WANTED_HUD]
+ holder = hud_list[WANTED_HUD]
switch(R.fields["criminal"])
if("*Arrest*") holder.icon_state = "hudwanted"
if("Incarcerated") holder.icon_state = "hudincarcerated"
if("Parolled") holder.icon_state = "hudparolled"
if("Discharged") holder.icon_state = "huddischarged"
else holder.icon_state = null
+
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 16a22819adf..3f96cd45378 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -287,7 +287,7 @@ atom/proc/generate_female_clothing(index,t_color,icon)
if(istype(M,/mob/living/carbon/human))
var/mob/living/carbon/human/H = M
if(H.w_uniform == src)
- H.update_suit_sensors(src)
+ H.update_suit_sensors()
..()
/obj/item/clothing/under/verb/rolldown()
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 31826e9b362..83ede6120b3 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -36,15 +36,8 @@
..()
/mob/living/carbon/human/proc/prepare_data_huds()
- //Populates the human hud_list
- for(var/i=1;i<=2;i++) // Humans have 2 sets of data hud icons
- hud_list[i] = list()
-
- for(var/i=1;i<=2;i++) // 2 icons for medHUDs...
- hud_list[DATA_HUD_MEDICAL] += image('icons/mob/hud.dmi', src, "")
-
- for(var/i=1;i<=5;i++) // ...and 5 for secHUDs
- hud_list[DATA_HUD_SECURITY] += image('icons/mob/hud.dmi', src, "")
+ for(var/i=1;i<=7;i++) // 2 icons for medHUDs and 5 for secHUDs
+ hud_list += image('icons/mob/hud.dmi', src, "")
//Update all our hud images...
med_hud_set_health()
@@ -55,7 +48,6 @@
//...and display them
add_to_all_huds()
-
/mob/living/carbon/human/Destroy()
for(var/atom/movable/organelle in organs)
qdel(organelle)
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index 49b51a2c0df..6da553aaf24 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -260,7 +260,7 @@
if(belt)
unEquip(belt)
w_uniform = null
- update_suit_sensors(w_uniform)
+ update_suit_sensors()
update_inv_w_uniform(0)
else if(I == gloves)
gloves = null
@@ -378,7 +378,7 @@
update_inv_wear_suit(redraw_mob)
if(slot_w_uniform)
w_uniform = I
- update_suit_sensors(w_uniform)
+ update_suit_sensors()
update_inv_w_uniform(redraw_mob)
if(slot_l_store)
l_store = I
@@ -396,5 +396,4 @@
else
src << "You are trying to equip this item to an unsupported inventory slot. Report this to a coder!"
return
- update_action_buttons()
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index e2fb40f91b4..1604a5941a4 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -20,7 +20,8 @@ var/list/ai_list = list()
density = 1
status_flags = CANSTUN|CANPARALYSE|CANPUSH
force_compose = 1 //This ensures that the AI always composes it's own hear message. Needed for hrefs and job display.
- sensor_level = DATA_HUD_BASIC
+ med_hud = DATA_HUD_MEDICAL_BASIC
+ sec_hud = DATA_HUD_SECURITY_BASIC
var/list/network = list("SS13")
var/obj/machinery/camera/current = null
var/list/connected_robots = list()
diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm
index ea710a42e85..c57a52c8a8f 100644
--- a/code/modules/mob/living/silicon/pai/software.dm
+++ b/code/modules/mob/living/silicon/pai/software.dm
@@ -239,11 +239,15 @@
if("securityhud")
if(href_list["toggle"])
secHUD = !secHUD
- secHUD ? access_data_hud(DATA_HUD_SECURITY,sensor_level) : reset_data_hud(DATA_HUD_SECURITY,sensor_level)
+ remove_med_sec_hud()
+ if(secHUD)
+ add_sec_hud()
if("medicalhud")
if(href_list["toggle"])
medHUD = !medHUD
- medHUD ? access_data_hud(DATA_HUD_MEDICAL,sensor_level) : reset_data_hud(DATA_HUD_MEDICAL,sensor_level)
+ remove_med_sec_hud()
+ if(medHUD)
+ add_med_hud()
if("translator")
if(href_list["toggle"])
languages = languages == ALL ? HUMAN & ROBOT : ALL
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 73ddcdfba9e..36dbd64137f 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -15,7 +15,8 @@
var/lawcheck[1]
var/ioncheck[1]
- var/sensor_level = DATA_HUD_ADVANCED //Determines the sensor level to use
+ var/med_hud = DATA_HUD_MEDICAL_ADVANCED //Determines the med hud to use
+ var/sec_hud = DATA_HUD_SECURITY_ADVANCED //Determines the sec hud to use
/mob/living/silicon/proc/cancelAlarm()
return
@@ -317,17 +318,30 @@
/mob/living/silicon/assess_threat() //Secbots won't hunt silicon units
return -10
+/mob/living/silicon/proc/remove_med_sec_hud()
+ var/datum/hud/secsensor = huds[sec_hud]
+ var/datum/hud/medsensor = huds[med_hud]
+ secsensor.remove_hud_from(src)
+ medsensor.remove_hud_from(src)
+
+/mob/living/silicon/proc/add_sec_hud()
+ var/datum/hud/secsensor = huds[sec_hud]
+ secsensor.add_hud_to(src)
+
+/mob/living/silicon/proc/add_med_hud()
+ var/datum/hud/medsensor = huds[med_hud]
+ medsensor.add_hud_to(src)
+
/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","Disable")
- reset_data_hud(DATA_HUD_SECURITY, sensor_level)
- reset_data_hud(DATA_HUD_MEDICAL, sensor_level)
+ remove_med_sec_hud()
switch(sensor_type)
if ("Security")
- access_data_hud(DATA_HUD_SECURITY,sensor_level)
+ add_sec_hud()
src << "Security records overlay enabled."
if ("Medical")
- access_data_hud(DATA_HUD_MEDICAL,sensor_level)
+ add_med_hud()
src << "Life signs monitor overlay enabled."
if ("Disable")
src << "Sensor augmentations disabled."
diff --git a/tgstation.dme b/tgstation.dme
index 7fadcb03746..435daef1607 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -129,6 +129,7 @@
#include "code\datums\datacore.dm"
#include "code\datums\datumvars.dm"
#include "code\datums\gas_mixture.dm"
+#include "code\datums\hud.dm"
#include "code\datums\mind.dm"
#include "code\datums\mixed.dm"
#include "code\datums\modules.dm"