diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm
index 5874a794c9a..a60554e64b0 100644
--- a/code/game/data_huds.dm
+++ b/code/game/data_huds.dm
@@ -76,56 +76,54 @@
return 0
//helper for getting the appropriate health status UPDATED BY PUCKABOO2 TO INCLUDE NEGATIVES.
-/proc/RoundHealth(health)
- switch(health)
+/proc/RoundHealth(mob/living/M)
+ if(M.stat == DEAD)
+ return "health-100" //what's our health? it doesn't matter, we're dead
+ var/resulthealth = (M.health / M.maxHealth) * 100
+ switch(resulthealth)
if(100 to INFINITY)
return "health100"
- if(95 to 100)
- return "health95" //For telling patients to eat a warm donk pocket and go on with their shift.
- if(90 to 95)
- return "health90"
- if(80 to 90)
- return "health80"
- if(70 to 80)
- return "health70"
- if(60 to 70)
- return "health60"
- if(50 to 60)
+ if(90.625 to 100)
+ return "health93.75"
+ if(84.375 to 90.625)
+ return "health87.5"
+ if(78.125 to 84.375)
+ return "health81.25"
+ if(71.875 to 78.125)
+ return "health75"
+ if(65.625 to 71.875)
+ return "health68.75"
+ if(59.375 to 65.625)
+ return "health62.5"
+ if(53.125 to 59.375)
+ return "health56.25"
+ if(46.875 to 53.125)
return "health50"
- if(40 to 50)
- return "health40"
- if(30 to 40)
- return "health30"
- if(20 to 30)
- return "health20"
- if(10 to 20)
- return "health10"
- if(0 to 10)
+ if(40.625 to 46.875)
+ return "health43.75"
+ if(34.375 to 40.625)
+ return "health37.5"
+ if(28.125 to 34.375)
+ return "health31.25"
+ if(21.875 to 28.125)
+ return "health25"
+ if(15.625 to 21.875)
+ return "health18.75"
+ if(9.375 to 15.625)
+ return "health12.5"
+ if(1 to 9.375)
+ return "health6.25"
+ if(-50 to 1)
return "health0"
- if(-10 to 0)
- return "health-0" //The health bar will turn a brilliant red and flash as usual, but deducted health will be black.
- if(-20 to -10)
- return "health-10"
- if(-30 to -20)
- return "health-20"
- if(-40 to -30)
- return "health-30"
- if(-50 to -40)
- return "health-40"
- if(-60 to -50)
+ if(-85 to -50)
return "health-50"
- if(-70 to -60)
- return "health-60"
- if(-80 to -70)
- return "health-70" //Doc?
- if(-90 to -80)
- return "health-80" //Hey, doc?
- if(-100 to -90)
- return "health-90" //HURRY UP, DOC!
+ if(-99 to -85)
+ return "health-85"
else
- return "health-100" //doc u had 1 job
+ return "health-100"
return "0"
+
///HOOKS
//called when a human changes suit sensors
@@ -134,22 +132,26 @@
B.update_suit_sensors(src)
-//called when a carbon changes health
-/mob/living/carbon/proc/med_hud_set_health()
+//called when a living mob changes health
+/mob/living/proc/med_hud_set_health()
var/image/holder = hud_list[HEALTH_HUD]
- if(stat == 2)
- holder.icon_state = "hudhealth-100"
- else
- holder.icon_state = "hud[RoundHealth(health)]"
+ holder.icon_state = "hud[RoundHealth(src)]"
+
//called when a carbon changes stat, virus or XENO_HOST
-/mob/living/carbon/proc/med_hud_set_status()
+/mob/living/proc/med_hud_set_status()
var/image/holder = hud_list[STATUS_HUD]
- //var/image/holder2 = hud_list[STATUS_HUD_OOC]
- var/mob/living/simple_animal/borer/B = has_brain_worms()
- if(stat == 2)
+ if(stat == DEAD)
+ holder.icon_state = "huddead"
+ else
+ holder.icon_state = "hudhealthy"
+
+//called when a carbon changes stat, virus or XENO_HOST
+/mob/living/carbon/med_hud_set_status()
+ var/image/holder = hud_list[STATUS_HUD]
+ var/mob/living/simple_animal/borer/B = has_brain_worms()
+ if(stat == DEAD)
holder.icon_state = "huddead"
- //holder2.icon_state = "huddead"
else if(status_flags & XENO_HOST)
holder.icon_state = "hudxeno"
else if(check_virus())
@@ -158,7 +160,6 @@
holder.icon_state = "hudbrainworm"
else
holder.icon_state = "hudhealthy"
- //holder2.icon_state = "hudhealthy"
diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
index 9f39ca418ea..a44d759dd6d 100644
--- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
+++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
@@ -112,6 +112,7 @@
loot = list(/obj/effect/decal/cleanable/blood/gibs/robot, /obj/item/weapon/ore/bluespace_crystal/artificial)
deathmessage = "The swarmer explodes with a sharp pop!"
del_on_death = 1
+ hud_possible = list(SPECIALROLE_HUD, DIAG_STAT_HUD, DIAG_HUD)
/mob/living/simple_animal/hostile/swarmer/Login()
..()
@@ -131,6 +132,18 @@
diag_hud.add_to_hud(src)
updatename()
+/mob/living/simple_animal/hostile/swarmer/med_hud_set_health()
+ var/image/holder = hud_list[DIAG_HUD]
+ var/icon/I = icon(icon, icon_state, dir)
+ holder.pixel_y = I.Height() - world.icon_size
+ holder.icon_state = "huddiag[RoundDiagBar(health/maxHealth)]"
+
+/mob/living/simple_animal/hostile/swarmer/med_hud_set_status()
+ var/image/holder = hud_list[DIAG_STAT_HUD]
+ var/icon/I = icon(icon, icon_state, dir)
+ holder.pixel_y = I.Height() - world.icon_size
+ holder.icon_state = "hudstat"
+
/mob/living/simple_animal/hostile/swarmer/Stat()
..()
if(statpanel("Status"))
diff --git a/code/game/gamemodes/miniantags/guardian/guardian.dm b/code/game/gamemodes/miniantags/guardian/guardian.dm
index 009debb8324..cbafa85b9a1 100644
--- a/code/game/gamemodes/miniantags/guardian/guardian.dm
+++ b/code/game/gamemodes/miniantags/guardian/guardian.dm
@@ -41,6 +41,21 @@
var/adminseal = FALSE
var/name_color = "white"//only used with protector shields for the time being
+/mob/living/simple_animal/hostile/guardian/med_hud_set_health()
+ if(summoner)
+ var/image/holder = hud_list[HEALTH_HUD]
+ holder.icon_state = "hud[RoundHealth(summoner)]"
+
+/mob/living/simple_animal/hostile/guardian/med_hud_set_status()
+ if(summoner)
+ var/image/holder = hud_list[STATUS_HUD]
+ var/icon/I = icon(icon, icon_state, dir)
+ holder.pixel_y = I.Height() - world.icon_size
+ if(summoner.stat == DEAD)
+ holder.icon_state = "huddead"
+ else
+ holder.icon_state = "hudhealthy"
+
/mob/living/simple_animal/hostile/guardian/Life() //Dies if the summoner dies
..()
if(summoner)
@@ -88,7 +103,8 @@
resulthealth = round((summoner.health / summoner.maxHealth) * 100)
if(hud_used)
hud_used.guardianhealthdisplay.maptext = "
[resulthealth]%
"
-
+ med_hud_set_health()
+ med_hud_set_status()
/mob/living/simple_animal/hostile/guardian/adjustHealth(amount) //The spirit is invincible, but passes on damage to the summoner
var/damage = amount * damage_transfer
diff --git a/code/game/gamemodes/miniantags/guardian/types/healer.dm b/code/game/gamemodes/miniantags/guardian/types/healer.dm
index 0a6efb45d06..f0266dda890 100644
--- a/code/game/gamemodes/miniantags/guardian/types/healer.dm
+++ b/code/game/gamemodes/miniantags/guardian/types/healer.dm
@@ -52,6 +52,9 @@
C.adjustOxyLoss(-5)
C.adjustToxLoss(-5)
heal_cooldown = world.time + 20
+ if(C == summoner)
+ med_hud_set_health()
+ med_hud_set_status()
/mob/living/simple_animal/hostile/guardian/healer/ToggleMode()
if(loc == summoner)
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 06110242eba..017e9d1c6cb 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -2,20 +2,6 @@
var/canEnterVentWith = "/obj/item/weapon/implant=0&/obj/item/clothing/mask/facehugger=0&/obj/item/device/radio/borg=0&/obj/machinery/camera=0"
var/datum/middleClickOverride/middleClickOverride = null
-/mob/living/carbon/prepare_huds()
- ..()
- prepare_data_huds()
-
-/mob/living/carbon/proc/prepare_data_huds()
- ..()
- med_hud_set_health()
- med_hud_set_status()
-
-/mob/living/carbon/updatehealth()
- ..()
- med_hud_set_health()
- med_hud_set_status()
-
/mob/living/carbon/Destroy()
QDEL_LIST(internal_organs)
QDEL_LIST(stomach_contents)
@@ -23,7 +9,6 @@
if(B)
B.leave_host()
qdel(B)
- remove_from_all_data_huds()
return ..()
/mob/living/carbon/blob_act()
diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm
index 4de6b16a687..ac93c97f447 100644
--- a/code/modules/mob/living/carbon/carbon_defines.dm
+++ b/code/modules/mob/living/carbon/carbon_defines.dm
@@ -1,6 +1,5 @@
/mob/living/carbon
gender = MALE
- hud_possible = list(HEALTH_HUD,STATUS_HUD,SPECIALROLE_HUD)
var/list/stomach_contents = list()
var/list/internal_organs = list()
var/list/internal_organs_slot = list() //Same as above, but stores "slot ID" - "organ" pairs for easy access.
diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm
index 2221455c5a5..9056a078791 100644
--- a/code/modules/mob/living/death.dm
+++ b/code/modules/mob/living/death.dm
@@ -14,4 +14,7 @@
var/datum/soullink/S = s
S.sharerDies(gibbed, src)
+ med_hud_set_health()
+ med_hud_set_status()
+
..(gibbed)
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 8c81980eb8e..807ee0ef6cd 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -1,7 +1,22 @@
+/mob/living/New()
+ . = ..()
+ var/datum/atom_hud/data/human/medical/advanced/medhud = huds[DATA_HUD_MEDICAL_ADVANCED]
+ medhud.add_to_hud(src)
+
+/mob/living/prepare_huds()
+ ..()
+ prepare_data_huds()
+
+/mob/living/proc/prepare_data_huds()
+ ..()
+ med_hud_set_health()
+ med_hud_set_status()
+
/mob/living/Destroy()
if(ranged_ability)
ranged_ability.remove_ranged_ability(src)
+ remove_from_all_data_huds()
return ..()
/mob/living/ghostize(can_reenter_corpse = 1)
@@ -214,6 +229,7 @@
stat = CONSCIOUS
return
health = maxHealth - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss() - getCloneLoss()
+ med_hud_set_health()
//This proc is used for mobs which are affected by pressure to calculate the amount of pressure that actually
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index 5aaf02688d3..d5c1480a3b7 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -64,3 +64,4 @@
var/list/recent_tastes = list()
var/blood_volume = 0 //how much blood the mob has
+ hud_possible = list(HEALTH_HUD,STATUS_HUD,SPECIALROLE_HUD)
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 7e986f2f434..7469c2cca73 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -44,6 +44,12 @@
add_language("Galactic Common")
init_subsystems()
+/mob/living/silicon/med_hud_set_health()
+ return //we use a different hud
+
+/mob/living/silicon/med_hud_set_status()
+ return //we use a different hud
+
/mob/living/silicon/Destroy()
silicon_mob_list -= src
for(var/datum/alarm_handler/AH in alarm_handlers)
diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm
index 479f727d9e6..bbf591ee453 100644
--- a/code/modules/mob/living/simple_animal/bot/bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/bot.dm
@@ -75,6 +75,7 @@
var/control_freq = BOT_FREQ // bot control frequency
var/bot_filter // The radio filter the bot uses to identify itself on the network.
var/bot_type = 0 //The type of bot it is, for radio control.
+ var/data_hud_type = DATA_HUD_DIAGNOSTIC //The type of data HUD the bot uses. Diagnostic by default.
//This holds text for what the bot is mode doing, reported on the remote bot control interface.
var/list/mode_name = list("In Pursuit","Preparing to Arrest", "Arresting", \
"Beginning Patrol", "Patrolling", "Summoned by PDA", \
@@ -170,6 +171,13 @@
path_hud.add_to_hud(src)
path_hud.add_hud_to(src)
+
+/mob/living/simple_animal/bot/med_hud_set_health()
+ return //we use a different hud
+
+/mob/living/simple_animal/bot/med_hud_set_status()
+ return //we use a different hud
+
/mob/living/simple_animal/bot/update_canmove(delay_action_updates = 0)
. = ..()
if(!on)
diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
index 8a7ccfa37a5..3cf6e92d5f1 100644
--- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
@@ -21,6 +21,7 @@
window_id = "autoed209"
window_name = "Automatic Security Unit v2.6"
path_image_color = "#FF0000"
+ data_hud_type = DATA_HUD_SECURITY_ADVANCED
var/lastfired = 0
var/shot_delay = 3 //.3 seconds between shots
diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm
index ac48445e32c..d1fbd235efc 100644
--- a/code/modules/mob/living/simple_animal/bot/medbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/medbot.dm
@@ -20,6 +20,7 @@
window_id = "automed"
window_name = "Automatic Medical Unit v1.1"
path_image_color = "#DDDDFF"
+ data_hud_type = DATA_HUD_MEDICAL_ADVANCED
var/obj/item/weapon/reagent_containers/glass/reagent_glass = null //Can be set to draw from this for reagents.
var/skin = null //Set to "tox", "ointment" or "o2" for the other two firstaid kits.
diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm
index 2a06bb488cf..0d1cbe27cb5 100644
--- a/code/modules/mob/living/simple_animal/bot/secbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/secbot.dm
@@ -19,6 +19,7 @@
window_id = "autosec"
window_name = "Automatic Security Unit v1.6"
path_image_color = "#FF0000"
+ data_hud_type = DATA_HUD_SECURITY_ADVANCED
var/base_icon = "secbot"
var/mob/living/carbon/target
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index fc331fb74b9..951336f8d5f 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -109,6 +109,7 @@
/mob/living/simple_animal/updatehealth()
..()
health = Clamp(health, 0, maxHealth)
+ med_hud_set_status()
/mob/living/simple_animal/handle_hud_icons_health()
..()
diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi
index c56439d56f4..67875b802e8 100644
Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