Implements (a poor imitation of) speculars, improves/fixes unrestricted access overlay lights (#92272)

## About The Pull Request

Implements a poor imitation of specular surfaces by encoding "shinyness"
into blue channel of emissive overlays, which allows some pixels to be
more illuminated than others (by applying lighting multiplied by
specular mask onto them a second time)
This means that hazard vests, engineering coats, security jackets and
firefighter suits no longer outright glow in the dark, but instead
amplify light so even the tiniest amounts make them highly visible. I
made a pass through all of our emissive overlays and converted ones that
made sense into bloom-less/specular ones.

https://github.com/user-attachments/assets/2167e26e-f8b8-42d7-a67c-dfc643e1df29

I've also converted unrestricted access airlock overlays into overlay
lights instead of ABOVE_LIGHTING overlays, so they should no longer look
jank or catch people's clicks.

<img width="297" height="262" alt="dreamseeker_LovPHZ7xHQ"
src="https://github.com/user-attachments/assets/1bf4d7b8-219a-41ed-aee9-6cdc41803e21"
/>

Turns out that windoors had incorrect icon states assigned to theirs, so
I fixed that too - they should show up again after god knows how many
years.

## Why It's Good For The Game

~~Shiny lights make my moth brain go happy~~
Neat visual effects that look more believable than neon glowing stripes,
and airlocks no longer have inflated hitboxes with extremely weird
visuals.

## Changelog
🆑
add: Added specular overlays - some items like hazard vests or
firefighter suits no longer outright glow in the dark, but instead
amplify existing light to shine brighter than their surroundings.
add: Redid unrestricted access airlock overlays to look less bad
fix: Fixed unrestricted access overlays not showing up on windoors.
/🆑

(cherry picked from commit 3d730689f4)
This commit is contained in:
SmArtKar
2025-08-07 01:27:43 +02:00
committed by nevimer
parent 67888db8ba
commit 53f198a61d
20 changed files with 121 additions and 42 deletions

View File

@@ -60,9 +60,11 @@
#define EMISSIVE_WALL_LAYER 4
#define RENDER_PLANE_EMISSIVE_BLOOM_MASK 15
#define EMISSIVE_BLOOM_MASK_TARGET "*RENDER_PLANE_EMISSIVE_BLOOM_MASK"
#define EMISSIVE_BLOOM_MASK_RENDER_TARGET "*RENDER_PLANE_EMISSIVE_BLOOM_MASK"
#define RENDER_PLANE_EMISSIVE_BLOOM 16
#define RENDER_PLANE_SPECULAR_MASK 17
#define SPECULAR_MASK_RENDER_TARGET "*RENDER_PLANE_SPECULAR_MASK"
//-------------------- Lighting ---------------------
@@ -77,23 +79,27 @@
#define RENDER_PLANE_LIGHT_MASK 21
#define LIGHT_MASK_RENDER_TARGET "*RENDER_PLANE_LIGHT_MASK"
///Things that should render ignoring lighting
#define ABOVE_LIGHTING_PLANE 22
/// We cannot render speculars to ABOVE_LIGHTING, as then they give it alpha and end up masking things in darkness
/// So we need to render it directly to RENDER_PLANE_GAME above RENDER_PLANE_LIGHTING
#define RENDER_PLANE_SPECULAR 22
#define WEATHER_GLOW_PLANE 23
/// Things that should render ignoring lighting
#define ABOVE_LIGHTING_PLANE 23
#define WEATHER_GLOW_PLANE 24
///---------------- MISC -----------------------
///Pipecrawling images
#define PIPECRAWL_IMAGES_PLANE 24
#define PIPECRAWL_IMAGES_PLANE 25
///AI Camera Static
#define CAMERA_STATIC_PLANE 25
#define CAMERA_STATIC_PLANE 26
///Anything that wants to be part of the game plane, but also wants to draw above literally everything else
#define HIGH_GAME_PLANE 26
#define HIGH_GAME_PLANE 27
#define FULLSCREEN_PLANE 27
#define FULLSCREEN_PLANE 28
///--------------- FULLSCREEN RUNECHAT BUBBLES ------------

View File

@@ -80,12 +80,29 @@
#define _EMISSIVE_COLOR(val) list(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, val,0,0,0)
#define _EMISSIVE_COLOR_NO_BLOOM(val) list(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,val,0,0)
#define _SPECULAR_COLOR(val) list(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,val,0)
/// The color matrix applied to all emissive overlays. Should be solely dependent on alpha and not have RGB overlap with [EM_BLOCK_COLOR].
#define EMISSIVE_COLOR _EMISSIVE_COLOR(1)
#define EMISSIVE_COLOR_NO_BLOOM _EMISSIVE_COLOR_NO_BLOOM(1)
#define SPECULAR_COLOR _SPECULAR_COLOR(1)
/// A globally cached version of [EMISSIVE_COLOR] for quick access.
GLOBAL_LIST_INIT(emissive_color, EMISSIVE_COLOR)
GLOBAL_LIST_INIT(emissive_color_no_bloom, EMISSIVE_COLOR_NO_BLOOM)
GLOBAL_LIST_INIT(specular_color, SPECULAR_COLOR)
// Types of emissives
/// Emissive that will not have bloom applied to it, encoded into the green channel
#define EMISSIVE_NO_BLOOM 0
/// Emissive that will get bloom applied to it, encoded into the red channel
#define EMISSIVE_BLOOM 1
/// Mimics a highly reflective surface, will not have any glow by itself but will amplify any lighting applied to it, encoded into the blue channel
#define EMISSIVE_SPECULAR 2
/// Light cutoff of specular emissives, controls how sharp a light must be before it starts reflecting
#define SPECULAR_EMISSIVE_CUTOFF 0.3
/// Controls how bright specular emissives sourced from overlay lights are
/// Keep in mind that overlay lights are also affected by the specular cutoff, so the maximum light value achievable is (contrast - cutoff)
#define SPECULAR_EMISSIVE_OVERLAY_CONTRAST 1.4
#define _EM_BLOCK_COLOR(val) list(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,val, 0,0,0,0)
/// The color matrix applied to all emissive blockers. Should be solely dependent on alpha and not have RGB overlap with [EMISSIVE_COLOR].

View File

@@ -1,25 +1,30 @@
#define TOPDOWN_TO_EMISSIVE_LAYER(layer) LERP(FLOOR_EMISSIVE_START_LAYER, FLOOR_EMISSIVE_END_LAYER, (layer - (TOPDOWN_LAYER + 1)) / TOPDOWN_LAYER_COUNT)
/// Produces a mutable appearance glued to the [EMISSIVE_PLANE] dyed to be the [EMISSIVE_COLOR].
/proc/emissive_appearance(icon, icon_state = "", atom/offset_spokesman, layer, alpha = 255, appearance_flags = NONE, offset_const, apply_bloom = TRUE)
/proc/emissive_appearance(icon, icon_state = "", atom/offset_spokesman, layer, alpha = 255, appearance_flags = NONE, offset_const, effect_type = EMISSIVE_BLOOM)
if (isnull(layer))
if(IS_TOPDOWN_PLANE(offset_spokesman.plane))
layer = TOPDOWN_TO_EMISSIVE_LAYER(offset_spokesman.layer)
else
layer = FLOAT_LAYER
var/mutable_appearance/appearance = mutable_appearance(icon, icon_state, layer, offset_spokesman, EMISSIVE_PLANE, 255, appearance_flags | EMISSIVE_APPEARANCE_FLAGS, offset_const)
if(alpha == 255)
if (apply_bloom)
appearance.color = GLOB.emissive_color
else
appearance.color = GLOB.emissive_color_no_bloom
switch(effect_type)
if(EMISSIVE_NO_BLOOM)
appearance.color = GLOB.emissive_color_no_bloom
if (EMISSIVE_BLOOM)
appearance.color = GLOB.emissive_color
if (EMISSIVE_SPECULAR)
appearance.color = GLOB.specular_color
else
var/alpha_ratio = alpha/255
if (apply_bloom)
appearance.color = _EMISSIVE_COLOR(alpha_ratio)
else
appearance.color = _EMISSIVE_COLOR_NO_BLOOM(alpha_ratio)
switch(effect_type)
if(EMISSIVE_NO_BLOOM)
appearance.color = _EMISSIVE_COLOR_NO_BLOOM(alpha_ratio)
if (EMISSIVE_BLOOM)
appearance.color = _EMISSIVE_COLOR(alpha_ratio)
if (EMISSIVE_SPECULAR)
appearance.color = _SPECULAR_COLOR(alpha_ratio)
//Test to make sure emissives with broken or missing icon states are created
if(PERFORM_ALL_TESTS(focus_only/invalid_emissives))

View File

@@ -322,6 +322,13 @@
0, 0, 0, OVERLAY_LIGHTING_WEIGHT,
1, 1, 1, 0,
))
add_relay_to(GET_NEW_PLANE(RENDER_PLANE_SPECULAR, offset), relay_color = list(
SPECULAR_EMISSIVE_OVERLAY_CONTRAST, 0, 0, 0,
0, SPECULAR_EMISSIVE_OVERLAY_CONTRAST, 0, 0,
0, 0, SPECULAR_EMISSIVE_OVERLAY_CONTRAST, 0,
0, 0, 0, 1,
-SPECULAR_EMISSIVE_CUTOFF, -SPECULAR_EMISSIVE_CUTOFF, -SPECULAR_EMISSIVE_CUTOFF, 0,
))
/atom/movable/screen/plane_master/above_lighting
name = "Above lighting"
@@ -361,11 +368,14 @@
/atom/movable/screen/plane_master/emissive/Initialize(mapload, datum/hud/hud_owner, datum/plane_master_group/home, offset)
. = ..()
/// Okay, so what we're doing here is making all emissives convert to white for actual emissive masking (i.e. adding light so objects glow)
add_relay_to(GET_NEW_PLANE(RENDER_PLANE_EMISSIVE, offset), relay_color = list(1,1,1,0, 1,1,1,0, 1,1,1,0, 0,0,0,1, 0,0,0,0))
add_relay_to(GET_NEW_PLANE(RENDER_PLANE_EMISSIVE, offset), relay_color = list(1,1,1,0, 1,1,1,0, 0,0,0,0, 0,0,0,1, 0,0,0,0))
/// But for the bloom plate we convert only the red color into full white, this way we can have emissives in green channel unaffected by bloom
/// which allows us to selectively bloom only a part of our emissives
add_relay_to(GET_NEW_PLANE(RENDER_PLANE_EMISSIVE_BLOOM, offset), relay_color = list(255,255,255,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0))
add_relay_to(GET_NEW_PLANE(RENDER_PLANE_EMISSIVE_BLOOM_MASK, offset), relay_color = list(1,1,1,1, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0))
// Blue channel is dedicated to specular, i.e. our bootleg implementation of shiny objects
// We map it onto alpha so we can use the mask plate in an alpha mask filter to cut out only the shiny bits
add_relay_to(GET_NEW_PLANE(RENDER_PLANE_SPECULAR_MASK, offset), relay_color = list(0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0, 1,1,1,0))
/atom/movable/screen/plane_master/pipecrawl
name = "Pipecrawl"

