diff --git a/baystation12.dme b/baystation12.dme
index f1177f0478..aaad35c05b 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -1285,6 +1285,7 @@
#include "code\modules\mob\living\carbon\human\human_damage.dm"
#include "code\modules\mob\living\carbon\human\human_defense.dm"
#include "code\modules\mob\living\carbon\human\human_defines.dm"
+#include "code\modules\mob\living\carbon\human\human_helpers.dm"
#include "code\modules\mob\living\carbon\human\human_movement.dm"
#include "code\modules\mob\living\carbon\human\human_organs.dm"
#include "code\modules\mob\living\carbon\human\human_powers.dm"
diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm
index e99f62d2b7..4de807d876 100644
--- a/code/__defines/mobs.dm
+++ b/code/__defines/mobs.dm
@@ -114,3 +114,13 @@
#define MOB_SMALL 10
#define MOB_TINY 5
#define MOB_MINISCULE 1
+
+#define TINT_NONE 0
+#define TINT_MODERATE 1
+#define TINT_HEAVY 2
+#define TINT_BLIND 3
+
+#define FLASH_PROTECTION_REDUCED -1
+#define FLASH_PROTECTION_NONE 0
+#define FLASH_PROTECTION_MODERATE 1
+#define FLASH_PROTECTION_MAJOR 2
diff --git a/code/defines/procs/hud.dm b/code/defines/procs/hud.dm
index e5560e5ce0..ae099c64be 100644
--- a/code/defines/procs/hud.dm
+++ b/code/defines/procs/hud.dm
@@ -61,7 +61,7 @@ proc/can_process_hud(var/mob/M)
return 1
//Deletes the current HUD images so they can be refreshed with new ones.
-mob/proc/handle_regular_hud_updates() //Used in the life.dm of mobs that can use HUDs.
+mob/proc/handle_hud_glasses() //Used in the life.dm of mobs that can use HUDs.
if(client)
for(var/image/hud in client.images)
if(copytext(hud.icon_state,1,4) == "hud")
diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm
index cfbe33e5fd..52fca86df0 100644
--- a/code/game/objects/items/devices/flash.dm
+++ b/code/game/objects/items/devices/flash.dm
@@ -65,8 +65,9 @@
if(iscarbon(M))
if(M.stat!=DEAD)
- var/safety = M:eyecheck()
- if(safety <= 0)
+ var/mob/living/carbon/C = M
+ var/safety = C.eyecheck()
+ if(safety < FLASH_PROTECTION_MODERATE)
var/flash_strength = 10
if(ishuman(M))
var/mob/living/carbon/human/H = M
@@ -150,8 +151,8 @@
for(var/obj/item/weapon/cloaking_device/S in M)
S.active = 0
S.icon_state = "shield0"
- var/safety = M:eyecheck()
- if(!safety)
+ var/safety = M.eyecheck()
+ if(safety < FLASH_PROTECTION_MODERATE)
if(!M.blinded)
flick("flash", M.flash)
@@ -170,7 +171,7 @@
if(istype(loc, /mob/living/carbon))
var/mob/living/carbon/M = loc
var/safety = M.eyecheck()
- if(safety <= 0)
+ if(safety < FLASH_PROTECTION_MODERATE)
M.Weaken(10)
flick("e_flash", M.flash)
for(var/mob/O in viewers(M, null))
diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm
index d01b380925..387ca7ed9b 100644
--- a/code/game/objects/items/weapons/grenades/flashbang.dm
+++ b/code/game/objects/items/weapons/grenades/flashbang.dm
@@ -49,7 +49,7 @@
ear_safety += 1
//Flashing everyone
- if(eye_safety < 1)
+ if(eye_safety < FLASH_PROTECTION_MODERATE)
flick("e_flash", M.flash)
M.Stun(2)
M.Weaken(10)
diff --git a/code/game/objects/items/weapons/grenades/spawnergrenade.dm b/code/game/objects/items/weapons/grenades/spawnergrenade.dm
index 9677a73345..60f5b7a56f 100644
--- a/code/game/objects/items/weapons/grenades/spawnergrenade.dm
+++ b/code/game/objects/items/weapons/grenades/spawnergrenade.dm
@@ -16,7 +16,7 @@
var/turf/T = get_turf(src)
playsound(T, 'sound/effects/phasein.ogg', 100, 1)
for(var/mob/living/carbon/human/M in viewers(T, null))
- if(M:eyecheck() <= 0)
+ if(M.eyecheck() < FLASH_PROTECTION_MODERATE)
flick("e_flash", M.flash)
for(var/i=1, i<=deliveryamt, i++)
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index 282e7bece6..b5d84c1219 100644
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -337,18 +337,18 @@
if(!E)
return
switch(safety)
- if(1)
+ if(FLASH_PROTECTION_MODERATE)
usr << "Your eyes sting a little."
E.damage += rand(1, 2)
if(E.damage > 12)
user.eye_blurry += rand(3,6)
- if(0)
+ if(FLASH_PROTECTION_NONE)
usr << "Your eyes burn."
E.damage += rand(2, 4)
if(E.damage > 10)
E.damage += rand(4,10)
- if(-1)
- usr << "Your thermals intensify the welder's glow. Your eyes itch and burn severely."
+ if(FLASH_PROTECTION_REDUCED)
+ usr << "Your equipment intensify the welder's glow. Your eyes itch and burn severely."
user.eye_blurry += rand(12,20)
E.damage += rand(12, 16)
if(safety<2)
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index a88ba411c2..894d2cb0a7 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -1,7 +1,9 @@
/obj/item/clothing
name = "clothing"
siemens_coefficient = 0.9
- var/list/species_restricted = null //Only these species can wear this kit.
+ var/flash_protection = FLASH_PROTECTION_NONE // Sets the item's level of flash protection.
+ var/tint = TINT_NONE // Sets the item's level of visual impairment tint.
+ var/list/species_restricted = null //Only these species can wear this kit.
/*
Sprites used when the clothing item is refit. This is done by setting icon_override.
diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm
index c5fadf4463..ffc504cd16 100644
--- a/code/modules/clothing/glasses/glasses.dm
+++ b/code/modules/clothing/glasses/glasses.dm
@@ -12,6 +12,7 @@
var/active = 1
var/activation_sound = 'sound/items/goggles_charge.ogg'
var/obj/screen/overlay = null
+ var/obj/item/clothing/glasses/hud/hud = null // Hud glasses, if any
/obj/item/clothing/glasses/attack_self(mob/user)
if(toggleable)
@@ -19,6 +20,8 @@
active = 0
icon_state = off_state
user.update_inv_glasses()
+ flash_protection = FLASH_PROTECTION_NONE
+ tint = TINT_NONE
usr << "You deactivate the optical matrix on the [src]."
else
active = 1
@@ -26,6 +29,8 @@
user.update_inv_glasses()
if(activation_sound)
usr << activation_sound
+ flash_protection = initial(flash_protection)
+ tint = initial(tint)
usr << "You activate the optical matrix on the [src]."
user.update_action_buttons()
@@ -104,7 +109,7 @@
item_state = "glasses"
prescription = 1
body_parts_covered = 0
-
+
/obj/item/clothing/glasses/regular/scanners
name = "Scanning Goggles"
desc = "A very oddly shaped pair of goggles with bits of wire poking out the sides. A soft humming sound emanates from it."
@@ -136,6 +141,7 @@
icon_state = "sun"
item_state = "sunglasses"
darkness_view = -1
+ flash_protection = FLASH_PROTECTION_MODERATE
/obj/item/clothing/glasses/welding
name = "welding goggles"
@@ -144,6 +150,8 @@
item_state = "welding-g"
action_button_name = "Flip Welding Goggles"
var/up = 0
+ flash_protection = FLASH_PROTECTION_MAJOR
+ tint = TINT_HEAVY
/obj/item/clothing/glasses/welding/attack_self()
toggle()
@@ -160,12 +168,16 @@
flags_inv |= HIDEEYES
body_parts_covered |= EYES
icon_state = initial(icon_state)
+ flash_protection = initial(flash_protection)
+ tint = initial(tint)
usr << "You flip \the [src] down to protect your eyes."
else
src.up = !src.up
flags_inv &= ~HIDEEYES
body_parts_covered &= ~EYES
icon_state = "[initial(icon_state)]up"
+ flash_protection = FLASH_PROTECTION_NONE
+ tint = TINT_NONE
usr << "You push \the [src] up out of your face."
update_clothing_icon()
usr.update_action_buttons()
@@ -175,13 +187,14 @@
desc = "Welding goggles made from more expensive materials, strangely smells like potatoes."
icon_state = "rwelding-g"
item_state = "rwelding-g"
+ tint = TINT_MODERATE
/obj/item/clothing/glasses/sunglasses/blindfold
name = "blindfold"
desc = "Covers the eyes, preventing sight."
icon_state = "blindfold"
item_state = "blindfold"
- //vision_flags = BLIND // This flag is only supposed to be used if it causes permanent blindness, not temporary because of glasses
+ tint = TINT_BLIND
/obj/item/clothing/glasses/sunglasses/prescription
name = "prescription sunglasses"
@@ -196,7 +209,6 @@
name = "HUDSunglasses"
desc = "Sunglasses with a HUD."
icon_state = "sunhud"
- var/obj/item/clothing/glasses/hud/security/hud = null
New()
..()
@@ -216,6 +228,8 @@
origin_tech = list(TECH_MAGNET = 3)
toggleable = 1
vision_flags = SEE_MOBS
+ see_invisible = SEE_INVISIBLE_NOLIGHTING
+ flash_protection = FLASH_PROTECTION_REDUCED
emp_act(severity)
if(istype(src.loc, /mob/living/carbon/human))
diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm
index 94e8cd2949..de6972ac01 100644
--- a/code/modules/clothing/glasses/hud.dm
+++ b/code/modules/clothing/glasses/hud.dm
@@ -5,10 +5,12 @@
origin_tech = list(TECH_MAGNET = 3, TECH_BIO = 2)
var/list/icon/current = list() //the current hud icons
- proc
- process_hud(var/mob/M) return
-
+/obj/item/clothing/glasses/proc/process_hud(var/mob/M)
+ if(hud)
+ hud.process_hud(M)
+/obj/item/clothing/glasses/hud/process_hud(var/mob/M)
+ return
/obj/item/clothing/glasses/hud/health
name = "Health Scanner HUD"
diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm
index 42e830c4e4..fa7bbae559 100644
--- a/code/modules/clothing/head/misc_special.dm
+++ b/code/modules/clothing/head/misc_special.dm
@@ -28,6 +28,8 @@
siemens_coefficient = 0.9
w_class = 3
var/base_state
+ flash_protection = FLASH_PROTECTION_MAJOR
+ tint = TINT_HEAVY
/obj/item/clothing/head/welding/attack_self()
if(!base_state)
@@ -45,11 +47,15 @@
src.up = !src.up
body_parts_covered |= (EYES|FACE)
flags_inv |= (HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE)
+ flash_protection = initial(flash_protection)
+ tint = initial(tint)
icon_state = base_state
usr << "You flip the [src] down to protect your eyes."
else
src.up = !src.up
body_parts_covered &= ~(EYES|FACE)
+ flash_protection = FLASH_PROTECTION_NONE
+ tint = TINT_NONE
flags_inv &= ~(HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE)
icon_state = "[base_state]up"
usr << "You push the [src] up out of your face."
diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm
index ce8f89dc56..b011dd14bc 100644
--- a/code/modules/clothing/spacesuits/miscellaneous.dm
+++ b/code/modules/clothing/spacesuits/miscellaneous.dm
@@ -100,7 +100,7 @@
icon_state = "emergencyhelm"
item_state = "emergencyhelm"
desc = "A simple helmet with a built in light, smells like mothballs."
-
+ flash_protection = FLASH_PROTECTION_NONE
/obj/item/clothing/suit/space/emergency
name = "Emergency Softsuit"
diff --git a/code/modules/clothing/spacesuits/rig/suits/light.dm b/code/modules/clothing/spacesuits/rig/suits/light.dm
index cf941f678e..bc5c15fbb0 100644
--- a/code/modules/clothing/spacesuits/rig/suits/light.dm
+++ b/code/modules/clothing/spacesuits/rig/suits/light.dm
@@ -40,7 +40,7 @@
airtight = 0
seal_delay = 5 //not being vaccum-proof has an upside I guess
-
+
helm_type = /obj/item/clothing/head/lightrig/hacker
chest_type = /obj/item/clothing/suit/lightrig/hacker
glove_type = /obj/item/clothing/gloves/lightrig/hacker
diff --git a/code/modules/clothing/spacesuits/spacesuits.dm b/code/modules/clothing/spacesuits/spacesuits.dm
index 1f6ec964f4..677063d92e 100644
--- a/code/modules/clothing/spacesuits/spacesuits.dm
+++ b/code/modules/clothing/spacesuits/spacesuits.dm
@@ -20,6 +20,7 @@
min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECTION_TEMPERATURE
siemens_coefficient = 0.9
species_restricted = list("exclude","Diona", "Xenomorph")
+ flash_protection = FLASH_PROTECTION_MAJOR
var/obj/machinery/camera/camera
var/list/camera_networks
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index e5db1f07de..11ae140777 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -654,38 +654,17 @@
///eyecheck()
///Returns a number between -1 to 2
/mob/living/carbon/human/eyecheck()
- var/number = 0
-
if(!species.has_organ["eyes"]) //No eyes, can't hurt them.
- return 2
+ return FLASH_PROTECTION_MAJOR
if(internal_organs_by_name["eyes"]) // Eyes are fucked, not a 'weak point'.
var/obj/item/organ/I = internal_organs_by_name["eyes"]
if(I.status & ORGAN_CUT_AWAY)
- return 2
+ return FLASH_PROTECTION_MAJOR
else
- return 2
+ return
- if(istype(src.head, /obj/item/clothing/head/welding))
- if(!src.head:up)
- number += 2
- if(istype(back, /obj/item/weapon/rig))
- var/obj/item/weapon/rig/O = back
- if(O.helmet && O.helmet == head && (O.helmet.body_parts_covered & EYES))
- number += 2
- if(istype(src.head, /obj/item/clothing/head/helmet/space))
- number += 2
- if(istype(src.head, /obj/item/clothing/head/helmet/space/emergency))
- number -= 2
- if(istype(src.glasses, /obj/item/clothing/glasses/thermal))
- number -= 1
- if(istype(src.glasses, /obj/item/clothing/glasses/sunglasses))
- number += 1
- if(istype(src.glasses, /obj/item/clothing/glasses/welding))
- var/obj/item/clothing/glasses/welding/W = src.glasses
- if(!W.up)
- number += 2
- return number
+ return flash_protection
//Used by various things that knock people out by applying blunt trauma to the head.
//Checks that the species has a "head" (brain containing organ) and that hit_zone refers to it.
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index 36630f2382..a9abd26ec0 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -84,3 +84,11 @@
mob_bump_flag = HUMAN
mob_push_flags = ~HEAVY
mob_swap_flags = ~HEAVY
+
+ var/flash_protection = 0 // Total level of flash protection
+ var/equipment_tint_total = 0 // Total level of visualy impairing items
+ var/equipment_darkness_modifier // Darkvision modifier from equipped items
+ var/equipment_vision_flags // Extra vision flags from equipped items
+ var/equipment_see_invis // Max see invibility level granted by equipped items
+ var/equipment_prescription // Eye prescription granted by equipped items
+ var/list/equipment_overlays = list() // Extra overlays from equipped items
diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm
new file mode 100644
index 0000000000..9a58e5eb42
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/human_helpers.dm
@@ -0,0 +1,45 @@
+#define add_clothing_protection(A) \
+ var/obj/item/clothing/C = A; \
+ flash_protection += C.flash_protection; \
+ equipment_tint_total += C.tint;
+
+/mob/living/carbon/human/proc/update_equipment_vision()
+ flash_protection = 0
+ equipment_tint_total = 0
+ equipment_see_invis = 0
+ equipment_vision_flags = 0
+ equipment_prescription = 0
+ equipment_darkness_modifier = 0
+ equipment_overlays.Cut()
+
+ if(istype(src.head, /obj/item/clothing/head))
+ add_clothing_protection(head)
+ if(istype(src.glasses, /obj/item/clothing/glasses))
+ process_glasses(glasses)
+ if(istype(src.wear_mask, /obj/item/clothing/mask))
+ add_clothing_protection(head)
+ if(istype(back,/obj/item/weapon/rig))
+ process_rig(back)
+
+/mob/living/carbon/human/proc/process_glasses(var/obj/item/clothing/glasses/G)
+ if(G && G.active)
+ equipment_darkness_modifier += G.darkness_view
+ equipment_vision_flags |= G.vision_flags
+ equipment_prescription = equipment_prescription || G.prescription
+ if(G.overlay)
+ equipment_overlays |= G.overlay
+ if(G.see_invisible >= 0)
+ if(equipment_see_invis)
+ equipment_see_invis = min(equipment_see_invis, G.see_invisible)
+ else
+ equipment_see_invis = G.see_invisible
+
+ add_clothing_protection(G)
+ G.process_hud(src)
+
+/mob/living/carbon/human/proc/process_rig(var/obj/item/weapon/rig/O)
+ if(O.helmet && O.helmet == head && (O.helmet.body_parts_covered & EYES))
+ if((O.offline && O.offline_vision_restriction == 2) || (!O.offline && O.vision_restriction == 2))
+ equipment_tint_total += TINT_BLIND
+ if(O.visor && O.visor.active && O.visor.vision && O.visor.vision.glasses && (!O.helmet || (head && O.helmet == head)))
+ process_glasses(O.visor.vision.glasses)
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index ed0fbeea5c..aded2b59bb 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -41,11 +41,6 @@
if (transforming)
return
- //Apparently, the person who wrote this code designed it so that
- //blinded get reset each cycle and then get activated later in the
- //code. Very ugly. I dont care. Moving this stuff here so its easy
- //to find it.
- blinded = null
fire_alert = 0 //Reset this here, because both breathe() and handle_environment() have a chance to set it.
//TODO: seperate this out
@@ -153,6 +148,26 @@
return ONE_ATMOSPHERE + pressure_difference
/mob/living/carbon/human/handle_disabilities()
+ ..()
+ //Vision
+ var/obj/item/organ/vision
+ if(species.vision_organ)
+ vision = internal_organs_by_name[species.vision_organ]
+
+ if(!vision) // Presumably if a species has no vision organs, they see via some other means.
+ eye_blind = 0
+ blinded = 0
+ eye_blurry = 0
+ else if(vision.is_broken()) // Vision organs cut out or broken? Permablind.
+ eye_blind = 1
+ blinded = 1
+ eye_blurry = 1
+ else
+ //blindness
+ if(!(sdisabilities & BLIND))
+ if(equipment_tint_total >= TINT_BLIND) // Covered eyes, heal faster
+ eye_blurry = max(eye_blurry-2, 0)
+
if (disabilities & EPILEPSY)
if ((prob(1) && paralysis < 1))
src << "\red You have a seizure!"
@@ -202,7 +217,7 @@
emote("drool")
*/
- if(stat != 2)
+ if(stat != DEAD)
var/rn = rand(0, 200)
if(getBrainLoss() >= 5)
if(0 <= rn && rn <= 3)
@@ -995,49 +1010,12 @@
if(!E.len)
embedded_flag = 0
- //Eyes
- //Check rig first because it's two-check and other checks will override it.
- if(istype(back,/obj/item/weapon/rig))
- var/obj/item/weapon/rig/O = back
- if(O.helmet && O.helmet == head && (O.helmet.body_parts_covered & EYES))
- if((O.offline && O.offline_vision_restriction == 2) || (!O.offline && O.vision_restriction == 2))
- blinded = 1
-
// Check everything else.
//Periodically double-check embedded_flag
if(embedded_flag && !(life_tick % 10))
if(!embedded_needs_process())
embedded_flag = 0
- //Vision
- var/obj/item/organ/vision
- if(species.vision_organ)
- vision = internal_organs_by_name[species.vision_organ]
-
- if(!vision) // Presumably if a species has no vision organs, they see via some other means.
- eye_blind = 0
- blinded = 0
- eye_blurry = 0
- else if(vision.is_broken()) // Vision organs cut out or broken? Permablind.
- eye_blind = 1
- blinded = 1
- eye_blurry = 1
- else
- //blindness
- if(sdisabilities & BLIND) // Disabled-blind, doesn't get better on its own
- blinded = 1
- else if(eye_blind) // Blindness, heals slowly over time
- eye_blind = max(eye_blind-1,0)
- blinded = 1
- else if(istype(glasses, /obj/item/clothing/glasses/sunglasses/blindfold)) //resting your eyes with a blindfold heals blurry eyes faster
- eye_blurry = max(eye_blurry-3, 0)
- blinded = 1
-
- //blurry sight
- if(vision.is_bruised()) // Vision organs impaired? Permablurry.
- eye_blurry = 1
- if(eye_blurry) // Blurry eyes heal slowly
- eye_blurry = max(eye_blurry-1, 0)
//Ears
if(sdisabilities & DEAF) //disabled-deaf, doesn't get better on its own
@@ -1111,14 +1089,8 @@
// now handle what we see on our screen
- if(!client)
- return 0
-
- 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, global_hud.thermal, global_hud.meson, global_hud.science)
+ if(!..())
+ return
if(damageoverlay.overlays)
damageoverlay.overlays = list()
@@ -1190,60 +1162,6 @@
I = overlays_cache[23]
damageoverlay.overlays += I
- if( stat == DEAD )
- sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS|SEE_SELF
- see_in_dark = 8
- if(!druggy) see_invisible = SEE_INVISIBLE_LEVEL_TWO
- if(healths) healths.icon_state = "health7" //DEAD healthmeter
- if(client)
- if(client.view != world.view) // If mob dies while zoomed in with device, unzoom them.
- for(var/obj/item/item in contents)
- if(item.zoom)
- item.zoom()
- break
-
- else
- sight &= ~(SEE_TURFS|SEE_MOBS|SEE_OBJS)
- see_invisible = see_in_dark>2 ? SEE_INVISIBLE_LEVEL_ONE : SEE_INVISIBLE_LIVING
-
- if(XRAY in mutations)
- sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS
- see_in_dark = 8
- if(!druggy) see_invisible = SEE_INVISIBLE_LEVEL_TWO
-
- if(seer==1)
- var/obj/effect/rune/R = locate() in loc
- if(R && R.word1 == cultwords["see"] && R.word2 == cultwords["hell"] && R.word3 == cultwords["join"])
- see_invisible = SEE_INVISIBLE_CULT
- else
- see_invisible = SEE_INVISIBLE_LIVING
- seer = 0
-
- else
- sight = species.get_vision_flags(src)
- see_in_dark = species.darksight
- see_invisible = see_in_dark>2 ? SEE_INVISIBLE_LEVEL_ONE : SEE_INVISIBLE_LIVING
- var/tmp/glasses_processed = 0
- var/obj/item/weapon/rig/rig = back
- if(istype(rig) && rig.visor)
- if(!rig.helmet || (head && rig.helmet == head))
- if(rig.visor && rig.visor.vision && rig.visor.active && rig.visor.vision.glasses)
- glasses_processed = 1
- process_glasses(rig.visor.vision.glasses)
-
- if(glasses && !glasses_processed)
- glasses_processed = 1
- process_glasses(glasses)
- if(XRAY in mutations)
- sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS
- see_in_dark = 8
- if(!druggy) see_invisible = SEE_INVISIBLE_LEVEL_TWO
-
- if(!glasses_processed && (species.get_vision_flags(src) > 0))
- sight |= species.get_vision_flags(src)
- if(!seer && !glasses_processed)
- see_invisible = SEE_INVISIBLE_LIVING
-
if(healths)
if (analgesic > 100)
healths.icon_state = "health_health_numb"
@@ -1262,8 +1180,6 @@
if(0 to 20) healths.icon_state = "health5"
else healths.icon_state = "health6"
- if(!seer)
- see_invisible = SEE_INVISIBLE_LIVING
if(nutrition_icon)
switch(nutrition)
if(450 to INFINITY) nutrition_icon.icon_state = "nutrition0"
@@ -1329,85 +1245,8 @@
bodytemp.icon_state = "temp-1"
else
bodytemp.icon_state = "temp0"
- if(blind)
- if(blinded) blind.layer = 18
- else blind.layer = 0
-
- if(disabilities & NEARSIGHTED) //this looks meh but saves a lot of memory by not requiring to add var/prescription
- if(glasses) //to every /obj/item
- var/obj/item/clothing/glasses/G = glasses
- if(!G.prescription)
- client.screen += global_hud.vimpaired
- else
- client.screen += global_hud.vimpaired
-
- if(eye_blurry) client.screen += global_hud.blurry
- if(druggy) client.screen += global_hud.druggy
-
- if(config.welder_vision)
- var/found_welder
- if(species.short_sighted)
- found_welder = 1
- else
- if(istype(glasses, /obj/item/clothing/glasses/welding))
- var/obj/item/clothing/glasses/welding/O = glasses
- if(!O.up)
- found_welder = 1
- if(!found_welder && istype(head, /obj/item/clothing/head/welding))
- var/obj/item/clothing/head/welding/O = head
- if(!O.up)
- found_welder = 1
- if(!found_welder && istype(back, /obj/item/weapon/rig))
- var/obj/item/weapon/rig/O = back
- if(O.helmet && O.helmet == head && (O.helmet.body_parts_covered & EYES))
- if((O.offline && O.offline_vision_restriction == 1) || (!O.offline && O.vision_restriction == 1))
- found_welder = 1
- if(found_welder)
- client.screen |= global_hud.darkMask
-
- if(machine)
- var/viewflags = machine.check_eye(src)
- if(viewflags < 0)
- reset_view(null, 0)
- else if(viewflags)
- sight |= viewflags
- else if(eyeobj)
- if(eyeobj.owner != src)
-
- reset_view(null)
- else
- var/isRemoteObserve = 0
- if((mRemote in mutations) && remoteview_target)
- if(remoteview_target.stat==CONSCIOUS)
- isRemoteObserve = 1
- if(!isRemoteObserve && client && !client.adminobs)
- remoteview_target = null
- reset_view(null, 0)
return 1
-/mob/living/carbon/human/proc/process_glasses(var/obj/item/clothing/glasses/G)
- if(G && G.active)
- see_in_dark += G.darkness_view
- if(G.overlay)
- client.screen |= G.overlay
- if(G.vision_flags)
- sight |= G.vision_flags
- if(!druggy && !seer)
- see_invisible = SEE_INVISIBLE_MINIMUM
- if(G.see_invisible >= 0)
- see_invisible = G.see_invisible
- if(istype(G,/obj/item/clothing/glasses/night) && !seer)
- see_invisible = SEE_INVISIBLE_MINIMUM
-/* HUD shit goes here, as long as it doesn't modify sight flags */
-// The purpose of this is to stop xray and w/e from preventing you from using huds -- Love, Doohl
- var/obj/item/clothing/glasses/hud/O = G
- if(istype(G, /obj/item/clothing/glasses/sunglasses/sechud))
- var/obj/item/clothing/glasses/sunglasses/sechud/S = G
- O = S.hud
- if(istype(O))
- O.process_hud(src)
- if(!druggy && !seer) see_invisible = SEE_INVISIBLE_LIVING
-
/mob/living/carbon/human/handle_random_events()
if(in_stasis)
return
@@ -1724,5 +1563,37 @@
restore_blood()
..()
+/mob/living/carbon/human/handle_vision()
+ if(client)
+ client.screen.Remove(global_hud.blurry, global_hud.druggy, global_hud.vimpaired, global_hud.darkMask, global_hud.nvg, global_hud.thermal, global_hud.meson, global_hud.science)
+ if(machine)
+ var/viewflags = machine.check_eye(src)
+ if(viewflags < 0)
+ reset_view(null, 0)
+ else if(viewflags)
+ sight |= viewflags
+ else if(eyeobj)
+ if(eyeobj.owner != src)
+
+ reset_view(null)
+ else
+ var/isRemoteObserve = 0
+ if((mRemote in mutations) && remoteview_target)
+ if(remoteview_target.stat==CONSCIOUS)
+ isRemoteObserve = 1
+ if(!isRemoteObserve && client && !client.adminobs)
+ remoteview_target = null
+ reset_view(null, 0)
+
+ update_equipment_vision()
+ species.handle_vision(src)
+
+/mob/living/carbon/human/update_sight()
+ ..()
+ if(stat == DEAD)
+ return
+ if(XRAY in mutations)
+ sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS
+
#undef HUMAN_MAX_OXYLOSS
#undef HUMAN_CRIT_MAX_OXYLOSS
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index 662d06479b..71d4e2b7d1 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -334,3 +334,42 @@
/datum/species/proc/get_vision_flags(var/mob/living/carbon/human/H)
return vision_flags
+
+/datum/species/proc/handle_vision(var/mob/living/carbon/human/H)
+ H.update_sight()
+ H.sight |= get_vision_flags(H)
+ H.sight |= H.equipment_vision_flags
+
+ if(H.stat == DEAD)
+ return 1
+
+ if(!H.druggy)
+ H.see_in_dark = (H.sight == SEE_TURFS|SEE_MOBS|SEE_OBJS) ? 8 : min(darksight + H.equipment_darkness_modifier, 8)
+ if(H.seer)
+ var/obj/effect/rune/R = locate() in H.loc
+ if(R && R.word1 == cultwords["see"] && R.word2 == cultwords["hell"] && R.word3 == cultwords["join"])
+ H.see_invisible = SEE_INVISIBLE_CULT
+ if(H.see_invisible != SEE_INVISIBLE_CULT && H.equipment_see_invis)
+ H.see_invisible = min(H.see_invisible, H.equipment_see_invis)
+
+ if(H.equipment_tint_total >= TINT_BLIND)
+ H.eye_blind = max(H.eye_blind, 1)
+
+ if(H.blind)
+ H.blind.layer = (H.eye_blind ? 18 : 0)
+
+ if(!H.client)//no client, no screen to update
+ return 1
+
+ if(config.welder_vision)
+ if(short_sighted || (H.equipment_tint_total >= TINT_HEAVY))
+ H.client.screen += global_hud.darkMask
+ else if((!H.equipment_prescription && (H.disabilities & NEARSIGHTED)) || H.equipment_tint_total == TINT_MODERATE)
+ H.client.screen += global_hud.vimpaired
+ if(H.eye_blurry) H.client.screen += global_hud.blurry
+ if(H.druggy) H.client.screen += global_hud.druggy
+
+ for(var/overlay in H.equipment_overlays)
+ H.client.screen |= overlay
+
+ return 1
diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm
index 5e7a6e2d90..0815dac436 100644
--- a/code/modules/mob/living/life.dm
+++ b/code/modules/mob/living/life.dm
@@ -126,24 +126,60 @@
adjustEarDamage(-0.05,-1)
//this handles hud updates. Calls update_vision() and handle_hud_icons()
-/mob/living/handle_regular_hud_updates()
- if(!client)
- return 0
- ..()
+/mob/living/proc/handle_regular_hud_updates()
+ if(!client) return 0
- handle_vision()
handle_hud_icons()
+ handle_vision()
return 1
/mob/living/proc/handle_vision()
- return
+ client.screen.Remove(global_hud.blurry, global_hud.druggy, global_hud.vimpaired, global_hud.darkMask, global_hud.nvg, global_hud.thermal, global_hud.meson, global_hud.science)
+
+ update_sight()
+
+ if(stat == DEAD)
+ return
+
+ if(blind)
+ if(eye_blind)
+ blind.layer = 18
+ else
+ blind.layer = 0
+ if (disabilities & NEARSIGHTED)
+ client.screen += global_hud.vimpaired
+ if (eye_blurry)
+ client.screen += global_hud.blurry
+ if (druggy)
+ client.screen += global_hud.druggy
+ if(machine)
+ var/viewflags = machine.check_eye(src)
+ if(viewflags < 0)
+ reset_view(null, 0)
+ else if(viewflags)
+ sight |= viewflags
+ else if(eyeobj && eyeobj.owner != src)
+ reset_view(null)
+ else
+ if(!client.adminobs)
+ reset_view(null)
/mob/living/proc/update_sight()
- return
+ if(stat == DEAD)
+ sight |= SEE_TURFS
+ sight |= SEE_MOBS
+ sight |= SEE_OBJS
+ see_in_dark = 8
+ see_invisible = SEE_INVISIBLE_LEVEL_TWO
+ else
+ sight &= ~(SEE_TURFS|SEE_MOBS|SEE_OBJS)
+ see_in_dark = 2
+ see_invisible = SEE_INVISIBLE_LIVING
/mob/living/proc/handle_hud_icons()
handle_hud_icons_health()
+ handle_hud_glasses()
return
/mob/living/proc/handle_hud_icons_health()
diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm
index 063acf750b..b7a22b560f 100644
--- a/code/modules/projectiles/projectile/energy.dm
+++ b/code/modules/projectiles/projectile/energy.dm
@@ -22,13 +22,13 @@
//blind adjacent people
for (var/mob/living/carbon/M in viewers(T, flash_range))
- if(M.eyecheck() < 1)
+ if(M.eyecheck() < FLASH_PROTECTION_MODERATE)
flick("e_flash", M.flash)
//snap pop
playsound(src, 'sound/effects/snap.ogg', 50, 1)
src.visible_message("\The [src] explodes in a bright flash!")
-
+
new /obj/effect/decal/cleanable/ash(src.loc) //always use src.loc so that ash doesn't end up inside windows
new /obj/effect/effect/sparks(T)
new /obj/effect/effect/smoke/illumination(T, brightness=max(flash_range*2, brightness), lifetime=light_duration)
diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm
index d10c09ecb1..538bb67d86 100644
--- a/code/modules/reagents/Chemistry-Recipes.dm
+++ b/code/modules/reagents/Chemistry-Recipes.dm
@@ -1080,7 +1080,7 @@
var/list/borks = typesof(/obj/item/weapon/reagent_containers/food/snacks) - /obj/item/weapon/reagent_containers/food/snacks
playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null))
- if(M.eyecheck() <= 0)
+ if(M.eyecheck() < FLASH_PROTECTION_MODERATE)
flick("e_flash", M.flash)
for(var/i = 1, i <= 4 + rand(1,2), i++)