View File

@@ -80,6 +80,18 @@
blend_mode = BLEND_ADD
critical = PLANE_CRITICAL_DISPLAY
/atom/movable/screen/plane_master/rendering_plate/turf_lighting/Initialize(mapload, datum/hud/hud_owner, datum/plane_master_group/home, offset)
. = ..()
/// We get affected by cutoff but not by the contrast that overlay lights get
/// So flashlights seem to reflect "better"
add_relay_to(GET_NEW_PLANE(RENDER_PLANE_SPECULAR, offset), relay_color = list(
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1,
-SPECULAR_EMISSIVE_CUTOFF, -SPECULAR_EMISSIVE_CUTOFF, -SPECULAR_EMISSIVE_CUTOFF, 0,
))
/atom/movable/screen/plane_master/rendering_plate/emissive_slate
name = "Emissive Plate"
documentation = "This system works by exploiting BYONDs color matrix filter to use layers to handle emissive blockers.\
@@ -109,7 +121,7 @@
appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
render_relay_planes = list()
render_target = EMISSIVE_BLOOM_MASK_TARGET
render_target = EMISSIVE_BLOOM_MASK_RENDER_TARGET
critical = PLANE_CRITICAL_DISPLAY
/atom/movable/screen/plane_master/rendering_plate/emissive_bloom
@@ -125,9 +137,33 @@
/atom/movable/screen/plane_master/rendering_plate/emissive_bloom/Initialize(mapload, datum/hud/hud_owner, datum/plane_master_group/home, offset)
. = ..()
add_filter("emissive_mask", 1, alpha_mask_filter(render_source = OFFSET_RENDER_TARGET(EMISSIVE_BLOOM_MASK_TARGET, offset)))
add_filter("emissive_mask", 1, alpha_mask_filter(render_source = OFFSET_RENDER_TARGET(EMISSIVE_BLOOM_MASK_RENDER_TARGET, offset)))
add_filter("emissive_bloom", 2, bloom_filter(threshold = COLOR_BLACK, size = 2, offset = 1))
/atom/movable/screen/plane_master/rendering_plate/specular_mask
name = "Specular mask plate"
documentation = "Plate used to generate the specular mask for the specular plate effect."
plane = RENDER_PLANE_SPECULAR_MASK
appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
render_target = SPECULAR_MASK_RENDER_TARGET
render_relay_planes = list()
critical = PLANE_CRITICAL_DISPLAY
/atom/movable/screen/plane_master/rendering_plate/specular
name = "Specular plate"
documentation = "Plate used to artificially increase lighting on certain pixels to poorly mimic shiny surfaces."
plane = RENDER_PLANE_SPECULAR
appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
blend_mode = BLEND_ADD
render_relay_planes = list(RENDER_PLANE_GAME)
critical = PLANE_CRITICAL_DISPLAY
/atom/movable/screen/plane_master/rendering_plate/specular/Initialize(mapload, datum/hud/hud_owner, datum/plane_master_group/home, offset)
. = ..()
add_filter("specular_mask", 1, alpha_mask_filter(render_source = OFFSET_RENDER_TARGET(SPECULAR_MASK_RENDER_TARGET, offset)))
///Contains all lighting objects
/atom/movable/screen/plane_master/rendering_plate/lighting
name = "Lighting plate"

View File

@@ -37,7 +37,7 @@
blood_splatter.color = _color
var/mutable_appearance/emissive_splatter = null
if (emissive_alpha)
emissive_splatter = emissive_appearance('icons/effects/blood.dmi', "itemblood", as_item, alpha = emissive_alpha)
emissive_splatter = emissive_appearance('icons/effects/blood.dmi', "itemblood", as_item, alpha = emissive_alpha, effect_type = EMISSIVE_NO_BLOOM)
emissive_splatter.blend_mode = BLEND_INSET_OVERLAY
if (uses_filter)
blood_splatter.appearance_flags |= KEEP_APART

View File

@@ -615,7 +615,8 @@
for(var/heading in list(NORTH,SOUTH,EAST,WEST))
if(!(unres_sides & heading))
continue
var/mutable_appearance/floorlight = mutable_appearance('icons/obj/doors/airlocks/station/overlays.dmi', "unres_[heading]", FLOAT_LAYER, src, ABOVE_LIGHTING_PLANE)
var/mutable_appearance/floorlight = mutable_appearance('icons/obj/doors/airlocks/station/overlays.dmi', "unres_[heading]", FLOAT_LAYER, src, O_LIGHTING_VISUAL_PLANE, appearance_flags = RESET_COLOR | KEEP_APART)
floorlight.color = LIGHT_COLOR_DEFAULT
switch (heading)
if (NORTH)
floorlight.pixel_w = 0

View File

@@ -119,20 +119,24 @@
switch(dir)
if(NORTH,SOUTH)
if(unres_sides & NORTH)
var/image/side_overlay = image(icon='icons/obj/doors/airlocks/station/overlays.dmi', icon_state="unres_n")
var/mutable_appearance/side_overlay = mutable_appearance('icons/obj/doors/airlocks/station/overlays.dmi', "unres_1", FLOAT_LAYER, src, O_LIGHTING_VISUAL_PLANE, appearance_flags = RESET_COLOR | KEEP_APART)
side_overlay.color = LIGHT_COLOR_DEFAULT
side_overlay.pixel_z = dir == NORTH ? 31 : 6
. += side_overlay
if(unres_sides & SOUTH)
var/image/side_overlay = image(icon='icons/obj/doors/airlocks/station/overlays.dmi', icon_state="unres_s")
var/mutable_appearance/side_overlay = mutable_appearance('icons/obj/doors/airlocks/station/overlays.dmi', "unres_2", FLOAT_LAYER, src, O_LIGHTING_VISUAL_PLANE, appearance_flags = RESET_COLOR | KEEP_APART)
side_overlay.color = LIGHT_COLOR_DEFAULT
side_overlay.pixel_z = dir == NORTH ? -6 : -31
. += side_overlay
if(EAST,WEST)
if(unres_sides & EAST)
var/image/side_overlay = image(icon='icons/obj/doors/airlocks/station/overlays.dmi', icon_state="unres_e")
var/mutable_appearance/side_overlay = mutable_appearance('icons/obj/doors/airlocks/station/overlays.dmi', "unres_4", FLOAT_LAYER, src, O_LIGHTING_VISUAL_PLANE, appearance_flags = RESET_COLOR | KEEP_APART)
side_overlay.color = LIGHT_COLOR_DEFAULT
side_overlay.pixel_w = dir == EAST ? 31 : 6
. += side_overlay
if(unres_sides & WEST)
var/image/side_overlay = image(icon='icons/obj/doors/airlocks/station/overlays.dmi', icon_state="unres_w")
var/mutable_appearance/side_overlay = mutable_appearance('icons/obj/doors/airlocks/station/overlays.dmi', "unres_8", FLOAT_LAYER, src, O_LIGHTING_VISUAL_PLANE, appearance_flags = RESET_COLOR | KEEP_APART)
side_overlay.color = LIGHT_COLOR_DEFAULT
side_overlay.pixel_w = dir == EAST ? -6 : -31
. += side_overlay

View File

@@ -119,7 +119,7 @@
. += blood_emissive(icon, icon_state)
/obj/effect/decal/cleanable/blood/proc/blood_emissive(icon_to_use, icon_state_to_use)
return emissive_appearance(icon_to_use, icon_state_to_use, src, alpha = 255 * emissive_alpha / alpha)
return emissive_appearance(icon_to_use, icon_state_to_use, src, alpha = 255 * emissive_alpha / alpha, effect_type = EMISSIVE_NO_BLOOM)
/obj/effect/decal/cleanable/blood/lazy_init_reagents()
if (reagents)

View File

@@ -437,7 +437,7 @@ GLOBAL_LIST_EMPTY(nebula_vomits)
/obj/effect/decal/cleanable/ants/update_overlays()
. = ..()
. += emissive_appearance(icon, "[icon_state]_light", src, alpha = src.alpha)
. += emissive_appearance(icon, "[icon_state]_light", src, alpha = src.alpha, effect_type = EMISSIVE_NO_BLOOM)
/obj/effect/decal/cleanable/ants/fire_act(exposed_temperature, exposed_volume)
new /obj/effect/decal/cleanable/ants/fire(loc)

View File

@@ -644,7 +644,7 @@ BLIND // can't see anything
var/emissive_alpha = get_blood_emissive_alpha(is_worn = TRUE)
if (emissive_alpha)
var/mutable_appearance/emissive_overlay = emissive_appearance(blood_overlay.icon, blood_overlay.icon_state, src, alpha = emissive_alpha)
var/mutable_appearance/emissive_overlay = emissive_appearance(blood_overlay.icon, blood_overlay.icon_state, src, alpha = emissive_alpha, effect_type = EMISSIVE_NO_BLOOM)
blood_overlay.overlays += emissive_overlay
return blood_overlay

View File

@@ -24,6 +24,6 @@
/obj/item/clothing/head/cone/worn_overlays(mutable_appearance/standing, isinhands, icon_file)
. = ..()
if(!isinhands)
. += emissive_appearance(icon_file, "[icon_state]-emissive", src, alpha = src.alpha)
. += emissive_appearance(icon_file, "[icon_state]-emissive", src, alpha = src.alpha, effect_type = EMISSIVE_SPECULAR)

View File

@@ -219,7 +219,7 @@
/obj/item/clothing/head/utility/hardhat/welding/atmos/worn_overlays(mutable_appearance/standing, isinhands, icon_file)
. = ..()
if(!isinhands)
. += emissive_appearance(icon_file, "[icon_state]-emissive", src, alpha = src.alpha)
. += emissive_appearance(icon_file, "[icon_state]-emissive", src, alpha = src.alpha, effect_type = EMISSIVE_SPECULAR)
/obj/item/clothing/head/utility/hardhat/pumpkinhead
name = "carved pumpkin"

View File

@@ -107,7 +107,7 @@
/obj/item/clothing/head/helmet/press/worn_overlays(mutable_appearance/standing, isinhands, icon_file)
. = ..()
if(!isinhands)
. += emissive_appearance(icon_file, "[icon_state]-emissive", src, alpha = src.alpha)
. += emissive_appearance(icon_file, "[icon_state]-emissive", src, alpha = src.alpha, effect_type = EMISSIVE_SPECULAR)
/obj/item/clothing/head/helmet/alt
name = "bulletproof helmet"

View File

@@ -67,7 +67,7 @@
/obj/item/clothing/suit/armor/vest/press/worn_overlays(mutable_appearance/standing, isinhands, icon_file)
. = ..()
if(!isinhands)
. += emissive_appearance(icon_file, "[icon_state]-emissive", src, alpha = src.alpha)
. += emissive_appearance(icon_file, "[icon_state]-emissive", src, alpha = src.alpha, effect_type = EMISSIVE_SPECULAR)
/obj/item/clothing/suit/armor/vest/marine
name = "tactical armor vest"
@@ -251,7 +251,7 @@
/obj/item/clothing/suit/armor/vest/secjacket/worn_overlays(mutable_appearance/standing, isinhands, icon_file)
. = ..()
if(!isinhands)
. += emissive_appearance(icon_file, "[icon_state]-emissive", src, alpha = src.alpha)
. += emissive_appearance(icon_file, "[icon_state]-emissive", src, alpha = src.alpha, effect_type = EMISSIVE_SPECULAR)
/datum/armor/armor_secjacket //Gotta compensate those extra covered limbs
melee = 25

View File

@@ -196,7 +196,7 @@
/obj/item/clothing/suit/hazardvest/worn_overlays(mutable_appearance/standing, isinhands, icon_file)
. = ..()
if(!isinhands)
. += emissive_appearance(icon_file, "[icon_state]-emissive", src, alpha = src.alpha, apply_bloom = FALSE)
. += emissive_appearance(icon_file, "[icon_state]-emissive", src, alpha = src.alpha, effect_type = EMISSIVE_SPECULAR)
/obj/item/clothing/suit/hazardvest/press // Variant used by the Curator
name = "press hazard vest"
@@ -442,4 +442,4 @@
/obj/item/clothing/suit/atmos_overalls/worn_overlays(mutable_appearance/standing, isinhands, icon_file)
. = ..()
if(!isinhands)
. += emissive_appearance(icon_file, "[icon_state]-emissive", src, alpha = src.alpha)
. += emissive_appearance(icon_file, "[icon_state]-emissive", src, alpha = src.alpha, effect_type = EMISSIVE_SPECULAR)

View File

@@ -56,7 +56,7 @@
/obj/item/clothing/suit/utility/fire/worn_overlays(mutable_appearance/standing, isinhands, icon_file)
. = ..()
if(!isinhands)
. += emissive_appearance(icon_file, "[icon_state]-emissive", src, alpha = src.alpha)
. += emissive_appearance(icon_file, "[icon_state]-emissive", src, alpha = src.alpha, effect_type = EMISSIVE_SPECULAR)
/obj/item/clothing/suit/utility/fire/firefighter
icon_state = "firesuit"

View File

@@ -537,7 +537,7 @@
/obj/item/clothing/suit/hooded/wintercoat/engineering/worn_overlays(mutable_appearance/standing, isinhands, icon_file)
. = ..()
if(!isinhands)
. += emissive_appearance(icon_file, "[icon_state]-emissive", src, alpha = src.alpha)
. += emissive_appearance(icon_file, "[icon_state]-emissive", src, alpha = src.alpha, effect_type = EMISSIVE_SPECULAR)
/obj/item/clothing/head/hooded/winterhood/engineering
desc = "A yellow winter coat hood. Definitely not a replacement for a hard hat."
@@ -550,7 +550,7 @@
/obj/item/clothing/head/hooded/winterhood/engineering/worn_overlays(mutable_appearance/standing, isinhands, icon_file)
. = ..()
if(!isinhands)
. += emissive_appearance(icon_file, "[icon_state]-emissive", src, alpha = src.alpha)
. += emissive_appearance(icon_file, "[icon_state]-emissive", src, alpha = src.alpha, effect_type = EMISSIVE_SPECULAR)
// Chief Engineer
/obj/item/clothing/suit/hooded/wintercoat/engineering/ce

View File

@@ -102,7 +102,7 @@
/obj/item/fish/starfish/proc/add_emissive()
if(status == FISH_ALIVE)
return emissive_appearance(icon, "starfish_emissive", src)
return emissive_appearance(icon, "starfish_emissive", src, effect_type = EMISSIVE_NO_BLOOM)
///It spins, and dimly glows in the dark.
/obj/item/fish/starfish/flop_animation()

View File

@@ -926,7 +926,7 @@ GLOBAL_LIST_EMPTY(fishing_challenges_by_user)
var/mutable_appearance/overlay = mutable_appearance(icon, "lure_light")
overlay.color = spin_ready ? COLOR_GREEN : COLOR_RED
. += overlay
. += emissive_appearance(icon, "lure_light_emissive", src, alpha = src.alpha)
. += emissive_appearance(icon, "lure_light_emissive", src, alpha = src.alpha, effect_type = EMISSIVE_NO_BLOOM)
#undef WAIT_PHASE
#undef BITING_PHASE