diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm
index 6aed186d603..d49306a6cbe 100644
--- a/code/__DEFINES/colors.dm
+++ b/code/__DEFINES/colors.dm
@@ -135,7 +135,7 @@
#define LIGHT_COLOR_CYAN "#7DE1E1"
/// Electric cyan rgb(0, 255, 255)
#define LIGHT_COLOR_ELECTRIC_CYAN "#00FFFF"
-/// More-saturated cyan. rgb(16, 21, 22)
+/// More-saturated cyan. rgb(64, 206, 255)
#define LIGHT_COLOR_LIGHT_CYAN "#40CEFF"
/// Saturated blue. rgb(51, 117, 248)
#define LIGHT_COLOR_DARK_BLUE "#6496FA"
diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm
index f92ca6a95d8..4231a85b2a4 100644
--- a/code/__DEFINES/dcs/signals.dm
+++ b/code/__DEFINES/dcs/signals.dm
@@ -128,6 +128,8 @@
#define COMSIG_ATOM_UPDATE_OVERLAYS "atom_update_overlays"
///from base of [/atom/update_icon]: (signalOut, did_anything)
#define COMSIG_ATOM_UPDATED_ICON "atom_updated_icon"
+///from base of [/atom/proc/smooth_icon]: ()
+#define COMSIG_ATOM_SMOOTHED_ICON "atom_smoothed_icon"
///from base of atom/Entered(): (atom/movable/entering, /atom/oldLoc)
#define COMSIG_ATOM_ENTERED "atom_entered"
/// Sent from the atom that just Entered src. From base of atom/Entered(): (/atom/entered_atom, /atom/oldLoc)
diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm
index 571b2802aff..3b0b2848b6d 100644
--- a/code/__DEFINES/flags.dm
+++ b/code/__DEFINES/flags.dm
@@ -71,6 +71,8 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
#define UPDATE_OVERLAYS (1<<3)
/// Update the atom's greyscaling
#define UPDATE_GREYSCALE (1<<4)
+/// Update the atom's smoothing. (More accurately, queue it for an update)
+#define UPDATE_SMOOTHING (1<<5)
/// Update the atom's icon
#define UPDATE_ICON (UPDATE_ICON_STATE|UPDATE_OVERLAYS)
diff --git a/code/__DEFINES/icon_smoothing.dm b/code/__DEFINES/icon_smoothing.dm
index c3c9a64c8ec..286a920a557 100644
--- a/code/__DEFINES/icon_smoothing.dm
+++ b/code/__DEFINES/icon_smoothing.dm
@@ -64,14 +64,43 @@ DEFINE_BITFIELD(smoothing_flags, list(
#define SMOOTH_GROUP_CARPET_EXECUTIVE S_TURF(20) ///turf/open/floor/carpet/executive
#define SMOOTH_GROUP_CARPET_STELLAR S_TURF(21) ///turf/open/floor/carpet/stellar
#define SMOOTH_GROUP_CARPET_DONK S_TURF(22) ///turf/open/floor/carpet/donk
+#define SMOOTH_GROUP_CARPET_NEON S_TURF(23) //![turf/open/floor/carpet/neon]
+#define SMOOTH_GROUP_CARPET_SIMPLE_NEON S_TURF(24) //![turf/open/floor/carpet/neon/simple]
+#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_WHITE S_TURF(25) //![turf/open/floor/carpet/neon/simple/white]
+#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLACK S_TURF(26) //![turf/open/floor/carpet/neon/simple/black]
+#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_RED S_TURF(27) //![turf/open/floor/carpet/neon/simple/red]
+#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_ORANGE S_TURF(28) //![turf/open/floor/carpet/neon/simple/orange]
+#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_YELLOW S_TURF(29) //![turf/open/floor/carpet/neon/simple/yellow]
+#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_LIME S_TURF(30) //![turf/open/floor/carpet/neon/simple/lime]
+#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_GREEN S_TURF(31) //![turf/open/floor/carpet/neon/simple/green]
+#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_TEAL S_TURF(32) //![turf/open/floor/carpet/neon/simple/teal]
+#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_CYAN S_TURF(33) //![turf/open/floor/carpet/neon/simple/cyan]
+#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLUE S_TURF(34) //![turf/open/floor/carpet/neon/simple/blue]
+#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_PURPLE S_TURF(35) //![turf/open/floor/carpet/neon/simple/purple]
+#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_VIOLET S_TURF(36) //![turf/open/floor/carpet/neon/simple/violet]
+#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_PINK S_TURF(37) //![turf/open/floor/carpet/neon/simple/pink]
+#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_NODOTS S_TURF(38) //![turf/open/floor/carpet/neon/simple/nodots]
+#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_WHITE_NODOTS S_TURF(39) //![turf/open/floor/carpet/neon/simple/white/nodots]
+#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLACK_NODOTS S_TURF(40) //![turf/open/floor/carpet/neon/simple/black/nodots]
+#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_RED_NODOTS S_TURF(41) //![turf/open/floor/carpet/neon/simple/red/nodots]
+#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_ORANGE_NODOTS S_TURF(42) //![turf/open/floor/carpet/neon/simple/orange/nodots]
+#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_YELLOW_NODOTS S_TURF(43) //![turf/open/floor/carpet/neon/simple/yellow/nodots]
+#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_LIME_NODOTS S_TURF(44) //![turf/open/floor/carpet/neon/simple/lime/nodots]
+#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_GREEN_NODOTS S_TURF(45) //![turf/open/floor/carpet/neon/simple/green/nodots]
+#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_TEAL_NODOTS S_TURF(46) //![turf/open/floor/carpet/neon/simple/teal/nodots]
+#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_CYAN_NODOTS S_TURF(47) //![turf/open/floor/carpet/neon/simple/cyan/nodots]
+#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLUE_NODOTS S_TURF(48) //![turf/open/floor/carpet/neon/simple/blue/nodots]
+#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_PURPLE_NODOTS S_TURF(49) //![turf/open/floor/carpet/neon/simple/purple/nodots]
+#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_VIOLET_NODOTS S_TURF(50) //![turf/open/floor/carpet/neon/simple/violet/nodots]
+#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_PINK_NODOTS S_TURF(51) //![turf/open/floor/carpet/neon/simple/pink/nodots]
-#define SMOOTH_GROUP_CLOSED_TURFS S_TURF(24) ///turf/closed
-#define SMOOTH_GROUP_MATERIAL_WALLS S_TURF(25) ///turf/closed/wall/material
-#define SMOOTH_GROUP_SYNDICATE_WALLS S_TURF(26) ///turf/closed/wall/r_wall/syndicate, /turf/closed/indestructible/syndicate
-#define SMOOTH_GROUP_HOTEL_WALLS S_TURF(27) ///turf/closed/indestructible/hotelwall
-#define SMOOTH_GROUP_MINERAL_WALLS S_TURF(28) ///turf/closed/mineral, /turf/closed/indestructible
-#define SMOOTH_GROUP_BOSS_WALLS S_TURF(29) ///turf/closed/indestructible/riveted/boss
-#define SMOOTH_GROUP_SURVIVAL_TITANIUM_WALLS S_TURF(30) ///turf/closed/wall/mineral/titanium/survival
+#define SMOOTH_GROUP_CLOSED_TURFS S_TURF(52) ///turf/closed
+#define SMOOTH_GROUP_MATERIAL_WALLS S_TURF(53) ///turf/closed/wall/material
+#define SMOOTH_GROUP_SYNDICATE_WALLS S_TURF(54) ///turf/closed/wall/r_wall/syndicate, /turf/closed/indestructible/syndicate
+#define SMOOTH_GROUP_HOTEL_WALLS S_TURF(55) ///turf/closed/indestructible/hotelwall
+#define SMOOTH_GROUP_MINERAL_WALLS S_TURF(56) ///turf/closed/mineral, /turf/closed/indestructible
+#define SMOOTH_GROUP_BOSS_WALLS S_TURF(57) ///turf/closed/indestructible/riveted/boss
+#define SMOOTH_GROUP_SURVIVAL_TITANIUM_WALLS S_TURF(58) ///turf/closed/wall/mineral/titanium/survival
//SKYRAT EDIT ADDITION
#define SMOOTH_GROUP_ELEVATED_PLASTEEL S_TURF(31)
diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm
index 5d64906a8f6..544eab55f1a 100644
--- a/code/__HELPERS/icon_smoothing.dm
+++ b/code/__HELPERS/icon_smoothing.dm
@@ -164,6 +164,8 @@ DEFINE_BITFIELD(smoothing_junction, list(
bitmask_smooth()
else
CRASH("smooth_icon called for [src] with smoothing_flags == [smoothing_flags]")
+ SEND_SIGNAL(src, COMSIG_ATOM_SMOOTHED_ICON)
+ update_appearance(~UPDATE_SMOOTHING)
/atom/proc/corners_diagonal_smooth(adjacencies)
diff --git a/code/controllers/admin.dm b/code/controllers/admin.dm
index 8db3ba780db..2e6b1f3a598 100644
--- a/code/controllers/admin.dm
+++ b/code/controllers/admin.dm
@@ -1,6 +1,7 @@
// Clickable stat() button.
/obj/effect/statclick
name = "Initializing..."
+ blocks_emissive = NONE
var/target
INITIALIZE_IMMEDIATE(/obj/effect/statclick)
diff --git a/code/datums/elements/decal.dm b/code/datums/elements/decals/_decal.dm
similarity index 66%
rename from code/datums/elements/decal.dm
rename to code/datums/elements/decals/_decal.dm
index cce7ddfd188..a20ec939340 100644
--- a/code/datums/elements/decal.dm
+++ b/code/datums/elements/decals/_decal.dm
@@ -1,10 +1,17 @@
/datum/element/decal
element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH
id_arg_index = 2
+ /// Whether this decal can be cleaned.
var/cleanable
+ /// A description this decal appends to the target's examine message.
var/description
/// If true this was initialized with no set direction - will follow the parent dir.
var/directional
+ /// The base icon state that this decal was initialized with.
+ var/base_icon_state
+ /// What smoothing junction this was initialized with.
+ var/smoothing
+ /// The overlay applied by this decal to the target.
var/mutable_appearance/pic
/// Remove old decals and apply new decals after rotation as necessary
@@ -36,7 +43,7 @@
decal.Detach(source)
for(var/result in resulting_decals_params)
- source.AddElement(/datum/element/decal, result["icon"], result["icon_state"], result["dir"], result["cleanable"], result["color"], result["layer"], result["desc"], result["alpha"])
+ source.AddElement(/datum/element/decal, result["icon"], result["icon_state"], result["dir"], result["plane"], result["layer"], result["alpha"], result["color"], result["smoothing"], result["cleanable"], result["desc"])
/datum/element/decal/proc/get_rotated_parameters(old_dir,new_dir)
@@ -46,40 +53,46 @@
new_dir = turn(pic.dir,-rotation)
return list(
"icon" = pic.icon,
- "icon_state" = pic.icon_state,
+ "icon_state" = base_icon_state,
"dir" = new_dir,
- "cleanable" = cleanable,
- "color" = pic.color,
+ "plane" = pic.plane,
"layer" = pic.layer,
- "desc" = description,
- "alpha" = pic.alpha
+ "alpha" = pic.alpha,
+ "color" = pic.color,
+ "smoothing" = smoothing,
+ "cleanable" = cleanable,
+ "desc" = description
)
-/datum/element/decal/Attach(atom/target, _icon, _icon_state, _dir, _cleanable=FALSE, _color, _layer=TURF_LAYER, _description, _alpha=255, mutable_appearance/_pic)
+/datum/element/decal/Attach(atom/target, _icon, _icon_state, _dir, _plane=FLOAT_PLANE, _layer=FLOAT_LAYER, _alpha=255, _color, _smoothing, _cleanable=FALSE, _description, mutable_appearance/_pic)
. = ..()
if(!isatom(target))
return ELEMENT_INCOMPATIBLE
if(_pic)
pic = _pic
- else if(!generate_appearance(_icon, _icon_state, _dir, _layer, _color, _alpha, target))
+ else if(!generate_appearance(_icon, _icon_state, _dir, _plane, _layer, _color, _alpha, _smoothing, target))
return ELEMENT_INCOMPATIBLE
description = _description
cleanable = _cleanable
directional = _dir
+ base_icon_state = _icon_state
+ smoothing = _smoothing
RegisterSignal(target,COMSIG_ATOM_UPDATE_OVERLAYS,.proc/apply_overlay, TRUE)
if(target.flags_1 & INITIALIZED_1)
- target.update_appearance() //could use some queuing here now maybe.
+ target.update_appearance(UPDATE_OVERLAYS) //could use some queuing here now maybe.
else
RegisterSignal(target,COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE,.proc/late_update_icon, TRUE)
if(isitem(target))
INVOKE_ASYNC(target, /obj/item/.proc/update_slot_icon, TRUE)
if(_dir)
SSdcs.RegisterSignal(target,COMSIG_ATOM_DIR_CHANGE, /datum/controller/subsystem/processing/dcs/proc/rotate_decals, TRUE)
+ if(!isnull(_smoothing))
+ RegisterSignal(target, COMSIG_ATOM_SMOOTHED_ICON, .proc/smooth_react, TRUE)
if(_cleanable)
- RegisterSignal(target, COMSIG_COMPONENT_CLEAN_ACT, .proc/clean_react,TRUE)
+ RegisterSignal(target, COMSIG_COMPONENT_CLEAN_ACT, .proc/clean_react, TRUE)
if(_description)
RegisterSignal(target, COMSIG_PARENT_EXAMINE, .proc/examine,TRUE)
@@ -93,18 +106,19 @@
* all args are fed into creating an image, they are byond vars for images you'll recognize in the byond docs
* (except source, source is the object whose appearance we're copying.)
*/
-/datum/element/decal/proc/generate_appearance(_icon, _icon_state, _dir, _layer, _color, _alpha, source)
+/datum/element/decal/proc/generate_appearance(_icon, _icon_state, _dir, _plane, _layer, _color, _alpha, _smoothing, source)
if(!_icon || !_icon_state)
return FALSE
- var/temp_image = image(_icon, null, _icon_state, _layer, _dir)
+ var/temp_image = image(_icon, null, isnull(_smoothing) ? _icon_state : "[_icon_state]-[_smoothing]", _layer, _dir)
pic = new(temp_image)
+ pic.plane = _plane
pic.color = _color
pic.alpha = _alpha
return TRUE
/datum/element/decal/Detach(atom/source)
- UnregisterSignal(source, list(COMSIG_ATOM_DIR_CHANGE, COMSIG_COMPONENT_CLEAN_ACT, COMSIG_PARENT_EXAMINE, COMSIG_ATOM_UPDATE_OVERLAYS, COMSIG_TURF_ON_SHUTTLE_MOVE))
- source.update_appearance()
+ UnregisterSignal(source, list(COMSIG_ATOM_DIR_CHANGE, COMSIG_COMPONENT_CLEAN_ACT, COMSIG_PARENT_EXAMINE, COMSIG_ATOM_UPDATE_OVERLAYS, COMSIG_TURF_ON_SHUTTLE_MOVE, COMSIG_ATOM_SMOOTHED_ICON))
+ source.update_appearance(UPDATE_OVERLAYS)
if(isitem(source))
INVOKE_ASYNC(source, /obj/item/.proc/update_slot_icon)
SEND_SIGNAL(source, COMSIG_TURF_DECAL_DETACHED, description, cleanable, directional, pic)
@@ -114,8 +128,8 @@
SIGNAL_HANDLER
if(source && istype(source))
- source.update_appearance()
- UnregisterSignal(source,COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE)
+ source.update_appearance(UPDATE_OVERLAYS)
+ UnregisterSignal(source, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE)
/datum/element/decal/proc/apply_overlay(atom/source, list/overlay_list)
@@ -142,4 +156,20 @@
if(new_turf == source)
return
Detach(source)
- new_turf.AddElement(/datum/element/decal, pic.icon, pic.icon_state, directional, cleanable, pic.color, pic.layer, description, pic.alpha)
+ new_turf.AddElement(type, pic.icon, base_icon_state, directional, pic.plane, pic.layer, pic.alpha, pic.color, smoothing, cleanable, description)
+
+/**
+ * Reacts to the source atom smoothing.
+ *
+ * Arguments:
+ * - [source][/atom]: The source of the signal and recently smoothed atom.
+ */
+/datum/element/decal/proc/smooth_react(atom/source)
+ SIGNAL_HANDLER
+ var/smoothing_junction = source.smoothing_junction
+ if(smoothing_junction == smoothing)
+ return NONE
+
+ Detach(source)
+ source.AddElement(type, pic.icon, base_icon_state, directional, pic.plane, pic.layer, pic.alpha, pic.color, smoothing_junction, cleanable, description)
+ return NONE
diff --git a/code/datums/elements/decals/blood.dm b/code/datums/elements/decals/blood.dm
index ac242e2bab5..b6f96cd2f4c 100644
--- a/code/datums/elements/decals/blood.dm
+++ b/code/datums/elements/decals/blood.dm
@@ -1,18 +1,17 @@
/datum/element/decal/blood
-/datum/element/decal/blood/Attach(datum/target, _icon, _icon_state, _dir, _cleanable=CLEAN_TYPE_BLOOD, _color, _layer=ABOVE_OBJ_LAYER)
+/datum/element/decal/blood/Attach(datum/target, _icon, _icon_state, _dir, _plane, _layer, _alpha, _color, _smoothing, _cleanable=CLEAN_TYPE_BLOOD, _description, mutable_appearance/_pic)
if(!isitem(target))
return ELEMENT_INCOMPATIBLE
. = ..()
-
RegisterSignal(target, COMSIG_ATOM_GET_EXAMINE_NAME, .proc/get_examine_name, TRUE)
/datum/element/decal/blood/Detach(atom/source)
UnregisterSignal(source, COMSIG_ATOM_GET_EXAMINE_NAME)
return ..()
-/datum/element/decal/blood/generate_appearance(_icon, _icon_state, _dir, _layer, _color, _alpha, source)
+/datum/element/decal/blood/generate_appearance(_icon, _icon_state, _dir, _plane, _layer, _color, _alpha, _smoothing, source)
var/obj/item/I = source
if(!_icon)
_icon = 'icons/effects/blood.dmi'
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index c123644f475..15bb9760c2f 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -706,7 +706,7 @@
if(LAZYLEN(managed_vis_overlays))
SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays)
- var/list/new_overlays = update_overlays()
+ var/list/new_overlays = update_overlays(updates)
if(managed_overlays)
cut_overlay(managed_overlays)
managed_overlays = null
diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm
index 32d2c4884be..b52cbe8cc92 100644
--- a/code/game/machinery/_machinery.dm
+++ b/code/game/machinery/_machinery.dm
@@ -95,6 +95,7 @@
anchored = TRUE
interaction_flags_atom = INTERACT_ATOM_ATTACK_HAND | INTERACT_ATOM_UI_INTERACT
+ blocks_emissive = EMISSIVE_BLOCK_GENERIC
var/machine_stat = NONE
var/use_power = IDLE_POWER_USE
diff --git a/code/game/machinery/computer/arcade/arcade.dm b/code/game/machinery/computer/arcade/arcade.dm
index d2eda3a7e01..8b77d8dd3d4 100644
--- a/code/game/machinery/computer/arcade/arcade.dm
+++ b/code/game/machinery/computer/arcade/arcade.dm
@@ -33,6 +33,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list(
/obj/item/stack/tile/fakespace/loaded = 2,
/obj/item/stack/tile/fakepit/loaded = 2,
/obj/item/stack/tile/eighties/loaded = 2,
+ /obj/item/stack/tile/fake_error/thirty = 2,
/obj/item/toy/toy_xeno = 2,
/obj/item/storage/box/actionfigure = 1,
/obj/item/restraints/handcuffs/fake = 2,
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 9cdb88324ff..8fb2dacba64 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -21,11 +21,23 @@
/// Someone, for the love of god, profile this. Is there a reason to cache mutable_appearance
/// if so, why are we JUST doing the airlocks when we can put this in mutable_appearance.dm for
/// everything
-/proc/get_airlock_overlay(icon_state, icon_file)
+/proc/get_airlock_overlay(icon_state, icon_file, em_block)
var/static/list/airlock_overlays = list()
- var/iconkey = "[icon_state][icon_file]"
- if((!(. = airlock_overlays[iconkey])))
- . = airlock_overlays[iconkey] = mutable_appearance(icon_file, icon_state)
+
+ var/base_icon_key = "[icon_state][icon_file]"
+ if(!(. = airlock_overlays[base_icon_key]))
+ . = airlock_overlays[base_icon_key] = mutable_appearance(icon_file, icon_state)
+ if(isnull(em_block))
+ return
+
+ var/em_block_key = "[base_icon_key][em_block]"
+ var/mutable_appearance/em_blocker = airlock_overlays[em_block_key]
+ if(!em_blocker)
+ em_blocker = airlock_overlays[em_block_key] = mutable_appearance(icon_file, icon_state, plane = EMISSIVE_PLANE)
+ em_blocker.color = em_block ? GLOB.em_block_color : GLOB.emissive_color
+
+ return list(., em_blocker)
+
// Before you say this is a bad implmentation, look at what it was before then ask yourself
// "Would this be better with a global var"
@@ -38,6 +50,17 @@
#define AIRLOCK_DENY 5
#define AIRLOCK_EMAG 6
+#define AIRLOCK_FRAME_CLOSED "closed"
+#define AIRLOCK_FRAME_CLOSING "closing"
+#define AIRLOCK_FRAME_OPEN "open"
+#define AIRLOCK_FRAME_OPENING "opening"
+
+#define AIRLOCK_LIGHT_BOLTS "bolts"
+#define AIRLOCK_LIGHT_EMERGENCY "emergency"
+#define AIRLOCK_LIGHT_DENIED "denied"
+#define AIRLOCK_LIGHT_CLOSING "closing"
+#define AIRLOCK_LIGHT_OPENING "opening"
+
#define AIRLOCK_SECURITY_NONE 0 //Normal airlock //Wires are not secured
#define AIRLOCK_SECURITY_IRON 1 //Medium security airlock //There is a simple iron plate over wires (use welder)
#define AIRLOCK_SECURITY_PLASTEEL_I_S 2 //Sliced inner plating (use crowbar), jumps to 0
@@ -76,6 +99,7 @@
smoothing_groups = list(SMOOTH_GROUP_AIRLOCK)
interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_REQUIRES_SILICON | INTERACT_MACHINE_OPEN
+ blocks_emissive = NONE // Custom emissive blocker. We don't want the normal behavior.
var/security_level = 0 //How much are wires secured
var/aiControlDisabled = AI_WIRE_NORMAL //If 1, AI control is disabled until the AI hacks back in and disables the lock. If 2, the AI has bypassed the lock. If -1, the control is enabled but the AI had bypassed it earlier, so if it is disabled again the AI would have no trouble getting back in.
@@ -464,11 +488,12 @@
airlock_state = state
. = ..()
-
+ /* SKYRAT EDIT REMOVAL
if(hasPower() && unres_sides)
set_light(2, 1)
else
set_light(0)
+ */
/obj/machinery/door/airlock/update_icon_state()
. = ..()
@@ -482,149 +507,61 @@
/obj/machinery/door/airlock/update_overlays()
. = ..()
- var/mutable_appearance/frame_overlay
- var/mutable_appearance/filling_overlay
- var/mutable_appearance/lights_overlay
- var/mutable_appearance/panel_overlay
- var/mutable_appearance/weld_overlay
- var/mutable_appearance/damag_overlay
- var/mutable_appearance/sparks_overlay
- var/mutable_appearance/note_overlay
- var/mutable_appearance/seal_overlay
- var/notetype = note_type()
+ var/frame_state
+ var/light_state
switch(airlock_state)
if(AIRLOCK_CLOSED)
- frame_overlay = get_airlock_overlay("closed", icon)
- if(airlock_material)
- filling_overlay = get_airlock_overlay("[airlock_material]_closed", overlays_file)
- else
- filling_overlay = get_airlock_overlay("fill_closed", icon)
- if(panel_open)
- if(security_level)
- panel_overlay = get_airlock_overlay("panel_closed_protected", overlays_file)
- else
- panel_overlay = get_airlock_overlay("panel_closed", overlays_file)
- if(welded)
- weld_overlay = get_airlock_overlay("welded", overlays_file)
- if(seal)
- seal_overlay = get_airlock_overlay("sealed", overlays_file)
- if(obj_integrity < integrity_failure * max_integrity)
- damag_overlay = get_airlock_overlay("sparks_broken", overlays_file)
- else if(obj_integrity < (0.75 * max_integrity))
- damag_overlay = get_airlock_overlay("sparks_damaged", overlays_file)
- if(lights && hasPower())
- if(locked)
- lights_overlay = get_airlock_overlay("lights_bolts", overlays_file)
- else if(emergency)
- lights_overlay = get_airlock_overlay("lights_emergency", overlays_file)
- if(note)
- note_overlay = get_airlock_overlay(notetype, note_overlay_file)
-
+ frame_state = AIRLOCK_FRAME_CLOSED
+ if(locked)
+ light_state = AIRLOCK_LIGHT_BOLTS
+ else if(emergency)
+ light_state = AIRLOCK_LIGHT_EMERGENCY
if(AIRLOCK_DENY)
- if(!hasPower())
- return
- frame_overlay = get_airlock_overlay("closed", icon)
- if(airlock_material)
- filling_overlay = get_airlock_overlay("[airlock_material]_closed", overlays_file)
- else
- filling_overlay = get_airlock_overlay("fill_closed", icon)
- if(panel_open)
- if(security_level)
- panel_overlay = get_airlock_overlay("panel_closed_protected", overlays_file)
- else
- panel_overlay = get_airlock_overlay("panel_closed", overlays_file)
- if(obj_integrity < integrity_failure * max_integrity)
- damag_overlay = get_airlock_overlay("sparks_broken", overlays_file)
- else if(obj_integrity < (0.75 * max_integrity))
- damag_overlay = get_airlock_overlay("sparks_damaged", overlays_file)
- if(welded)
- weld_overlay = get_airlock_overlay("welded", overlays_file)
- if(seal)
- seal_overlay = get_airlock_overlay("sealed", overlays_file)
- lights_overlay = get_airlock_overlay("lights_denied", overlays_file)
- if(note)
- note_overlay = get_airlock_overlay(notetype, note_overlay_file)
-
+ frame_state = AIRLOCK_FRAME_CLOSED
+ light_state = AIRLOCK_LIGHT_DENIED
if(AIRLOCK_EMAG)
- frame_overlay = get_airlock_overlay("closed", icon)
- sparks_overlay = get_airlock_overlay("sparks", overlays_file)
- if(airlock_material)
- filling_overlay = get_airlock_overlay("[airlock_material]_closed", overlays_file)
- else
- filling_overlay = get_airlock_overlay("fill_closed", icon)
- if(panel_open)
- if(security_level)
- panel_overlay = get_airlock_overlay("panel_closed_protected", overlays_file)
- else
- panel_overlay = get_airlock_overlay("panel_closed", overlays_file)
- if(obj_integrity < integrity_failure * max_integrity)
- damag_overlay = get_airlock_overlay("sparks_broken", overlays_file)
- else if(obj_integrity < (0.75 * max_integrity))
- damag_overlay = get_airlock_overlay("sparks_damaged", overlays_file)
- if(welded)
- weld_overlay = get_airlock_overlay("welded", overlays_file)
- if(seal)
- seal_overlay = get_airlock_overlay("sealed", overlays_file)
- if(note)
- note_overlay = get_airlock_overlay(notetype, note_overlay_file)
-
+ frame_state = AIRLOCK_FRAME_CLOSED
if(AIRLOCK_CLOSING)
- frame_overlay = get_airlock_overlay("closing", icon)
- if(airlock_material)
- filling_overlay = get_airlock_overlay("[airlock_material]_closing", overlays_file)
- else
- filling_overlay = get_airlock_overlay("fill_closing", icon)
- if(lights && hasPower())
- lights_overlay = get_airlock_overlay("lights_closing", overlays_file)
- if(panel_open)
- if(security_level)
- panel_overlay = get_airlock_overlay("panel_closing_protected", overlays_file)
- else
- panel_overlay = get_airlock_overlay("panel_closing", overlays_file)
- if(note)
- note_overlay = get_airlock_overlay("[notetype]_closing", note_overlay_file)
-
+ frame_state = AIRLOCK_FRAME_CLOSING
+ light_state = AIRLOCK_LIGHT_CLOSING
if(AIRLOCK_OPEN)
- frame_overlay = get_airlock_overlay("open", icon)
- if(airlock_material)
- filling_overlay = get_airlock_overlay("[airlock_material]_open", overlays_file)
- else
- filling_overlay = get_airlock_overlay("fill_open", icon)
- if(panel_open)
- if(security_level)
- panel_overlay = get_airlock_overlay("panel_open_protected", overlays_file)
- else
- panel_overlay = get_airlock_overlay("panel_open", overlays_file)
- if(obj_integrity < (0.75 * max_integrity))
- damag_overlay = get_airlock_overlay("sparks_open", overlays_file)
- if(note)
- note_overlay = get_airlock_overlay("[notetype]_open", note_overlay_file)
-
+ frame_state = AIRLOCK_FRAME_OPEN
if(AIRLOCK_OPENING)
- frame_overlay = get_airlock_overlay("opening", icon)
- if(airlock_material)
- filling_overlay = get_airlock_overlay("[airlock_material]_opening", overlays_file)
- else
- filling_overlay = get_airlock_overlay("fill_opening", icon)
- if(lights && hasPower())
- lights_overlay = get_airlock_overlay("lights_opening", overlays_file)
- if(panel_open)
- if(security_level)
- panel_overlay = get_airlock_overlay("panel_opening_protected", overlays_file)
- else
- panel_overlay = get_airlock_overlay("panel_opening", overlays_file)
- if(note)
- note_overlay = get_airlock_overlay("[notetype]_opening", note_overlay_file)
+ frame_state = AIRLOCK_FRAME_OPENING
+ light_state = AIRLOCK_LIGHT_OPENING
- . += frame_overlay
- . += filling_overlay
- . += lights_overlay
- . += panel_overlay
- . += weld_overlay
- . += sparks_overlay
- . += damag_overlay
- . += note_overlay
- . += seal_overlay
+ . += get_airlock_overlay(frame_state, icon, em_block = TRUE)
+ if(airlock_material)
+ . += get_airlock_overlay("[airlock_material]_[frame_state]", overlays_file, em_block = TRUE)
+ else
+ . += get_airlock_overlay("fill_[frame_state]", icon, em_block = TRUE)
+
+ if(lights && hasPower())
+ . += get_airlock_overlay("lights_[light_state]", overlays_file, em_block = FALSE)
+
+ if(panel_open)
+ . += get_airlock_overlay("panel_[frame_state][security_level ? "_protected" : null]", overlays_file, em_block = TRUE)
+ if(frame_state == AIRLOCK_FRAME_CLOSED && welded)
+ . += get_airlock_overlay("welded", overlays_file, em_block = TRUE)
+
+ if(airlock_state == AIRLOCK_EMAG)
+ . += get_airlock_overlay("sparks", overlays_file, em_block = FALSE)
+
+ if(hasPower())
+ if(frame_state == AIRLOCK_FRAME_CLOSED)
+ if(obj_integrity < integrity_failure * max_integrity)
+ . += get_airlock_overlay("sparks_broken", overlays_file, em_block = FALSE)
+ else if(obj_integrity < (0.75 * max_integrity))
+ . += get_airlock_overlay("sparks_damaged", overlays_file, em_block = FALSE)
+ else if(frame_state == AIRLOCK_FRAME_OPEN)
+ if(obj_integrity < (0.75 * max_integrity))
+ . += get_airlock_overlay("sparks_open", overlays_file, em_block = FALSE)
+
+ if(note)
+ . += get_airlock_overlay(note_type(), note_overlay_file, em_block = TRUE)
+
+ if(frame_state == AIRLOCK_FRAME_CLOSED && seal)
+ . += get_airlock_overlay("sealed", overlays_file, em_block = TRUE)
if(hasPower() && unres_sides)
if(unres_sides & NORTH)
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index 8c7f26694b5..a4d14f5fa59 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -19,6 +19,7 @@
damage_deflection = 10
interaction_flags_atom = INTERACT_ATOM_UI_INTERACT
+ blocks_emissive = EMISSIVE_BLOCK_UNIQUE
var/secondsElectrified = MACHINE_NOT_ELECTRIFIED
var/shockedby
diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm
index 3927473e759..34816ad33e9 100644
--- a/code/game/machinery/porta_turret/portable_turret.dm
+++ b/code/game/machinery/porta_turret/portable_turret.dm
@@ -41,6 +41,7 @@ DEFINE_BITFIELD(turret_flags, list(
integrity_failure = 0.5
armor = list(MELEE = 50, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 30, BIO = 0, RAD = 0, FIRE = 90, ACID = 90)
base_icon_state = "standard"
+ blocks_emissive = EMISSIVE_BLOCK_UNIQUE
///if TRUE this will cause the turret to stop working if the stored_gun var is null in process()
var/uses_stored = TRUE
diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm
index daad92cd308..96e71349a5f 100644
--- a/code/game/objects/effects/anomalies.dm
+++ b/code/game/objects/effects/anomalies.dm
@@ -186,6 +186,10 @@
for(var/mob/living/M in range(0, src))
mobShock(M)
+/obj/effect/anomaly/flux/update_overlays()
+ . = ..()
+ . += emissive_appearance(icon, icon_state, alpha=src.alpha)
+
/obj/effect/anomaly/flux/proc/on_entered(datum/source, atom/movable/AM)
SIGNAL_HANDLER
mobShock(AM)
diff --git a/code/game/objects/effects/decals/decal.dm b/code/game/objects/effects/decals/decal.dm
index 42d763ec204..5cf07145fce 100644
--- a/code/game/objects/effects/decals/decal.dm
+++ b/code/game/objects/effects/decals/decal.dm
@@ -45,4 +45,4 @@
var/turf/T = loc
if(!istype(T)) //you know this will happen somehow
CRASH("Turf decal initialized in an object/nullspace")
- T.AddElement(/datum/element/decal, icon, icon_state, dir, FALSE, color, null, null, alpha)
+ T.AddElement(/datum/element/decal, icon, icon_state, dir, null, null, alpha, color, null, FALSE, null)
diff --git a/code/game/objects/effects/effects.dm b/code/game/objects/effects/effects.dm
index 6337dea1596..0c07d868426 100644
--- a/code/game/objects/effects/effects.dm
+++ b/code/game/objects/effects/effects.dm
@@ -7,6 +7,7 @@
move_resist = INFINITY
obj_flags = NONE
vis_flags = VIS_INHERIT_PLANE
+ blocks_emissive = EMISSIVE_BLOCK_GENERIC
/obj/effect/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
return
diff --git a/code/game/objects/items/airlock_painter.dm b/code/game/objects/items/airlock_painter.dm
index bb578410da2..41538d351e9 100644
--- a/code/game/objects/items/airlock_painter.dm
+++ b/code/game/objects/items/airlock_painter.dm
@@ -175,7 +175,7 @@
to_chat(user, "You need to get closer!")
return
if(use_paint(user) && isturf(F))
- F.AddElement(/datum/element/decal, 'icons/turf/decals.dmi', stored_decal_total, stored_dir, CLEAN_TYPE_PAINT, color, null, null, alpha)
+ F.AddElement(/datum/element/decal, 'icons/turf/decals.dmi', stored_decal_total, stored_dir, null, null, alpha, color, null, CLEAN_TYPE_PAINT, null)
/obj/item/airlock_painter/decal/AltClick(mob/user)
. = ..()
diff --git a/code/game/objects/items/devices/reverse_bear_trap.dm b/code/game/objects/items/devices/reverse_bear_trap.dm
index d24b7e21162..8057ea02ac9 100644
--- a/code/game/objects/items/devices/reverse_bear_trap.dm
+++ b/code/game/objects/items/devices/reverse_bear_trap.dm
@@ -113,7 +113,7 @@
/obj/item/reverse_bear_trap/proc/reset()
ticking = FALSE
- update_overlays()
+ update_appearance(UPDATE_OVERLAYS)
REMOVE_TRAIT(src, TRAIT_NODROP, REVERSE_BEAR_TRAP_TRAIT)
soundloop.stop()
soundloop2.stop()
@@ -128,7 +128,7 @@
/obj/item/reverse_bear_trap/proc/arm() //hulen
ticking = TRUE
- update_overlays()
+ update_appearance(UPDATE_OVERLAYS)
escape_chance = initial(escape_chance) //we keep these vars until re-arm, for tracking purposes
time_left = initial(time_left)
ADD_TRAIT(src, TRAIT_NODROP, REVERSE_BEAR_TRAP_TRAIT)
diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm
index 56c9a16a20d..32720d11503 100644
--- a/code/game/objects/items/holy_weapons.dm
+++ b/code/game/objects/items/holy_weapons.dm
@@ -322,8 +322,8 @@
block_chance = 50
var/shield_icon = "shield-red"
-/obj/item/nullrod/staff/worn_overlays(isinhands)
- . = list()
+/obj/item/nullrod/staff/worn_overlays(mutable_appearance/standing, isinhands)
+ . = ..()
if(isinhands)
. += mutable_appearance('icons/effects/effects.dmi', shield_icon, MOB_SHIELD_LAYER)
diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm
index a68cd31ab5f..9e8081a9bda 100644
--- a/code/game/objects/items/stacks/tiles/tile_types.dm
+++ b/code/game/objects/items/stacks/tiles/tile_types.dm
@@ -299,6 +299,628 @@
/obj/item/stack/tile/carpet/donk/thirty
amount = 30
+/obj/item/stack/tile/carpet/neon
+ name = "neon carpet"
+ singular_name = "neon carpet tile"
+ desc = "A piece of rubbery mat inset with a phosphorescent pattern."
+ inhand_icon_state = "tile-neon"
+ turf_type = /turf/open/floor/carpet/neon
+ merge_type = /obj/item/stack/tile/carpet/neon
+
+ // Neon overlay
+ /// The icon used for the neon overlay and emissive overlay.
+ var/neon_icon
+ /// The icon state used for the neon overlay and emissive overlay.
+ var/neon_icon_state
+ /// The icon state used for the neon overlay inhands.
+ var/neon_inhand_icon_state
+ /// The color used for the neon overlay.
+ var/neon_color
+ /// The alpha used for the emissive overlay.
+ var/emissive_alpha = 150
+
+/obj/item/stack/tile/carpet/neon/update_overlays()
+ . = ..()
+ var/mutable_appearance/neon_overlay = mutable_appearance(neon_icon || icon, neon_icon_state || icon_state, alpha = alpha)
+ neon_overlay.color = neon_color
+ . += neon_overlay
+ . += emissive_appearance(neon_icon || icon, neon_icon_state || icon_state, alpha = emissive_alpha)
+
+/obj/item/stack/tile/carpet/neon/worn_overlays(mutable_appearance/standing, isinhands, icon_file)
+ . = ..()
+ if(!isinhands || !neon_inhand_icon_state)
+ return
+
+ var/mutable_appearance/neon_overlay = mutable_appearance(icon_file, neon_inhand_icon_state)
+ neon_overlay.color = neon_color
+ . += neon_overlay
+ . += emissive_appearance(icon_file, neon_inhand_icon_state, alpha = emissive_alpha, appearance_flags = KEEP_APART)
+
+/obj/item/stack/tile/carpet/neon/simple
+ name = "simple neon carpet"
+ singular_name = "simple neon carpet tile"
+ icon_state = "tile_carpet_neon_simple"
+ neon_icon_state = "tile_carpet_neon_simple_light"
+ neon_inhand_icon_state = "tile-neon-glow"
+ turf_type = /turf/open/floor/carpet/neon/simple
+ merge_type = /obj/item/stack/tile/carpet/neon/simple
+ tile_reskin_types = list(
+ /obj/item/stack/tile/carpet/neon/simple,
+ /obj/item/stack/tile/carpet/neon/simple/nodots,
+ )
+
+/obj/item/stack/tile/carpet/neon/simple/nodots
+ icon_state = "tile_carpet_neon_simple_nodots"
+ neon_icon_state = "tile_carpet_neon_simple_light_nodots"
+ neon_inhand_icon_state = "tile-neon-glow-nodots"
+ turf_type = /turf/open/floor/carpet/neon/simple
+ tile_reskin_types = list(
+ /obj/item/stack/tile/carpet/neon/simple,
+ /obj/item/stack/tile/carpet/neon/simple/nodots,
+ )
+
+/obj/item/stack/tile/carpet/neon/simple/white
+ name = "simple white neon carpet"
+ singular_name = "simple white neon carpet tile"
+ turf_type = /turf/open/floor/carpet/neon/simple/white
+ merge_type = /obj/item/stack/tile/carpet/neon/simple/white
+ neon_color = COLOR_WHITE
+ tile_reskin_types = list(
+ /obj/item/stack/tile/carpet/neon/simple/white,
+ /obj/item/stack/tile/carpet/neon/simple/white/nodots,
+ )
+
+/obj/item/stack/tile/carpet/neon/simple/white/nodots
+ icon_state = "tile_carpet_neon_simple_nodots"
+ neon_icon_state = "tile_carpet_neon_simple_light_nodots"
+ turf_type = /turf/open/floor/carpet/neon/simple/white/nodots
+ merge_type = /obj/item/stack/tile/carpet/neon/simple/white/nodots
+ tile_reskin_types = list(
+ /obj/item/stack/tile/carpet/neon/simple/white,
+ /obj/item/stack/tile/carpet/neon/simple/white/nodots,
+ )
+
+/obj/item/stack/tile/carpet/neon/simple/black
+ name = "simple black neon carpet"
+ singular_name = "simple black neon carpet tile"
+ neon_icon_state = "tile_carpet_neon_simple_glow"
+ turf_type = /turf/open/floor/carpet/neon/simple/black
+ merge_type = /obj/item/stack/tile/carpet/neon/simple/black
+ neon_color = COLOR_BLACK
+ tile_reskin_types = list(
+ /obj/item/stack/tile/carpet/neon/simple/black,
+ /obj/item/stack/tile/carpet/neon/simple/black/nodots,
+ )
+
+/obj/item/stack/tile/carpet/neon/simple/black/nodots
+ icon_state = "tile_carpet_neon_simple_nodots"
+ neon_icon_state = "tile_carpet_neon_simple_glow_nodots"
+ turf_type = /turf/open/floor/carpet/neon/simple/black/nodots
+ merge_type = /obj/item/stack/tile/carpet/neon/simple/black/nodots
+ tile_reskin_types = list(
+ /obj/item/stack/tile/carpet/neon/simple/black,
+ /obj/item/stack/tile/carpet/neon/simple/black/nodots,
+ )
+
+/obj/item/stack/tile/carpet/neon/simple/red
+ name = "simple red neon carpet"
+ singular_name = "simple red neon carpet tile"
+ turf_type = /turf/open/floor/carpet/neon/simple/red
+ merge_type = /obj/item/stack/tile/carpet/neon/simple/red
+ neon_color = COLOR_RED
+ tile_reskin_types = list(
+ /obj/item/stack/tile/carpet/neon/simple/red,
+ /obj/item/stack/tile/carpet/neon/simple/red/nodots,
+ )
+
+/obj/item/stack/tile/carpet/neon/simple/red/nodots
+ icon_state = "tile_carpet_neon_simple_nodots"
+ neon_icon_state = "tile_carpet_neon_simple_light_nodots"
+ turf_type = /turf/open/floor/carpet/neon/simple/red/nodots
+ merge_type = /obj/item/stack/tile/carpet/neon/simple/red/nodots
+ tile_reskin_types = list(
+ /obj/item/stack/tile/carpet/neon/simple/red,
+ /obj/item/stack/tile/carpet/neon/simple/red/nodots,
+ )
+
+/obj/item/stack/tile/carpet/neon/simple/orange
+ name = "simple orange neon carpet"
+ singular_name = "simple orange neon carpet tile"
+ turf_type = /turf/open/floor/carpet/neon/simple/orange
+ merge_type = /obj/item/stack/tile/carpet/neon/simple/orange
+ neon_color = COLOR_ORANGE
+ tile_reskin_types = list(
+ /obj/item/stack/tile/carpet/neon/simple/orange,
+ /obj/item/stack/tile/carpet/neon/simple/orange/nodots,
+ )
+
+/obj/item/stack/tile/carpet/neon/simple/orange/nodots
+ icon_state = "tile_carpet_neon_simple_nodots"
+ neon_icon_state = "tile_carpet_neon_simple_light_nodots"
+ turf_type = /turf/open/floor/carpet/neon/simple/orange/nodots
+ merge_type = /obj/item/stack/tile/carpet/neon/simple/orange/nodots
+ tile_reskin_types = list(
+ /obj/item/stack/tile/carpet/neon/simple/orange,
+ /obj/item/stack/tile/carpet/neon/simple/orange/nodots,
+ )
+
+/obj/item/stack/tile/carpet/neon/simple/yellow
+ name = "simple yellow neon carpet"
+ singular_name = "simple yellow neon carpet tile"
+ turf_type = /turf/open/floor/carpet/neon/simple/yellow
+ merge_type = /obj/item/stack/tile/carpet/neon/simple/yellow
+ neon_color = COLOR_YELLOW
+ tile_reskin_types = list(
+ /obj/item/stack/tile/carpet/neon/simple/yellow,
+ /obj/item/stack/tile/carpet/neon/simple/yellow/nodots,
+ )
+
+/obj/item/stack/tile/carpet/neon/simple/yellow/nodots
+ icon_state = "tile_carpet_neon_simple_nodots"
+ neon_icon_state = "tile_carpet_neon_simple_light_nodots"
+ turf_type = /turf/open/floor/carpet/neon/simple/yellow/nodots
+ merge_type = /obj/item/stack/tile/carpet/neon/simple/yellow/nodots
+ tile_reskin_types = list(
+ /obj/item/stack/tile/carpet/neon/simple/yellow,
+ /obj/item/stack/tile/carpet/neon/simple/yellow/nodots,
+ )
+
+/obj/item/stack/tile/carpet/neon/simple/lime
+ name = "simple lime neon carpet"
+ singular_name = "simple lime neon carpet tile"
+ turf_type = /turf/open/floor/carpet/neon/simple/lime
+ merge_type = /obj/item/stack/tile/carpet/neon/simple/lime
+ neon_color = COLOR_LIME
+ tile_reskin_types = list(
+ /obj/item/stack/tile/carpet/neon/simple/lime,
+ /obj/item/stack/tile/carpet/neon/simple/lime/nodots,
+ )
+
+/obj/item/stack/tile/carpet/neon/simple/lime/nodots
+ icon_state = "tile_carpet_neon_simple_nodots"
+ neon_icon_state = "tile_carpet_neon_simple_light_nodots"
+ turf_type = /turf/open/floor/carpet/neon/simple/lime/nodots
+ merge_type = /obj/item/stack/tile/carpet/neon/simple/lime/nodots
+ tile_reskin_types = list(
+ /obj/item/stack/tile/carpet/neon/simple/lime,
+ /obj/item/stack/tile/carpet/neon/simple/lime/nodots,
+ )
+
+/obj/item/stack/tile/carpet/neon/simple/green
+ name = "simple green neon carpet"
+ singular_name = "simple green neon carpet tile"
+ turf_type = /turf/open/floor/carpet/neon/simple/green
+ merge_type = /obj/item/stack/tile/carpet/neon/simple/green
+ neon_color = COLOR_GREEN
+ tile_reskin_types = list(
+ /obj/item/stack/tile/carpet/neon/simple/green,
+ /obj/item/stack/tile/carpet/neon/simple/green/nodots,
+ )
+
+/obj/item/stack/tile/carpet/neon/simple/green/nodots
+ icon_state = "tile_carpet_neon_simple_nodots"
+ neon_icon_state = "tile_carpet_neon_simple_light_nodots"
+ turf_type = /turf/open/floor/carpet/neon/simple/green/nodots
+ merge_type = /obj/item/stack/tile/carpet/neon/simple/green/nodots
+ tile_reskin_types = list(
+ /obj/item/stack/tile/carpet/neon/simple/green,
+ /obj/item/stack/tile/carpet/neon/simple/green/nodots,
+ )
+
+/obj/item/stack/tile/carpet/neon/simple/teal
+ name = "simple teal neon carpet"
+ singular_name = "simple teal neon carpet tile"
+ turf_type = /turf/open/floor/carpet/neon/simple/teal
+ merge_type = /obj/item/stack/tile/carpet/neon/simple/teal
+ neon_color = COLOR_TEAL
+ tile_reskin_types = list(
+ /obj/item/stack/tile/carpet/neon/simple/teal,
+ /obj/item/stack/tile/carpet/neon/simple/teal/nodots,
+ )
+
+/obj/item/stack/tile/carpet/neon/simple/teal/nodots
+ icon_state = "tile_carpet_neon_simple_nodots"
+ neon_icon_state = "tile_carpet_neon_simple_light_nodots"
+ turf_type = /turf/open/floor/carpet/neon/simple/teal/nodots
+ merge_type = /obj/item/stack/tile/carpet/neon/simple/teal/nodots
+ tile_reskin_types = list(
+ /obj/item/stack/tile/carpet/neon/simple/teal,
+ /obj/item/stack/tile/carpet/neon/simple/teal/nodots,
+ )
+
+/obj/item/stack/tile/carpet/neon/simple/cyan
+ name = "simple cyan neon carpet"
+ singular_name = "simple cyan neon carpet tile"
+ turf_type = /turf/open/floor/carpet/neon/simple/cyan
+ merge_type = /obj/item/stack/tile/carpet/neon/simple/cyan
+ neon_color = COLOR_CYAN
+ tile_reskin_types = list(
+ /obj/item/stack/tile/carpet/neon/simple/cyan,
+ /obj/item/stack/tile/carpet/neon/simple/cyan/nodots,
+ )
+
+/obj/item/stack/tile/carpet/neon/simple/cyan/nodots
+ icon_state = "tile_carpet_neon_simple_nodots"
+ neon_icon_state = "tile_carpet_neon_simple_light_nodots"
+ turf_type = /turf/open/floor/carpet/neon/simple/cyan/nodots
+ merge_type = /obj/item/stack/tile/carpet/neon/simple/cyan/nodots
+ tile_reskin_types = list(
+ /obj/item/stack/tile/carpet/neon/simple/cyan,
+ /obj/item/stack/tile/carpet/neon/simple/cyan/nodots,
+ )
+
+/obj/item/stack/tile/carpet/neon/simple/blue
+ name = "simple blue neon carpet"
+ singular_name = "simple blue neon carpet tile"
+ turf_type = /turf/open/floor/carpet/neon/simple/blue
+ merge_type = /obj/item/stack/tile/carpet/neon/simple/blue
+ neon_color = COLOR_BLUE
+ tile_reskin_types = list(
+ /obj/item/stack/tile/carpet/neon/simple/blue,
+ /obj/item/stack/tile/carpet/neon/simple/blue/nodots,
+ )
+
+/obj/item/stack/tile/carpet/neon/simple/blue/nodots
+ icon_state = "tile_carpet_neon_simple_nodots"
+ neon_icon_state = "tile_carpet_neon_simple_light_nodots"
+ turf_type = /turf/open/floor/carpet/neon/simple/blue/nodots
+ merge_type = /obj/item/stack/tile/carpet/neon/simple/blue/nodots
+ tile_reskin_types = list(
+ /obj/item/stack/tile/carpet/neon/simple/blue,
+ /obj/item/stack/tile/carpet/neon/simple/blue/nodots,
+ )
+
+/obj/item/stack/tile/carpet/neon/simple/purple
+ name = "simple purple neon carpet"
+ singular_name = "simple purple neon carpet tile"
+ turf_type = /turf/open/floor/carpet/neon/simple/purple
+ merge_type = /obj/item/stack/tile/carpet/neon/simple/purple
+ neon_color = COLOR_PURPLE
+ tile_reskin_types = list(
+ /obj/item/stack/tile/carpet/neon/simple/purple,
+ /obj/item/stack/tile/carpet/neon/simple/purple/nodots,
+ )
+
+/obj/item/stack/tile/carpet/neon/simple/purple/nodots
+ icon_state = "tile_carpet_neon_simple_nodots"
+ neon_icon_state = "tile_carpet_neon_simple_light_nodots"
+ turf_type = /turf/open/floor/carpet/neon/simple/purple/nodots
+ merge_type = /obj/item/stack/tile/carpet/neon/simple/purple/nodots
+ tile_reskin_types = list(
+ /obj/item/stack/tile/carpet/neon/simple/purple,
+ /obj/item/stack/tile/carpet/neon/simple/purple/nodots,
+ )
+
+/obj/item/stack/tile/carpet/neon/simple/violet
+ name = "simple violet neon carpet"
+ singular_name = "simple violet neon carpet tile"
+ turf_type = /turf/open/floor/carpet/neon/simple/violet
+ merge_type = /obj/item/stack/tile/carpet/neon/simple/violet
+ neon_color = COLOR_VIOLET
+ tile_reskin_types = list(
+ /obj/item/stack/tile/carpet/neon/simple/violet,
+ /obj/item/stack/tile/carpet/neon/simple/violet/nodots,
+ )
+
+/obj/item/stack/tile/carpet/neon/simple/violet/nodots
+ icon_state = "tile_carpet_neon_simple_nodots"
+ neon_icon_state = "tile_carpet_neon_simple_light_nodots"
+ turf_type = /turf/open/floor/carpet/neon/simple/violet/nodots
+ merge_type = /obj/item/stack/tile/carpet/neon/simple/violet/nodots
+ tile_reskin_types = list(
+ /obj/item/stack/tile/carpet/neon/simple/violet,
+ /obj/item/stack/tile/carpet/neon/simple/violet/nodots,
+ )
+
+/obj/item/stack/tile/carpet/neon/simple/pink
+ name = "simple pink neon carpet"
+ singular_name = "simple pink neon carpet tile"
+ turf_type = /turf/open/floor/carpet/neon/simple/pink
+ merge_type = /obj/item/stack/tile/carpet/neon/simple/pink
+ neon_color = COLOR_LIGHT_PINK
+ tile_reskin_types = list(
+ /obj/item/stack/tile/carpet/neon/simple/pink,
+ /obj/item/stack/tile/carpet/neon/simple/pink/nodots,
+ )
+
+/obj/item/stack/tile/carpet/neon/simple/pink/nodots
+ icon_state = "tile_carpet_neon_simple_nodots"
+ neon_icon_state = "tile_carpet_neon_simple_light_nodots"
+ turf_type = /turf/open/floor/carpet/neon/simple/pink/nodots
+ merge_type = /obj/item/stack/tile/carpet/neon/simple/pink/nodots
+ tile_reskin_types = list(
+ /obj/item/stack/tile/carpet/neon/simple/pink,
+ /obj/item/stack/tile/carpet/neon/simple/pink/nodots,
+ )
+
+/obj/item/stack/tile/carpet/neon/ten
+ amount = 10
+
+/obj/item/stack/tile/carpet/neon/thirty
+ amount = 30
+
+/obj/item/stack/tile/carpet/neon/sixty
+ amount = 60
+
+/obj/item/stack/tile/carpet/neon/simple/ten
+ amount = 10
+
+/obj/item/stack/tile/carpet/neon/simple/thirty
+ amount = 30
+
+/obj/item/stack/tile/carpet/neon/simple/sixty
+ amount = 60
+
+/obj/item/stack/tile/carpet/neon/simple/white/ten
+ amount = 10
+
+/obj/item/stack/tile/carpet/neon/simple/white/thirty
+ amount = 30
+
+/obj/item/stack/tile/carpet/neon/simple/white/sixty
+ amount = 60
+
+/obj/item/stack/tile/carpet/neon/simple/black/ten
+ amount = 10
+
+/obj/item/stack/tile/carpet/neon/simple/black/thirty
+ amount = 30
+
+/obj/item/stack/tile/carpet/neon/simple/black/sixty
+ amount = 60
+
+/obj/item/stack/tile/carpet/neon/simple/red/ten
+ amount = 10
+
+/obj/item/stack/tile/carpet/neon/simple/red/thirty
+ amount = 30
+
+/obj/item/stack/tile/carpet/neon/simple/red/sixty
+ amount = 60
+
+/obj/item/stack/tile/carpet/neon/simple/orange/ten
+ amount = 10
+
+/obj/item/stack/tile/carpet/neon/simple/orange/thirty
+ amount = 30
+
+/obj/item/stack/tile/carpet/neon/simple/orange/sixty
+ amount = 60
+
+/obj/item/stack/tile/carpet/neon/simple/yellow/ten
+ amount = 10
+
+/obj/item/stack/tile/carpet/neon/simple/yellow/thirty
+ amount = 30
+
+/obj/item/stack/tile/carpet/neon/simple/yellow/sixty
+ amount = 60
+
+/obj/item/stack/tile/carpet/neon/simple/lime/ten
+ amount = 10
+
+/obj/item/stack/tile/carpet/neon/simple/lime/thirty
+ amount = 30
+
+/obj/item/stack/tile/carpet/neon/simple/lime/sixty
+ amount = 60
+
+/obj/item/stack/tile/carpet/neon/simple/green/ten
+ amount = 10
+
+/obj/item/stack/tile/carpet/neon/simple/green/thirty
+ amount = 30
+
+/obj/item/stack/tile/carpet/neon/simple/green/sixty
+ amount = 60
+
+/obj/item/stack/tile/carpet/neon/simple/teal/ten
+ amount = 10
+
+/obj/item/stack/tile/carpet/neon/simple/teal/thirty
+ amount = 30
+
+/obj/item/stack/tile/carpet/neon/simple/teal/sixty
+ amount = 60
+
+/obj/item/stack/tile/carpet/neon/simple/cyan/ten
+ amount = 10
+
+/obj/item/stack/tile/carpet/neon/simple/cyan/thirty
+ amount = 30
+
+/obj/item/stack/tile/carpet/neon/simple/cyan/sixty
+ amount = 60
+
+/obj/item/stack/tile/carpet/neon/simple/blue/ten
+ amount = 10
+
+/obj/item/stack/tile/carpet/neon/simple/blue/thirty
+ amount = 30
+
+/obj/item/stack/tile/carpet/neon/simple/blue/sixty
+ amount = 60
+
+/obj/item/stack/tile/carpet/neon/simple/purple/ten
+ amount = 10
+
+/obj/item/stack/tile/carpet/neon/simple/purple/thirty
+ amount = 30
+
+/obj/item/stack/tile/carpet/neon/simple/purple/sixty
+ amount = 60
+
+/obj/item/stack/tile/carpet/neon/simple/violet/ten
+ amount = 10
+
+/obj/item/stack/tile/carpet/neon/simple/violet/thirty
+ amount = 30
+
+/obj/item/stack/tile/carpet/neon/simple/violet/sixty
+ amount = 60
+
+/obj/item/stack/tile/carpet/neon/simple/pink/ten
+ amount = 10
+
+/obj/item/stack/tile/carpet/neon/simple/pink/thirty
+ amount = 30
+
+/obj/item/stack/tile/carpet/neon/simple/pink/sixty
+ amount = 60
+
+/obj/item/stack/tile/carpet/neon/simple/nodots/ten
+ amount = 10
+
+/obj/item/stack/tile/carpet/neon/simple/nodots/thirty
+ amount = 30
+
+/obj/item/stack/tile/carpet/neon/simple/nodots/sixty
+ amount = 60
+
+/obj/item/stack/tile/carpet/neon/simple/white/nodots/ten
+ amount = 10
+
+/obj/item/stack/tile/carpet/neon/simple/white/nodots/thirty
+ amount = 30
+
+/obj/item/stack/tile/carpet/neon/simple/white/nodots/sixty
+ amount = 60
+
+/obj/item/stack/tile/carpet/neon/simple/black/nodots/ten
+ amount = 10
+
+/obj/item/stack/tile/carpet/neon/simple/black/nodots/thirty
+ amount = 30
+
+/obj/item/stack/tile/carpet/neon/simple/black/nodots/sixty
+ amount = 60
+
+/obj/item/stack/tile/carpet/neon/simple/red/nodots/ten
+ amount = 10
+
+/obj/item/stack/tile/carpet/neon/simple/red/nodots/thirty
+ amount = 30
+
+/obj/item/stack/tile/carpet/neon/simple/red/nodots/sixty
+ amount = 60
+
+/obj/item/stack/tile/carpet/neon/simple/orange/nodots/ten
+ amount = 10
+
+/obj/item/stack/tile/carpet/neon/simple/orange/nodots/thirty
+ amount = 30
+
+/obj/item/stack/tile/carpet/neon/simple/orange/nodots/sixty
+ amount = 60
+
+/obj/item/stack/tile/carpet/neon/simple/yellow/nodots/ten
+ amount = 10
+
+/obj/item/stack/tile/carpet/neon/simple/yellow/nodots/thirty
+ amount = 30
+
+/obj/item/stack/tile/carpet/neon/simple/yellow/nodots/sixty
+ amount = 60
+
+/obj/item/stack/tile/carpet/neon/simple/lime/nodots/ten
+ amount = 10
+
+/obj/item/stack/tile/carpet/neon/simple/lime/nodots/thirty
+ amount = 30
+
+/obj/item/stack/tile/carpet/neon/simple/lime/nodots/sixty
+ amount = 60
+
+/obj/item/stack/tile/carpet/neon/simple/green/nodots/ten
+ amount = 10
+
+/obj/item/stack/tile/carpet/neon/simple/green/nodots/thirty
+ amount = 30
+
+/obj/item/stack/tile/carpet/neon/simple/green/nodots/sixty
+ amount = 60
+
+/obj/item/stack/tile/carpet/neon/simple/teal/nodots/ten
+ amount = 10
+
+/obj/item/stack/tile/carpet/neon/simple/teal/nodots/thirty
+ amount = 30
+
+/obj/item/stack/tile/carpet/neon/simple/teal/nodots/sixty
+ amount = 60
+
+/obj/item/stack/tile/carpet/neon/simple/cyan/nodots/ten
+ amount = 10
+
+/obj/item/stack/tile/carpet/neon/simple/cyan/nodots/thirty
+ amount = 30
+
+/obj/item/stack/tile/carpet/neon/simple/cyan/nodots/sixty
+ amount = 60
+
+/obj/item/stack/tile/carpet/neon/simple/blue/nodots/ten
+ amount = 10
+
+/obj/item/stack/tile/carpet/neon/simple/blue/nodots/thirty
+ amount = 30
+
+/obj/item/stack/tile/carpet/neon/simple/blue/nodots/sixty
+ amount = 60
+
+/obj/item/stack/tile/carpet/neon/simple/purple/nodots/ten
+ amount = 10
+
+/obj/item/stack/tile/carpet/neon/simple/purple/nodots/thirty
+ amount = 30
+
+/obj/item/stack/tile/carpet/neon/simple/purple/nodots/sixty
+ amount = 60
+
+/obj/item/stack/tile/carpet/neon/simple/violet/nodots/ten
+ amount = 10
+
+/obj/item/stack/tile/carpet/neon/simple/violet/nodots/thirty
+ amount = 30
+
+/obj/item/stack/tile/carpet/neon/simple/violet/nodots/sixty
+ amount = 60
+
+/obj/item/stack/tile/carpet/neon/simple/pink/nodots/ten
+ amount = 10
+
+/obj/item/stack/tile/carpet/neon/simple/pink/nodots/thirty
+ amount = 30
+
+/obj/item/stack/tile/carpet/neon/simple/pink/nodots/sixty
+ amount = 60
+
+/obj/item/stack/tile/fake_error
+ name = "misproduced carpet"
+ singular_name = "misproduced carpet tile"
+ desc = "A piece of neon carpet produced under a software error."
+ icon_state = "tile-error"
+ inhand_icon_state = "tile-error"
+ turf_type = /turf/open/floor/fake_error
+ merge_type = /obj/item/stack/tile/fake_error
+ resistance_flags = FLAMMABLE
+
+/obj/item/stack/tile/fake_error/update_overlays()
+ . = ..()
+ . += emissive_appearance(icon, icon_state, alpha = alpha)
+
+/obj/item/stack/tile/fake_error/worn_overlays(mutable_appearance/standing, isinhands, icon_file)
+ . = ..()
+ . += emissive_appearance(standing.icon, standing.icon_state, alpha = standing.alpha, appearance_flags = KEEP_APART)
+
+/obj/item/stack/tile/fake_error/ten
+ amount = 10
+
+/obj/item/stack/tile/fake_error/thirty
+ amount = 30
+
+/obj/item/stack/tile/fake_error/sixty
+ amount = 60
+
/obj/item/stack/tile/fakespace
name = "astral carpet"
singular_name = "astral carpet tile"
@@ -489,3 +1111,31 @@
turf_type = /turf/open/floor/cult
mats_per_unit = list(/datum/material/runedmetal=500)
merge_type = /obj/item/stack/tile/cult
+
+/// Floor tiles used to test emissive turfs.
+/obj/item/stack/tile/emissive_test
+ name = "emissive test tile"
+ singular_name = "emissive test floor tile"
+ desc = "A glow-in-the-dark floor tile used to test emissive turfs."
+ turf_type = /turf/open/floor/emissive_test
+ merge_type = /obj/item/stack/tile/emissive_test
+
+/obj/item/stack/tile/emissive_test/update_overlays()
+ . = ..()
+ . += emissive_appearance(icon, icon_state, alpha = alpha)
+
+/obj/item/stack/tile/emissive_test/worn_overlays(mutable_appearance/standing, isinhands, icon_file)
+ . = ..()
+ . += emissive_appearance(standing.icon, standing.icon_state, alpha = standing.alpha, appearance_flags = KEEP_APART)
+
+/obj/item/stack/tile/emissive_test/sixty
+ amount = 60
+
+/obj/item/stack/tile/emissive_test/white
+ name = "white emissive test tile"
+ singular_name = "white emissive test floor tile"
+ turf_type = /turf/open/floor/emissive_test/white
+ merge_type = /obj/item/stack/tile/emissive_test/white
+
+/obj/item/stack/tile/emissive_test/white/sixty
+ amount = 60
diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm
index c65ecd47e16..401e4e8cd99 100644
--- a/code/game/objects/items/tanks/watertank.dm
+++ b/code/game/objects/items/tanks/watertank.dm
@@ -374,23 +374,24 @@
turn_on()
//Todo : cache these.
-/obj/item/reagent_containers/chemtank/worn_overlays(isinhands = FALSE) //apply chemcolor and level
- . = list()
+/obj/item/reagent_containers/chemtank/worn_overlays(mutable_appearance/standing, isinhands = FALSE) //apply chemcolor and level
+ . = ..()
//inhands + reagent_filling
- if(!isinhands && reagents.total_volume)
- var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "backpackmob-10")
+ if(isinhands || !reagents.total_volume)
+ return
- var/percent = round((reagents.total_volume / volume) * 100)
- switch(percent)
- if(0 to 15)
- filling.icon_state = "backpackmob-10"
- if(16 to 60)
- filling.icon_state = "backpackmob50"
- if(61 to INFINITY)
- filling.icon_state = "backpackmob100"
+ var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "backpackmob-10")
+ var/percent = round((reagents.total_volume / volume) * 100)
+ switch(percent)
+ if(0 to 15)
+ filling.icon_state = "backpackmob-10"
+ if(16 to 60)
+ filling.icon_state = "backpackmob50"
+ if(61 to INFINITY)
+ filling.icon_state = "backpackmob100"
- filling.color = mix_color_from_reagents(reagents.reagent_list)
- . += filling
+ filling.color = mix_color_from_reagents(reagents.reagent_list)
+ . += filling
/obj/item/reagent_containers/chemtank/proc/turn_on()
on = TRUE
diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm
index f5ed1357ba6..b6930dae312 100644
--- a/code/game/objects/structures.dm
+++ b/code/game/objects/structures.dm
@@ -8,6 +8,7 @@
flags_ricochet = RICOCHET_HARD
receive_ricochet_chance_mod = 0.6
pass_flags_self = PASSSTRUCTURE
+ blocks_emissive = EMISSIVE_BLOCK_GENERIC
var/broken = FALSE
/obj/structure/Initialize()
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 3d09124aaa0..d3a69e93237 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -10,6 +10,7 @@
max_integrity = 200
integrity_failure = 0.25
armor = list(MELEE = 20, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 70, ACID = 60)
+ blocks_emissive = EMISSIVE_BLOCK_UNIQUE
var/icon_door = null
var/icon_door_override = FALSE //override to have open overlay use icon different to its base's
@@ -81,9 +82,12 @@
. = new_overlays
if(opened)
. += "[icon_door_override ? icon_door : icon_state]_open"
+ var/mutable_appearance/door_blocker = mutable_appearance(icon, "[icon_door || icon_state]_open", plane = EMISSIVE_PLANE)
+ door_blocker.color = GLOB.em_block_color
+ . += door_blocker // If we don't do this the door doesn't block emissives and it looks weird.
return
- . += "[icon_door || icon_state]_door"
+ . += mutable_appearance(icon, "[icon_door || icon_state]_door")
if(welded)
. += icon_welded
diff --git a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm
index 50328bdf544..2c38cbeeb21 100644
--- a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm
+++ b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm
@@ -57,10 +57,11 @@
/// Does the MGS ! animation
/atom/proc/do_alert_animation()
- var/image/I = image('icons/obj/closet.dmi', src, "cardboard_special", layer+1)
- flick_overlay_view(I, src, 8)
- I.alpha = 0
- animate(I, pixel_z = 32, alpha = 255, time = 5, easing = ELASTIC_EASING)
+ var/image/alert_image = image('icons/obj/closet.dmi', src, "cardboard_special", layer+1)
+ alert_image.plane = ABOVE_LIGHTING_PLANE
+ flick_overlay_view(alert_image, src, 8)
+ alert_image.alpha = 0
+ animate(alert_image, pixel_z = 32, alpha = 255, time = 5, easing = ELASTIC_EASING)
/obj/structure/closet/cardboard/metal
diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm
index d11d5b8b76e..2259c22625e 100644
--- a/code/game/objects/structures/door_assembly.dm
+++ b/code/game/objects/structures/door_assembly.dm
@@ -277,10 +277,10 @@
/obj/structure/door_assembly/update_overlays()
. = ..()
if(!glass)
- . += get_airlock_overlay("fill_construction", icon)
+ . += get_airlock_overlay("fill_construction", icon, TRUE)
else
- . += get_airlock_overlay("glass_construction", overlays_file)
- . += get_airlock_overlay("panel_c[state+1]", overlays_file)
+ . += get_airlock_overlay("glass_construction", overlays_file, TRUE)
+ . += get_airlock_overlay("panel_c[state+1]", overlays_file, TRUE)
/obj/structure/door_assembly/update_name()
name = ""
diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm
index 3072a9ce800..5f7a7444aae 100644
--- a/code/game/objects/structures/false_walls.dm
+++ b/code/game/objects/structures/false_walls.dm
@@ -55,9 +55,9 @@
update_appearance()
air_update_turf(TRUE, !density)
-/obj/structure/falsewall/update_icon()//Calling icon_update will refresh the smoothwalls if it's closed, otherwise it will make sure the icon is correct if it's open
+/obj/structure/falsewall/update_icon(updates=ALL)//Calling icon_update will refresh the smoothwalls if it's closed, otherwise it will make sure the icon is correct if it's open
. = ..()
- if(!density)
+ if(!density || !(updates & UPDATE_SMOOTHING))
return
if(opening)
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index 436bdfaba5f..2b6fcfef9cf 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -36,7 +36,7 @@
return
. = ..()
- if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK))
+ if((updates & UPDATE_SMOOTHING) && (smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)))
QUEUE_SMOOTH(src)
/obj/structure/grille/update_icon_state()
diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm
index 04e4e3d0814..5942e1be507 100644
--- a/code/game/objects/structures/statues.dm
+++ b/code/game/objects/structures/statues.dm
@@ -9,6 +9,7 @@
CanAtmosPass = ATMOS_PASS_DENSITY
material_modifier = 0.5
material_flags = MATERIAL_AFFECT_STATISTICS
+ blocks_emissive = EMISSIVE_BLOCK_UNIQUE
/// Beauty component mood modifier
var/impressiveness = 15
/// Art component subtype added to this statue
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index f0731cd9f2a..57ac90e3044 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -49,9 +49,9 @@
/obj/structure/table/proc/deconstruction_hints(mob/user)
return "The top is screwed on, but the main bolts are also visible."
-/obj/structure/table/update_icon()
+/obj/structure/table/update_icon(updates=ALL)
. = ..()
- if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK))
+ if((updates & UPDATE_SMOOTHING) && (smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)))
QUEUE_SMOOTH(src)
QUEUE_SMOOTH_NEIGHBORS(src)
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index 25d1382ad7e..577fb3371bf 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -329,12 +329,12 @@
QUEUE_SMOOTH_NEIGHBORS(src)
//merges adjacent full-tile windows into one
-/obj/structure/window/update_overlays()
+/obj/structure/window/update_overlays(updates=ALL)
. = ..()
if(QDELETED(src) || !fulltile)
return
- if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK))
+ if((updates & UPDATE_SMOOTHING) && (smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)))
QUEUE_SMOOTH(src)
var/ratio = obj_integrity / max_integrity
@@ -813,9 +813,9 @@
. = ..()
set_opacity(obj_integrity >= max_integrity)
-/obj/structure/window/paperframe/update_icon()
+/obj/structure/window/paperframe/update_icon(updates=ALL)
. = ..()
- if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK))
+ if((updates & UPDATE_SMOOTHING) && (smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)))
QUEUE_SMOOTH(src)
/obj/structure/window/paperframe/update_overlays()
diff --git a/code/game/turfs/closed/wall/reinf_walls.dm b/code/game/turfs/closed/wall/reinf_walls.dm
index 9b1affd5ee4..3b1a33d1950 100644
--- a/code/game/turfs/closed/wall/reinf_walls.dm
+++ b/code/game/turfs/closed/wall/reinf_walls.dm
@@ -197,9 +197,9 @@
return TRUE
return FALSE
-/turf/closed/wall/r_wall/update_icon()
+/turf/closed/wall/r_wall/update_icon(updates=ALL)
. = ..()
- if(d_state != INTACT)
+ if(!(updates & UPDATE_SMOOTHING) || (d_state != INTACT))
smoothing_flags = NONE
return
smoothing_flags = SMOOTH_BITMASK
diff --git a/code/game/turfs/open/floor/fancy_floor.dm b/code/game/turfs/open/floor/fancy_floor.dm
index 56570508ae8..1b3fd8ba381 100644
--- a/code/game/turfs/open/floor/fancy_floor.dm
+++ b/code/game/turfs/open/floor/fancy_floor.dm
@@ -234,9 +234,9 @@
. = ..()
update_appearance()
-/turf/open/floor/carpet/update_icon()
+/turf/open/floor/carpet/update_icon(updates=ALL)
. = ..()
- if(!.)
+ if(!. || !(updates & UPDATE_SMOOTHING))
return
if(!broken && !burnt)
if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK))
@@ -405,6 +405,373 @@
/turf/open/floor/carpet/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir)
return FALSE
+/// An emissive turf used to test emissive turfs.
+/turf/open/floor/emissive_test
+ name = "emissive test floor"
+ desc = "A glow-in-the-dark floor used to test emissive turfs."
+ floor_tile = /obj/item/stack/tile/emissive_test
+
+/turf/open/floor/emissive_test/update_overlays()
+ . = ..()
+ . += emissive_appearance(icon, icon_state, alpha = src.alpha)
+
+/turf/open/floor/emissive_test/white
+ icon_state = "pure_white"
+ base_icon_state = "pure_white"
+ floor_tile = /obj/item/stack/tile/emissive_test/white
+
+/turf/open/floor/carpet/neon
+ name = "neon carpet"
+ desc = "A rubbery pad inset with a phsophorescent pattern."
+ icon = 'icons/turf/floors/carpet_black.dmi'
+ icon_state = "carpet_black-255"
+ base_icon_state = "carpet_black"
+ smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_NEON)
+ canSmoothWith = list(SMOOTH_GROUP_CARPET_NEON)
+ smoothing_junction = 255
+
+ /// The icon used for the neon decal.
+ var/neon_icon
+ /// The icon state used for the neon decal.
+ var/neon_icon_state
+ /// The color used for the neon decal
+ var/neon_color
+ /// The alpha used for the emissive decal.
+ var/emissive_alpha = 150
+
+/turf/open/floor/carpet/neon/Initialize()
+ . = ..()
+ AddElement(/datum/element/decal, neon_icon || icon, neon_icon_state || base_icon_state, dir, null, null, alpha, neon_color, smoothing_junction)
+ AddElement(/datum/element/decal, neon_icon || icon, neon_icon_state || base_icon_state, dir, EMISSIVE_PLANE, null, emissive_alpha, EMISSIVE_COLOR, smoothing_junction)
+
+/turf/open/floor/carpet/neon/simple
+ name = "simple neon carpet"
+ icon = 'icons/turf/floors/carpet_neon_simple.dmi'
+ icon_state = "base-255"
+ base_icon_state = "base"
+ neon_icon_state = "light"
+ floor_tile = /obj/item/stack/tile/carpet/neon/simple
+ smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON)
+ canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON)
+
+/turf/open/floor/carpet/neon/simple/nodots
+ icon_state = "base-nodots-255"
+ base_icon_state = "base-nodots"
+ neon_icon_state = "light-nodots"
+ floor_tile = /obj/item/stack/tile/carpet/neon/simple/nodots
+ smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_NODOTS)
+ canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_NODOTS)
+
+/turf/open/floor/carpet/neon/simple/white
+ name = "simple white neon carpet"
+ desc = "A rubbery mat with a inset pattern of white phosphorescent dye."
+ neon_color = COLOR_WHITE
+ floor_tile = /obj/item/stack/tile/carpet/neon/simple/white
+ smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_WHITE)
+ canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_WHITE)
+
+/turf/open/floor/carpet/neon/simple/white/nodots
+ icon_state = "base-nodots-255"
+ base_icon_state = "base-nodots"
+ neon_icon_state = "light-nodots"
+ floor_tile = /obj/item/stack/tile/carpet/neon/simple/white/nodots
+ smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_WHITE_NODOTS)
+ canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_WHITE_NODOTS)
+
+/turf/open/floor/carpet/neon/simple/black
+ name = "simple black neon carpet"
+ desc = "A rubbery mat with a inset pattern of black phosphorescent dye."
+ neon_icon_state = "glow" // This one also lights up the edges of the lines.
+ neon_color = COLOR_BLACK
+ floor_tile = /obj/item/stack/tile/carpet/neon/simple/black
+ smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLACK)
+ canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLACK)
+
+/turf/open/floor/carpet/neon/simple/black/nodots
+ icon_state = "base-nodots-255"
+ base_icon_state = "base-nodots"
+ neon_icon_state = "glow-nodots"
+ neon_color = COLOR_BLACK
+ floor_tile = /obj/item/stack/tile/carpet/neon/simple/black/nodots
+ smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLACK_NODOTS)
+ canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLACK_NODOTS)
+
+/turf/open/floor/carpet/neon/simple/red
+ name = "simple red neon carpet"
+ desc = "A rubbery mat with a inset pattern of red phosphorescent dye."
+ neon_color = COLOR_RED
+ floor_tile = /obj/item/stack/tile/carpet/neon/simple/red
+ smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_RED)
+ canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_RED)
+
+/turf/open/floor/carpet/neon/simple/red/nodots
+ icon_state = "base-nodots-255"
+ base_icon_state = "base-nodots"
+ neon_icon_state = "light-nodots"
+ floor_tile = /obj/item/stack/tile/carpet/neon/simple/red/nodots
+ smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_RED_NODOTS)
+ canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_RED_NODOTS)
+
+/turf/open/floor/carpet/neon/simple/orange
+ name = "simple orange neon carpet"
+ desc = "A rubbery mat with a inset pattern of orange phosphorescent dye."
+ neon_color = COLOR_ORANGE
+ floor_tile = /obj/item/stack/tile/carpet/neon/simple/orange
+ smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_ORANGE)
+ canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_ORANGE)
+
+/turf/open/floor/carpet/neon/simple/orange/nodots
+ icon_state = "base-nodots-255"
+ base_icon_state = "base-nodots"
+ neon_icon_state = "light-nodots"
+ floor_tile = /obj/item/stack/tile/carpet/neon/simple/orange/nodots
+ smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_ORANGE_NODOTS)
+ canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_ORANGE_NODOTS)
+
+/turf/open/floor/carpet/neon/simple/yellow
+ name = "simple yellow neon carpet"
+ desc = "A rubbery mat with a inset pattern of yellow phosphorescent dye."
+ neon_color = COLOR_YELLOW
+ floor_tile = /obj/item/stack/tile/carpet/neon/simple/yellow
+ smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_YELLOW)
+ canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_YELLOW)
+
+/turf/open/floor/carpet/neon/simple/yellow/nodots
+ icon_state = "base-nodots-255"
+ base_icon_state = "base-nodots"
+ neon_icon_state = "light-nodots"
+ floor_tile = /obj/item/stack/tile/carpet/neon/simple/yellow/nodots
+ smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_YELLOW_NODOTS)
+ canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_YELLOW_NODOTS)
+
+/turf/open/floor/carpet/neon/simple/lime
+ name = "simple lime neon carpet"
+ desc = "A rubbery mat with a inset pattern of lime phosphorescent dye."
+ neon_color = COLOR_LIME
+ floor_tile = /obj/item/stack/tile/carpet/neon/simple/lime
+ smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_LIME)
+ canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_LIME)
+
+/turf/open/floor/carpet/neon/simple/lime/nodots
+ icon_state = "base-nodots-255"
+ base_icon_state = "base-nodots"
+ neon_icon_state = "light-nodots"
+ floor_tile = /obj/item/stack/tile/carpet/neon/simple/lime/nodots
+ smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_LIME_NODOTS)
+ canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_LIME_NODOTS)
+
+/turf/open/floor/carpet/neon/simple/green
+ name = "simple green neon carpet"
+ desc = "A rubbery mat with a inset pattern of green phosphorescent dye."
+ neon_color = COLOR_GREEN
+ floor_tile = /obj/item/stack/tile/carpet/neon/simple/green
+ smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_GREEN)
+ canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_GREEN)
+
+/turf/open/floor/carpet/neon/simple/green/nodots
+ icon_state = "base-nodots-255"
+ base_icon_state = "base-nodots"
+ neon_icon_state = "light-nodots"
+ floor_tile = /obj/item/stack/tile/carpet/neon/simple/green/nodots
+ smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_GREEN_NODOTS)
+ canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_GREEN_NODOTS)
+
+/turf/open/floor/carpet/neon/simple/teal
+ name = "simple teal neon carpet"
+ desc = "A rubbery mat with a inset pattern of teal phosphorescent dye."
+ neon_color = COLOR_TEAL
+ floor_tile = /obj/item/stack/tile/carpet/neon/simple/teal
+ smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_TEAL)
+ canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_TEAL)
+
+/turf/open/floor/carpet/neon/simple/teal/nodots
+ icon_state = "base-nodots-255"
+ base_icon_state = "base-nodots"
+ neon_icon_state = "light-nodots"
+ floor_tile = /obj/item/stack/tile/carpet/neon/simple/teal/nodots
+ smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_TEAL_NODOTS)
+ canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_TEAL_NODOTS)
+
+/turf/open/floor/carpet/neon/simple/cyan
+ name = "simple cyan neon carpet"
+ desc = "A rubbery mat with a inset pattern of cyan phosphorescent dye."
+ neon_color = COLOR_CYAN
+ floor_tile = /obj/item/stack/tile/carpet/neon/simple/cyan
+ smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_CYAN)
+ canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_CYAN)
+
+/turf/open/floor/carpet/neon/simple/cyan/nodots
+ icon_state = "base-nodots-255"
+ base_icon_state = "base-nodots"
+ neon_icon_state = "light-nodots"
+ floor_tile = /obj/item/stack/tile/carpet/neon/simple/cyan/nodots
+ smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_CYAN_NODOTS)
+ canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_CYAN_NODOTS)
+
+/turf/open/floor/carpet/neon/simple/blue
+ name = "simple blue neon carpet"
+ desc = "A rubbery mat with a inset pattern of blue phosphorescent dye."
+ neon_color = COLOR_BLUE
+ floor_tile = /obj/item/stack/tile/carpet/neon/simple/blue
+ smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLUE)
+ canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLUE)
+
+/turf/open/floor/carpet/neon/simple/blue/nodots
+ icon_state = "base-nodots-255"
+ base_icon_state = "base-nodots"
+ neon_icon_state = "light-nodots"
+ floor_tile = /obj/item/stack/tile/carpet/neon/simple/blue/nodots
+ smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLUE_NODOTS)
+ canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLUE_NODOTS)
+
+/turf/open/floor/carpet/neon/simple/purple
+ name = "simple purple neon carpet"
+ desc = "A rubbery mat with a inset pattern of purple phosphorescent dye."
+ neon_color = COLOR_PURPLE
+ floor_tile = /obj/item/stack/tile/carpet/neon/simple/purple
+ smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_PURPLE)
+ canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_PURPLE)
+
+/turf/open/floor/carpet/neon/simple/purple/nodots
+ icon_state = "base-nodots-255"
+ base_icon_state = "base-nodots"
+ neon_icon_state = "light-nodots"
+ floor_tile = /obj/item/stack/tile/carpet/neon/simple/purple/nodots
+ smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_PURPLE_NODOTS)
+ canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_PURPLE_NODOTS)
+
+/turf/open/floor/carpet/neon/simple/violet
+ name = "simple violet neon carpet"
+ desc = "A rubbery mat with a inset pattern of violet phosphorescent dye."
+ neon_color = COLOR_VIOLET
+ floor_tile = /obj/item/stack/tile/carpet/neon/simple/violet
+ smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_VIOLET)
+ canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_VIOLET)
+
+/turf/open/floor/carpet/neon/simple/violet/nodots
+ icon_state = "base-nodots-255"
+ base_icon_state = "base-nodots"
+ neon_icon_state = "light-nodots"
+ floor_tile = /obj/item/stack/tile/carpet/neon/simple/violet/nodots
+ smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_VIOLET_NODOTS)
+ canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_VIOLET_NODOTS)
+
+/turf/open/floor/carpet/neon/simple/pink
+ name = "simple pink neon carpet"
+ desc = "A rubbery mat with a inset pattern of pink phosphorescent dye."
+ neon_color = COLOR_LIGHT_PINK
+ floor_tile = /obj/item/stack/tile/carpet/neon/simple/pink
+ smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_PINK)
+ canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_PINK)
+
+/turf/open/floor/carpet/neon/simple/pink/nodots
+ icon_state = "base-nodots-255"
+ base_icon_state = "base-nodots"
+ neon_icon_state = "light-nodots"
+ floor_tile = /obj/item/stack/tile/carpet/neon/simple/pink/nodots
+ smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_PINK_NODOTS)
+ canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_PINK_NODOTS)
+
+/turf/open/floor/carpet/neon/airless
+ initial_gas_mix = AIRLESS_ATMOS
+
+/turf/open/floor/carpet/neon/simple/airless
+ initial_gas_mix = AIRLESS_ATMOS
+
+/turf/open/floor/carpet/neon/simple/white/airless
+ initial_gas_mix = AIRLESS_ATMOS
+
+/turf/open/floor/carpet/neon/simple/black/airless
+ initial_gas_mix = AIRLESS_ATMOS
+
+/turf/open/floor/carpet/neon/simple/red/airless
+ initial_gas_mix = AIRLESS_ATMOS
+
+/turf/open/floor/carpet/neon/simple/orange/airless
+ initial_gas_mix = AIRLESS_ATMOS
+
+/turf/open/floor/carpet/neon/simple/yellow/airless
+ initial_gas_mix = AIRLESS_ATMOS
+
+/turf/open/floor/carpet/neon/simple/lime/airless
+ initial_gas_mix = AIRLESS_ATMOS
+
+/turf/open/floor/carpet/neon/simple/green/airless
+ initial_gas_mix = AIRLESS_ATMOS
+
+/turf/open/floor/carpet/neon/simple/teal/airless
+ initial_gas_mix = AIRLESS_ATMOS
+
+/turf/open/floor/carpet/neon/simple/cyan/airless
+ initial_gas_mix = AIRLESS_ATMOS
+
+/turf/open/floor/carpet/neon/simple/blue/airless
+ initial_gas_mix = AIRLESS_ATMOS
+
+/turf/open/floor/carpet/neon/simple/purple/airless
+ initial_gas_mix = AIRLESS_ATMOS
+
+/turf/open/floor/carpet/neon/simple/violet/airless
+ initial_gas_mix = AIRLESS_ATMOS
+
+/turf/open/floor/carpet/neon/simple/pink/airless
+ initial_gas_mix = AIRLESS_ATMOS
+
+/turf/open/floor/carpet/neon/simple/nodots/airless
+ initial_gas_mix = AIRLESS_ATMOS
+
+/turf/open/floor/carpet/neon/simple/white/nodots/airless
+ initial_gas_mix = AIRLESS_ATMOS
+
+/turf/open/floor/carpet/neon/simple/black/nodots/airless
+ initial_gas_mix = AIRLESS_ATMOS
+
+/turf/open/floor/carpet/neon/simple/red/nodots/airless
+ initial_gas_mix = AIRLESS_ATMOS
+
+/turf/open/floor/carpet/neon/simple/orange/nodots/airless
+ initial_gas_mix = AIRLESS_ATMOS
+
+/turf/open/floor/carpet/neon/simple/yellow/nodots/airless
+ initial_gas_mix = AIRLESS_ATMOS
+
+/turf/open/floor/carpet/neon/simple/lime/nodots/airless
+ initial_gas_mix = AIRLESS_ATMOS
+
+/turf/open/floor/carpet/neon/simple/green/nodots/airless
+ initial_gas_mix = AIRLESS_ATMOS
+
+/turf/open/floor/carpet/neon/simple/teal/nodots/airless
+ initial_gas_mix = AIRLESS_ATMOS
+
+/turf/open/floor/carpet/neon/simple/cyan/nodots/airless
+ initial_gas_mix = AIRLESS_ATMOS
+
+/turf/open/floor/carpet/neon/simple/blue/nodots/airless
+ initial_gas_mix = AIRLESS_ATMOS
+
+/turf/open/floor/carpet/neon/simple/purple/nodots/airless
+ initial_gas_mix = AIRLESS_ATMOS
+
+/turf/open/floor/carpet/neon/simple/violet/nodots/airless
+ initial_gas_mix = AIRLESS_ATMOS
+
+/turf/open/floor/carpet/neon/simple/pink/nodots/airless
+ initial_gas_mix = AIRLESS_ATMOS
+
+/turf/open/floor/fake_error
+ name = ""
+ desc = "Neon carpet produced when a software error occured at the production line."
+ icon = 'icons/turf/floors.dmi'
+ base_icon_state = "fake_error"
+ icon_state = "fake_error"
+
+/turf/open/floor/fake_error/update_overlays()
+ . = ..()
+ . += emissive_appearance(icon, "fake_error_glow", alpha=src.alpha)
+
+/turf/open/floor/fake_error/airless
+ initial_gas_mix = AIRLESS_ATMOS
/turf/open/floor/fakepit
desc = "A clever illusion designed to look like a bottomless pit."
diff --git a/code/modules/buildmode/submodes/advanced.dm b/code/modules/buildmode/submodes/advanced.dm
index 93aa62c41f0..701667b5a1e 100644
--- a/code/modules/buildmode/submodes/advanced.dm
+++ b/code/modules/buildmode/submodes/advanced.dm
@@ -49,7 +49,7 @@
T.setDir(BM.build_dir)
else if(ispath(objholder, /obj/effect/turf_decal))
var/turf/T = get_turf(object)
- T.AddElement(/datum/element/decal, initial(objholder.icon), initial(objholder.icon_state), BM.build_dir, FALSE, initial(objholder.color), null, null, initial(objholder.alpha))
+ T.AddElement(/datum/element/decal, initial(objholder.icon), initial(objholder.icon_state), BM.build_dir, null, null, initial(objholder.alpha), initial(objholder.color), null, FALSE, null)
log_admin("Build Mode: [key_name(c)] in [AREACOORD(object)] added a [initial(objholder.name)] decal with dir [BM.build_dir] to [T]")
else if(!isnull(objholder))
var/obj/A = new objholder (get_turf(object))
diff --git a/code/modules/buildmode/submodes/fill.dm b/code/modules/buildmode/submodes/fill.dm
index 747bc6ac463..0e67ab640a7 100644
--- a/code/modules/buildmode/submodes/fill.dm
+++ b/code/modules/buildmode/submodes/fill.dm
@@ -65,7 +65,7 @@
T = T.ChangeTurf(objholder)
T.setDir(BM.build_dir)
else if(ispath(objholder, /obj/effect/turf_decal))
- T.AddElement(/datum/element/decal, initial(objholder.icon), initial(objholder.icon_state), BM.build_dir, FALSE, initial(objholder.color), null, null, initial(objholder.alpha))
+ T.AddElement(/datum/element/decal, initial(objholder.icon), initial(objholder.icon_state), BM.build_dir, null, null, initial(objholder.alpha), initial(objholder.color), null, FALSE, null)
else
var/obj/A = new objholder(T)
A.setDir(BM.build_dir)
diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm
index afd27b4d9f6..903dbec1b9b 100644
--- a/code/modules/cargo/packs.dm
+++ b/code/modules/cargo/packs.dm
@@ -1614,6 +1614,40 @@
/obj/item/stack/tile/carpet/royalblack/fifty)
crate_name = "exotic carpet crate"
+/datum/supply_pack/service/carpet_neon
+ name = "Simple Neon Carpet Crate"
+ desc = "Simple rubbery mats with phosphorescent lining. Contains 120 tiles each of 13 color variants. Limited edition release."
+ cost = CARGO_CRATE_VALUE * 15
+ contains = list(
+ /obj/item/stack/tile/carpet/neon/simple/white/sixty,
+ /obj/item/stack/tile/carpet/neon/simple/white/sixty,
+ /obj/item/stack/tile/carpet/neon/simple/black/sixty,
+ /obj/item/stack/tile/carpet/neon/simple/black/sixty,
+ /obj/item/stack/tile/carpet/neon/simple/red/sixty,
+ /obj/item/stack/tile/carpet/neon/simple/red/sixty,
+ /obj/item/stack/tile/carpet/neon/simple/orange/sixty,
+ /obj/item/stack/tile/carpet/neon/simple/orange/sixty,
+ /obj/item/stack/tile/carpet/neon/simple/yellow/sixty,
+ /obj/item/stack/tile/carpet/neon/simple/yellow/sixty,
+ /obj/item/stack/tile/carpet/neon/simple/lime/sixty,
+ /obj/item/stack/tile/carpet/neon/simple/lime/sixty,
+ /obj/item/stack/tile/carpet/neon/simple/green/sixty,
+ /obj/item/stack/tile/carpet/neon/simple/green/sixty,
+ /obj/item/stack/tile/carpet/neon/simple/teal/sixty,
+ /obj/item/stack/tile/carpet/neon/simple/teal/sixty,
+ /obj/item/stack/tile/carpet/neon/simple/cyan/sixty,
+ /obj/item/stack/tile/carpet/neon/simple/cyan/sixty,
+ /obj/item/stack/tile/carpet/neon/simple/blue/sixty,
+ /obj/item/stack/tile/carpet/neon/simple/blue/sixty,
+ /obj/item/stack/tile/carpet/neon/simple/purple/sixty,
+ /obj/item/stack/tile/carpet/neon/simple/purple/sixty,
+ /obj/item/stack/tile/carpet/neon/simple/violet/sixty,
+ /obj/item/stack/tile/carpet/neon/simple/violet/sixty,
+ /obj/item/stack/tile/carpet/neon/simple/pink/sixty,
+ /obj/item/stack/tile/carpet/neon/simple/pink/sixty,
+ )
+ crate_name = "neon carpet crate"
+
/datum/supply_pack/service/lightbulbs
name = "Replacement Lights"
desc = "May the light of Aether shine upon this station! Or at least, the light of forty two light tubes and twenty one light bulbs."
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index 6b8c2a772df..330b99f38e8 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -1030,18 +1030,27 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
if(prefs && prefs.chat_toggles & CHAT_PULLR)
to_chat(src, announcement)
-/client/proc/show_character_previews(mutable_appearance/MA)
+/client/proc/show_character_previews(mutable_appearance/source)
+ LAZYINITLIST(char_render_holders)
+ if(!LAZYLEN(char_render_holders))
+ for(var/plane_master_path as anything in subtypesof(/atom/movable/screen/plane_master))
+ var/atom/movable/screen/plane_master/plane_master = new plane_master_path()
+ char_render_holders["plane_master-[plane_master.plane]"] = plane_master
+ plane_master.backdrop(mob)
+ screen |= plane_master
+ plane_master.screen_loc = "character_preview_map:0,CENTER"
+
var/pos = 0
- for(var/D in GLOB.cardinals)
+ for(var/dir in GLOB.cardinals)
pos++
- var/atom/movable/screen/O = LAZYACCESS(char_render_holders, "[D]")
- if(!O)
- O = new
- LAZYSET(char_render_holders, "[D]", O)
- screen |= O
- O.appearance = MA
- O.dir = D
- O.screen_loc = "character_preview_map:0,[pos]"
+ var/atom/movable/screen/preview = char_render_holders["preview-[dir]"]
+ if(!preview)
+ preview = new
+ char_render_holders["preview-[dir]"] = preview
+ screen |= preview
+ preview.appearance = source
+ preview.dir = dir
+ preview.screen_loc = "character_preview_map:0,[pos]"
/client/proc/clear_character_previews()
for(var/index in char_render_holders)
diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm
index 648ec39ffc0..c86c6d8f46f 100644
--- a/code/modules/clothing/glasses/_glasses.dm
+++ b/code/modules/clothing/glasses/_glasses.dm
@@ -391,14 +391,16 @@
add_atom_colour("#[user.eye_color]", FIXED_COLOUR_PRIORITY)
colored_before = TRUE
-/obj/item/clothing/glasses/blindfold/white/worn_overlays(isinhands = FALSE, file2use)
- . = list()
- if(!isinhands && ishuman(loc) && !colored_before)
- var/mob/living/carbon/human/H = loc
- var/mutable_appearance/M = mutable_appearance('icons/mob/clothing/eyes.dmi', "blindfoldwhite")
- M.appearance_flags |= RESET_COLOR
- M.color = "#[H.eye_color]"
- . += M
+/obj/item/clothing/glasses/blindfold/white/worn_overlays(mutable_appearance/standing, isinhands = FALSE, file2use)
+ . = ..()
+ if(isinhands || !ishuman(loc) || colored_before)
+ return
+
+ var/mob/living/carbon/human/H = loc
+ var/mutable_appearance/M = mutable_appearance('icons/mob/clothing/eyes.dmi', "blindfoldwhite")
+ M.appearance_flags |= RESET_COLOR
+ M.color = "#[H.eye_color]"
+ . += M
/obj/item/clothing/glasses/sunglasses/big
desc = "Strangely ancient technology used to help provide rudimentary eye cover. Larger than average enhanced shielding blocks flashes."
diff --git a/code/modules/clothing/gloves/_gloves.dm b/code/modules/clothing/gloves/_gloves.dm
index b7858d6a43c..96772d85c3c 100644
--- a/code/modules/clothing/gloves/_gloves.dm
+++ b/code/modules/clothing/gloves/_gloves.dm
@@ -26,13 +26,15 @@
user.visible_message("\the [src] are forcing [user]'s hands around [user.p_their()] neck! It looks like the gloves are possessed!")
return OXYLOSS
-/obj/item/clothing/gloves/worn_overlays(isinhands = FALSE)
- . = list()
+/obj/item/clothing/gloves/worn_overlays(mutable_appearance/standing, isinhands = FALSE)
+ . = ..()
if(!isinhands)
- if(damaged_clothes)
- . += mutable_appearance('icons/effects/item_damage.dmi', "damagedgloves")
- if(HAS_BLOOD_DNA(src))
- . += mutable_appearance('icons/effects/blood.dmi', "bloodyhands")
+ return
+
+ if(damaged_clothes)
+ . += mutable_appearance('icons/effects/item_damage.dmi', "damagedgloves")
+ if(HAS_BLOOD_DNA(src))
+ . += mutable_appearance('icons/effects/blood.dmi', "bloodyhands")
/obj/item/clothing/gloves/update_clothes_damaged_state(damaged_state = CLOTHING_DAMAGED)
..()
diff --git a/code/modules/clothing/head/_head.dm b/code/modules/clothing/head/_head.dm
index b3b8362f098..bbcf54660d6 100644
--- a/code/modules/clothing/head/_head.dm
+++ b/code/modules/clothing/head/_head.dm
@@ -65,16 +65,18 @@
-/obj/item/clothing/head/worn_overlays(isinhands = FALSE)
- . = list()
- if(!isinhands)
- if(damaged_clothes)
- . += mutable_appearance('icons/effects/item_damage.dmi', "damagedhelmet")
- if(HAS_BLOOD_DNA(src))
- if(clothing_flags & LARGE_WORN_ICON)
- . += mutable_appearance('icons/effects/64x64.dmi', "helmetblood_large")
- else
- . += mutable_appearance('icons/effects/blood.dmi', "helmetblood")
+/obj/item/clothing/head/worn_overlays(mutable_appearance/standing, isinhands = FALSE)
+ . = ..()
+ if(isinhands)
+ return
+
+ if(damaged_clothes)
+ . += mutable_appearance('icons/effects/item_damage.dmi', "damagedhelmet")
+ if(HAS_BLOOD_DNA(src))
+ if(clothing_flags & LARGE_WORN_ICON)
+ . += mutable_appearance('icons/effects/64x64.dmi', "helmetblood_large")
+ else
+ . += mutable_appearance('icons/effects/blood.dmi', "helmetblood")
/obj/item/clothing/head/update_clothes_damaged_state(damaged_state = CLOTHING_DAMAGED)
..()
diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm
index bde07c5f869..5ffe28a7317 100644
--- a/code/modules/clothing/head/hardhat.dm
+++ b/code/modules/clothing/head/hardhat.dm
@@ -142,12 +142,14 @@
visor_sprite_path = 'icons/mob/clothing/head.dmi' //END SKYRAT EDIT
update_appearance()
-/obj/item/clothing/head/hardhat/weldhat/worn_overlays(isinhands)
+/obj/item/clothing/head/hardhat/weldhat/worn_overlays(mutable_appearance/standing, isinhands)
. = ..()
- if(!isinhands)
- . += mutable_appearance(visor_sprite_path, "weldhelmet") //Changed first variable from 'icons/mob/clothing/head.dmi'
- if(!up)
- . += mutable_appearance(visor_sprite_path, "weldvisor") //Changed first variable from 'icons/mob/clothing/head.dmi'
+ if(isinhands)
+ return
+
+ . += mutable_appearance(visor_sprite_path, "weldhelmet") //Changed first variable from 'icons/mob/clothing/head.dmi'
+ if(!up)
+ . += mutable_appearance(visor_sprite_path, "weldvisor") //Changed first variable from 'icons/mob/clothing/head.dmi'
/obj/item/clothing/head/hardhat/weldhat/update_overlays()
. = ..()
diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm
index 85f3523109e..ba4d66bbfb1 100644
--- a/code/modules/clothing/head/misc_special.dm
+++ b/code/modules/clothing/head/misc_special.dm
@@ -247,16 +247,18 @@
return ..()
-/obj/item/clothing/head/wig/worn_overlays(isinhands = FALSE, file2use)
- . = list()
+/obj/item/clothing/head/wig/worn_overlays(mutable_appearance/standing, isinhands = FALSE, file2use)
+ . = ..()
if(!isinhands)
- var/datum/sprite_accessory/S = GLOB.hairstyles_list[hairstyle]
- if(!S)
- return
- var/mutable_appearance/M = mutable_appearance(S.icon, S.icon_state,layer = -HAIR_LAYER)
- M.appearance_flags |= RESET_COLOR
- M.color = color
- . += M
+ return
+
+ var/datum/sprite_accessory/S = GLOB.hairstyles_list[hairstyle]
+ if(!S)
+ return
+ var/mutable_appearance/M = mutable_appearance(S.icon, S.icon_state,layer = -HAIR_LAYER)
+ M.appearance_flags |= RESET_COLOR
+ M.color = color
+ . += M
/obj/item/clothing/head/wig/attack_self(mob/user)
var/new_style = input(user, "Select a hairstyle", "Wig Styling") as null|anything in (GLOB.hairstyles_list - "Bald")
diff --git a/code/modules/clothing/masks/_masks.dm b/code/modules/clothing/masks/_masks.dm
index e967b32be10..23a23a950e4 100644
--- a/code/modules/clothing/masks/_masks.dm
+++ b/code/modules/clothing/masks/_masks.dm
@@ -40,14 +40,16 @@
/obj/item/clothing/mask/proc/handle_speech()
SIGNAL_HANDLER
-/obj/item/clothing/mask/worn_overlays(isinhands = FALSE)
- . = list()
- if(!isinhands)
- if(body_parts_covered & HEAD)
- if(damaged_clothes)
- . += mutable_appearance('icons/effects/item_damage.dmi', "damagedmask")
- if(HAS_BLOOD_DNA(src))
- . += mutable_appearance('icons/effects/blood.dmi', "maskblood")
+/obj/item/clothing/mask/worn_overlays(mutable_appearance/standing, isinhands = FALSE)
+ . = ..()
+ if(isinhands)
+ return
+
+ if(body_parts_covered & HEAD)
+ if(damaged_clothes)
+ . += mutable_appearance('icons/effects/item_damage.dmi', "damagedmask")
+ if(HAS_BLOOD_DNA(src))
+ . += mutable_appearance('icons/effects/blood.dmi', "maskblood")
/obj/item/clothing/mask/update_clothes_damaged_state(damaged_state = CLOTHING_DAMAGED)
..()
diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm
index 6f82c5c9ce7..ab447e0671a 100644
--- a/code/modules/clothing/neck/_neck.dm
+++ b/code/modules/clothing/neck/_neck.dm
@@ -6,14 +6,16 @@
strip_delay = 40
equip_delay_other = 40
-/obj/item/clothing/neck/worn_overlays(isinhands = FALSE)
- . = list()
- if(!isinhands)
- if(body_parts_covered & HEAD)
- if(damaged_clothes)
- . += mutable_appearance('icons/effects/item_damage.dmi', "damagedmask")
- if(HAS_BLOOD_DNA(src))
- . += mutable_appearance('icons/effects/blood.dmi', "maskblood")
+/obj/item/clothing/neck/worn_overlays(mutable_appearance/standing, isinhands = FALSE)
+ . = ..()
+ if(isinhands)
+ return
+
+ if(body_parts_covered & HEAD)
+ if(damaged_clothes)
+ . += mutable_appearance('icons/effects/item_damage.dmi', "damagedmask")
+ if(HAS_BLOOD_DNA(src))
+ . += mutable_appearance('icons/effects/blood.dmi', "maskblood")
/obj/item/clothing/neck/tie
name = "tie"
@@ -235,7 +237,7 @@
w_class = WEIGHT_CLASS_TINY
var/sourceBandanaType
-/obj/item/clothing/neck/neckerchief/worn_overlays(isinhands)
+/obj/item/clothing/neck/neckerchief/worn_overlays(mutable_appearance/standing, isinhands)
. = ..()
if(!isinhands)
var/mutable_appearance/realOverlay = mutable_appearance('icons/mob/clothing/mask.dmi', icon_state)
diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm
index 42e1cbfc74a..2b11662ac60 100644
--- a/code/modules/clothing/shoes/_shoes.dm
+++ b/code/modules/clothing/shoes/_shoes.dm
@@ -41,16 +41,18 @@
return(BRUTELOSS)
//SKYRAT EDIT REMOVAL BEGIN -DIGI_BLOODSOLE - (Moved to modular_skyrat/modules/digi_shoeblood/code/modules/clothing/shoes/_shoes.dm)
/*
-/obj/item/clothing/shoes/worn_overlays(isinhands = FALSE)
- . = list()
- if(!isinhands)
- if(damaged_clothes)
- . += mutable_appearance('icons/effects/item_damage.dmi', "damagedshoe")
- if(HAS_BLOOD_DNA(src))
- if(clothing_flags & LARGE_WORN_ICON)
- . += mutable_appearance('icons/effects/64x64.dmi', "shoeblood_large")
- else
- . += mutable_appearance('icons/effects/blood.dmi', "shoeblood")
+/obj/item/clothing/shoes/worn_overlays(mutable_appearance/standing, isinhands = FALSE)
+ . = ..()
+ if(isinhands)
+ return
+
+ if(damaged_clothes)
+ . += mutable_appearance('icons/effects/item_damage.dmi', "damagedshoe")
+ if(HAS_BLOOD_DNA(src))
+ if(clothing_flags & LARGE_WORN_ICON)
+ . += mutable_appearance('icons/effects/64x64.dmi', "shoeblood_large")
+ else
+ . += mutable_appearance('icons/effects/blood.dmi', "shoeblood")
*/
//SKYRAT EDIT REMOVAL END
/obj/item/clothing/shoes/examine(mob/user)
diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm
index 85454b94188..7adb4375e67 100644
--- a/code/modules/clothing/spacesuits/plasmamen.dm
+++ b/code/modules/clothing/spacesuits/plasmamen.dm
@@ -99,7 +99,7 @@
else
to_chat(user, "Seems like someone already drew something on this helmet's visor!")
-/obj/item/clothing/head/helmet/space/plasmaman/worn_overlays(isinhands)
+/obj/item/clothing/head/helmet/space/plasmaman/worn_overlays(mutable_appearance/standing, isinhands)
. = ..()
if(!isinhands && smile)
var/mutable_appearance/M = mutable_appearance('icons/mob/clothing/head/plasmaman_head.dmi', smile_state)
diff --git a/code/modules/clothing/suits/_suits.dm b/code/modules/clothing/suits/_suits.dm
index 70d17162b2d..84438edd057 100644
--- a/code/modules/clothing/suits/_suits.dm
+++ b/code/modules/clothing/suits/_suits.dm
@@ -14,28 +14,32 @@
///obj/item/clothing/suit/worn_overlays(isinhands = FALSE) //ORIGINAL
-/obj/item/clothing/suit/worn_overlays(isinhands = FALSE, file2use, mutant_styles = NONE)
- . = list()
- if(!isinhands)
- if(damaged_clothes)
- //SKYRAT EDIT CHANGE BEGIN
- //. += mutable_appearance('icons/effects/item_damage.dmi', "damaged[blood_overlay_type]") //ORIGINAL
- var/damagefile2use = (mutant_styles & STYLE_TAUR_ALL) ? 'modular_skyrat/master_files/icons/mob/64x32_item_damage.dmi' : 'icons/effects/item_damage.dmi'
- . += mutable_appearance(damagefile2use, "damaged[blood_overlay_type]")
- //SKYRAT EDIT CHANGE END
- if(HAS_BLOOD_DNA(src))
- //SKYRAT EDIT CHANGE BEGIN
- //. += mutable_appearance('icons/effects/blood.dmi', "[blood_overlay_type]blood") //ORIGINAL
- var/bloodfile2use = (mutant_styles & STYLE_TAUR_ALL) ? 'modular_skyrat/master_files/icons/mob/64x32_blood.dmi' : 'icons/effects/blood.dmi'
- . += mutable_appearance(bloodfile2use, "[blood_overlay_type]blood")
- //SKYRAT EDIT CHANGE END
- var/mob/living/carbon/human/M = loc
- if(ishuman(M) && M.w_uniform)
- var/obj/item/clothing/under/U = M.w_uniform
- if(istype(U) && U.attached_accessory)
- var/obj/item/clothing/accessory/A = U.attached_accessory
- if(A.above_suit)
- . += U.accessory_overlay
+/obj/item/clothing/suit/worn_overlays(mutable_appearance/standing, isinhands = FALSE, file2use, mutant_styles = NONE)
+ . = ..()
+ if(isinhands)
+ return
+
+ if(damaged_clothes)
+ //SKYRAT EDIT CHANGE BEGIN
+ //. += mutable_appearance('icons/effects/item_damage.dmi', "damaged[blood_overlay_type]") //ORIGINAL
+ var/damagefile2use = (mutant_styles & STYLE_TAUR_ALL) ? 'modular_skyrat/master_files/icons/mob/64x32_item_damage.dmi' : 'icons/effects/item_damage.dmi'
+ . += mutable_appearance(damagefile2use, "damaged[blood_overlay_type]")
+ //SKYRAT EDIT CHANGE END
+ if(HAS_BLOOD_DNA(src))
+ //SKYRAT EDIT CHANGE BEGIN
+ //. += mutable_appearance('icons/effects/blood.dmi', "[blood_overlay_type]blood") //ORIGINAL
+ var/bloodfile2use = (mutant_styles & STYLE_TAUR_ALL) ? 'modular_skyrat/master_files/icons/mob/64x32_blood.dmi' : 'icons/effects/blood.dmi'
+ . += mutable_appearance(bloodfile2use, "[blood_overlay_type]blood")
+ //SKYRAT EDIT CHANGE END
+
+ var/mob/living/carbon/human/M = loc
+ if(!ishuman(M) || !M.w_uniform)
+ return
+ var/obj/item/clothing/under/U = M.w_uniform
+ if(istype(U) && U.attached_accessory)
+ var/obj/item/clothing/accessory/A = U.attached_accessory
+ if(A.above_suit)
+ . += U.accessory_overlay
/obj/item/clothing/suit/update_clothes_damaged_state(damaged_state = CLOTHING_DAMAGED)
..()
diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm
index 86d41e69a35..407ab279c6f 100644
--- a/code/modules/clothing/under/_under.dm
+++ b/code/modules/clothing/under/_under.dm
@@ -22,15 +22,17 @@
var/mutantrace_variation = NO_MUTANTRACE_VARIATION //Are there special sprites for specific situations? Don't use this unless you need to.
var/freshly_laundered = FALSE
-/obj/item/clothing/under/worn_overlays(isinhands = FALSE)
- . = list()
- if(!isinhands)
- if(damaged_clothes)
- . += mutable_appearance('icons/effects/item_damage.dmi', "damageduniform")
- if(HAS_BLOOD_DNA(src))
- . += mutable_appearance('icons/effects/blood.dmi', "uniformblood")
- if(accessory_overlay)
- . += accessory_overlay
+/obj/item/clothing/under/worn_overlays(mutable_appearance/standing, isinhands = FALSE)
+ . = ..()
+ if(isinhands)
+ return
+
+ if(damaged_clothes)
+ . += mutable_appearance('icons/effects/item_damage.dmi', "damageduniform")
+ if(HAS_BLOOD_DNA(src))
+ . += mutable_appearance('icons/effects/blood.dmi', "uniformblood")
+ if(accessory_overlay)
+ . += accessory_overlay
/obj/item/clothing/under/attackby(obj/item/I, mob/user, params)
if((has_sensor == BROKEN_SENSORS) && istype(I, /obj/item/stack/cable_coil))
diff --git a/code/modules/food_and_drinks/pizzabox.dm b/code/modules/food_and_drinks/pizzabox.dm
index 1c3cf009469..686a07b7d53 100644
--- a/code/modules/food_and_drinks/pizzabox.dm
+++ b/code/modules/food_and_drinks/pizzabox.dm
@@ -104,15 +104,17 @@
tag_overlay.pixel_y = box_offset
. += tag_overlay
-/obj/item/pizzabox/worn_overlays(isinhands, icon_file)
- . = list()
+/obj/item/pizzabox/worn_overlays(mutable_appearance/standing, isinhands, icon_file)
+ . = ..()
var/current_offset = 2
- if(isinhands)
- for(var/V in boxes) //add EXTRA BOX per box
- var/mutable_appearance/M = mutable_appearance(icon_file, inhand_icon_state)
- M.pixel_y = current_offset
- current_offset += 2
- . += M
+ if(!isinhands)
+ return
+
+ for(var/V in boxes) //add EXTRA BOX per box
+ var/mutable_appearance/M = mutable_appearance(icon_file, inhand_icon_state)
+ M.pixel_y = current_offset
+ current_offset += 2
+ . += M
/obj/item/pizzabox/attack_self(mob/user)
if(boxes.len > 0)
diff --git a/code/modules/holodeck/turfs.dm b/code/modules/holodeck/turfs.dm
index 78c7e7f2f21..adaf5048719 100644
--- a/code/modules/holodeck/turfs.dm
+++ b/code/modules/holodeck/turfs.dm
@@ -146,9 +146,9 @@
. = ..()
addtimer(CALLBACK(src, /atom/.proc/update_appearance), 1)
-/turf/open/floor/holofloor/carpet/update_icon()
+/turf/open/floor/holofloor/carpet/update_icon(updates=ALL)
. = ..()
- if(intact && smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK))
+ if((updates & UPDATE_SMOOTHING) && intact && smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK))
QUEUE_SMOOTH(src)
/turf/open/floor/holofloor/wood
diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm
index 21c88b63ee4..ebd390f91d4 100644
--- a/code/modules/mining/equipment/explorer_gear.dm
+++ b/code/modules/mining/equipment/explorer_gear.dm
@@ -100,7 +100,7 @@
glass_overlay.appearance_flags = RESET_COLOR
. += glass_overlay
-/obj/item/clothing/head/helmet/space/hostile_environment/worn_overlays(isinhands)
+/obj/item/clothing/head/helmet/space/hostile_environment/worn_overlays(mutable_appearance/standing, isinhands)
. = ..()
if(!isinhands)
var/mutable_appearance/M = mutable_appearance('icons/mob/clothing/head.dmi', "hostile_env_glass")
diff --git a/code/modules/mining/lavaland/ruins/gym.dm b/code/modules/mining/lavaland/ruins/gym.dm
index e62ca4d6717..ed6eb332cf5 100644
--- a/code/modules/mining/lavaland/ruins/gym.dm
+++ b/code/modules/mining/lavaland/ruins/gym.dm
@@ -24,6 +24,7 @@
desc = "Just looking at this thing makes you feel tired."
density = TRUE
anchored = TRUE
+ blocks_emissive = EMISSIVE_BLOCK_UNIQUE
var/icon_state_inuse
/obj/structure/weightmachine/proc/AnimateMachine(mob/living/user)
diff --git a/code/modules/mob/dead/new_player/sprite_accessories.dm b/code/modules/mob/dead/new_player/sprite_accessories.dm
index 81d43fe0dbe..f70e40e0848 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories.dm
@@ -47,18 +47,35 @@
return L
/datum/sprite_accessory
- var/icon //the icon file the accessory is located in
- var/icon_state //the icon_state of the accessory
- var/name //the preview name of the accessory
- var/gender = NEUTER //Determines if the accessory will be skipped or included in random hair generations
- var/gender_specific //Something that can be worn by either gender, but looks different on each
- var/use_static //determines if the accessory will be skipped by color preferences
- var/color_src = MUTCOLORS //Currently only used by mutantparts so don't worry about hair and stuff. This is the source that this accessory will get its color from. Default is MUTCOLOR, but can also be HAIR, FACEHAIR, EYECOLOR and 0 if none.
- var/hasinner //Decides if this sprite has an "inner" part, such as the fleshy parts on ears.
- var/locked = FALSE //Is this part locked from roundstart selection? Used for parts that apply effects
+ /// The icon file the accessory is located in.
+ var/icon
+ /// The icon_state of the accessory.
+ var/icon_state
+ /// The preview name of the accessory.
+ var/name
+ /// Determines if the accessory will be skipped or included in random hair generations.
+ var/gender = NEUTER
+ /// Something that can be worn by either gender, but looks different on each.
+ var/gender_specific
+ /// Determines if the accessory will be skipped by color preferences.
+ var/use_static
+ /**
+ * Currently only used by mutantparts so don't worry about hair and stuff.
+ * This is the source that this accessory will get its color from. Default is MUTCOLOR, but can also be HAIR, FACEHAIR, EYECOLOR and 0 if none.
+ */
+ var/color_src = MUTCOLORS
+ /// Decides if this sprite has an "inner" part, such as the fleshy parts on ears.
+ var/hasinner
+ /// Is this part locked from roundstart selection? Used for parts that apply effects.
+ var/locked = FALSE
+ /// Should we center the sprite?
+ var/center = FALSE
+ /// The width of the sprite in pixels. Used to center it if necessary.
var/dimension_x = 32
+ /// The height of the sprite in pixels. Used to center it if necessary.
var/dimension_y = 32
- var/center = FALSE //Should we center the sprite?
+ /// Should this sprite block emissives?
+ var/em_block = FALSE
//////////////////////
// Hair Definitions //
@@ -849,6 +866,7 @@
/datum/sprite_accessory/facial_hair
icon = 'icons/mob/human_face.dmi'
gender = MALE // barf (unless you're a dorf, dorfs dig chix w/ beards :P)
+ em_block = TRUE
// please make sure they're sorted alphabetically and categorized
@@ -1004,6 +1022,7 @@
/datum/sprite_accessory/underwear
icon = 'icons/mob/clothing/underwear.dmi'
use_static = FALSE
+ em_block = TRUE
//MALE UNDERWEAR
@@ -1180,6 +1199,7 @@
/datum/sprite_accessory/undershirt
icon = 'icons/mob/clothing/underwear.dmi'
+ em_block = TRUE
/datum/sprite_accessory/undershirt/nude
name = "Nude"
@@ -1464,6 +1484,7 @@
/datum/sprite_accessory/socks
icon = 'icons/mob/clothing/underwear.dmi'
+ em_block = TRUE
/datum/sprite_accessory/socks/nude
name = "Nude"
@@ -1627,9 +1648,11 @@
/datum/sprite_accessory/tails
icon = 'icons/mob/mutant_bodyparts.dmi'
+ em_block = TRUE
/datum/sprite_accessory/tails_animated
icon = 'icons/mob/mutant_bodyparts.dmi'
+ em_block = TRUE
/datum/sprite_accessory/tails/lizard/smooth
name = "Smooth"
@@ -1688,6 +1711,7 @@
/datum/sprite_accessory/snouts
icon = 'icons/mob/mutant_bodyparts.dmi'
+ em_block = TRUE
/datum/sprite_accessory/snouts/sharp
name = "Sharp"
@@ -1707,6 +1731,7 @@
/datum/sprite_accessory/horns
icon = 'icons/mob/mutant_bodyparts.dmi'
+ em_block = TRUE
/datum/sprite_accessory/horns/none
name = "None"
@@ -1734,6 +1759,7 @@
/datum/sprite_accessory/ears
icon = 'icons/mob/mutant_bodyparts.dmi'
+ em_block = TRUE
/datum/sprite_accessory/ears/none
name = "None"
@@ -1751,9 +1777,11 @@
/datum/sprite_accessory/wings
icon = 'icons/mob/clothing/wings.dmi'
+ em_block = TRUE
/datum/sprite_accessory/wings_open
icon = 'icons/mob/clothing/wings.dmi'
+ em_block = TRUE
/datum/sprite_accessory/wings/angel
name = "Angel"
@@ -1872,9 +1900,11 @@
/datum/sprite_accessory/spines
icon = 'icons/mob/mutant_bodyparts.dmi'
+ em_block = TRUE
/datum/sprite_accessory/spines_animated
icon = 'icons/mob/mutant_bodyparts.dmi'
+ em_block = TRUE
/datum/sprite_accessory/spines/none
name = "None"
@@ -1926,6 +1956,7 @@
/datum/sprite_accessory/legs //legs are a special case, they aren't actually sprite_accessories but are updated with them.
icon = null //These datums exist for selecting legs on preference, and little else
+ em_block = TRUE
/datum/sprite_accessory/legs/none
name = "Normal Legs"
@@ -1936,6 +1967,7 @@
/datum/sprite_accessory/caps
icon = 'icons/mob/mutant_bodyparts.dmi'
color_src = HAIR
+ em_block = TRUE
/datum/sprite_accessory/caps/round
name = "Round"
@@ -1944,6 +1976,7 @@
/datum/sprite_accessory/moth_wings
icon = 'icons/mob/moth_wings.dmi'
color_src = null
+ em_block = TRUE
/datum/sprite_accessory/moth_wings/plain
name = "Plain"
diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm
index f5a87b0e583..cb084bc709e 100644
--- a/code/modules/mob/living/carbon/alien/alien.dm
+++ b/code/modules/mob/living/carbon/alien/alien.dm
@@ -10,6 +10,7 @@
initial_language_holder = /datum/language_holder/alien
bubble_icon = "alien"
type_of_meat = /obj/item/food/meat/slab/xeno
+ blocks_emissive = EMISSIVE_BLOCK_UNIQUE
var/move_delay_add = 0 // movement delay to add
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid_update_icons.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid_update_icons.dm
index bad958e07a1..47947fa4036 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid_update_icons.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid_update_icons.dm
@@ -65,7 +65,13 @@
dmi_file = 'icons/mob/alienqueen.dmi'
if(handcuffed)
- overlays_standing[HANDCUFF_LAYER] = mutable_appearance(dmi_file, cuff_icon, -HANDCUFF_LAYER)
+ var/mutable_appearance/handcuff_overlay = mutable_appearance(dmi_file, cuff_icon, -HANDCUFF_LAYER)
+ if(handcuffed.blocks_emissive)
+ var/mutable_appearance/handcuff_blocker = mutable_appearance(dmi_file, cuff_icon, plane = EMISSIVE_PLANE, appearance_flags = KEEP_APART)
+ handcuff_blocker.color = GLOB.em_block_color
+ handcuff_overlay.overlays += handcuff_blocker
+
+ overlays_standing[HANDCUFF_LAYER] = handcuff_overlay
apply_overlay(HANDCUFF_LAYER)
//Royals have bigger sprites, so inhand things must be handled differently.
@@ -79,14 +85,24 @@
var/itm_state = l_hand.inhand_icon_state
if(!itm_state)
itm_state = l_hand.icon_state
- hands += mutable_appearance(alt_inhands_file, "[itm_state][caste]_l", -HANDS_LAYER)
+ var/mutable_appearance/l_hand_item = mutable_appearance(alt_inhands_file, "[itm_state][caste]_l", -HANDS_LAYER)
+ if(l_hand.blocks_emissive)
+ var/mutable_appearance/l_hand_block = mutable_appearance(alt_inhands_file, "[itm_state][caste]_l", plane = EMISSIVE_PLANE, appearance_flags = KEEP_APART)
+ l_hand_block.color = GLOB.em_block_color
+ l_hand_item.overlays += l_hand_block
+ hands += l_hand_item
var/obj/item/r_hand = get_item_for_held_index(2)
if(r_hand)
var/itm_state = r_hand.inhand_icon_state
if(!itm_state)
itm_state = r_hand.icon_state
- hands += mutable_appearance(alt_inhands_file, "[itm_state][caste]_r", -HANDS_LAYER)
+ var/mutable_appearance/r_hand_item = mutable_appearance(alt_inhands_file, "[itm_state][caste]_r", -HANDS_LAYER)
+ if(r_hand.blocks_emissive)
+ var/mutable_appearance/r_hand_block = mutable_appearance(alt_inhands_file, "[itm_state][caste]_r", plane = EMISSIVE_PLANE, appearance_flags = KEEP_APART)
+ r_hand_block.color = GLOB.em_block_color
+ r_hand_item.overlays += r_hand_block
+ hands += r_hand_item
overlays_standing[HANDS_LAYER] = hands
apply_overlay(HANDS_LAYER)
diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm
index c311bbecd39..3bddf261130 100644
--- a/code/modules/mob/living/carbon/carbon_defines.dm
+++ b/code/modules/mob/living/carbon/carbon_defines.dm
@@ -10,6 +10,7 @@
num_hands = 0 //Populated on init through list/bodyparts
usable_hands = 0 //Populated on init through list/bodyparts
mobility_flags = MOBILITY_FLAGS_CARBON_DEFAULT
+ blocks_emissive = NONE
///List of [/obj/item/organ] in the mob. They don't go in the contents for some reason I don't want to know.
var/list/internal_organs = list()
///Same as [above][/mob/living/carbon/var/internal_organs], but stores "slot ID" - "organ" pairs for easy access.
diff --git a/code/modules/mob/living/carbon/carbon_update_icons.dm b/code/modules/mob/living/carbon/carbon_update_icons.dm
index dca51e09ad3..2dcc5b6e2c8 100644
--- a/code/modules/mob/living/carbon/carbon_update_icons.dm
+++ b/code/modules/mob/living/carbon/carbon_update_icons.dm
@@ -176,7 +176,13 @@
/mob/living/carbon/update_inv_handcuffed()
remove_overlay(HANDCUFF_LAYER)
if(handcuffed)
- overlays_standing[HANDCUFF_LAYER] = mutable_appearance('icons/mob/mob.dmi', "handcuff1", -HANDCUFF_LAYER)
+ var/mutable_appearance/handcuff_overlay = mutable_appearance('icons/mob/mob.dmi', "handcuff1", -HANDCUFF_LAYER)
+ if(handcuffed.blocks_emissive)
+ var/mutable_appearance/handcuff_blocker = mutable_appearance('icons/mob/mob.dmi', "handcuff1", plane = EMISSIVE_PLANE, appearance_flags = KEEP_APART)
+ handcuff_blocker.color = GLOB.em_block_color
+ handcuff_overlay.overlays += handcuff_blocker
+
+ overlays_standing[HANDCUFF_LAYER] = handcuff_overlay
apply_overlay(HANDCUFF_LAYER)
@@ -212,10 +218,18 @@
//eg: ammo counters, primed grenade flashing, etc.
//"icon_file" is used automatically for inhands etc. to make sure it gets the right inhand file
//SKYRAT EDIT CHANGE - CUSTOMIZATION
-///obj/item/proc/worn_overlays(isinhands = FALSE, icon_file) (original)
-/obj/item/proc/worn_overlays(isinhands = FALSE, icon_file, mutant_styles = NONE)
- . = list()
+///obj/item/proc/worn_overlays(mutable_appearance/standing, isinhands = FALSE, icon_file) (original)
+/obj/item/proc/worn_overlays(mutable_appearance/standing, isinhands = FALSE, icon_file, mutant_styles = NONE)
+ SHOULD_CALL_PARENT(TRUE)
+ RETURN_TYPE(/list)
+ . = list()
+ if(!blocks_emissive)
+ return
+
+ var/mutable_appearance/blocker_overlay = mutable_appearance(standing.icon, standing.icon_state, plane = EMISSIVE_PLANE, appearance_flags = KEEP_APART)
+ blocker_overlay.color = GLOB.em_block_color
+ . += blocker_overlay
/mob/living/carbon/update_body()
update_body_parts()
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index f2c10e782ee..8400a07223d 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -11,7 +11,6 @@
can_buckle = TRUE
buckle_lying = 0
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
- blocks_emissive = EMISSIVE_BLOCK_UNIQUE
can_be_shoved_into = TRUE
maxHealth = MAX_HUMAN_LIFE //SKYRAT EDIT ADDITION
diff --git a/code/modules/mob/living/carbon/human/human_update_icons.dm b/code/modules/mob/living/carbon/human/human_update_icons.dm
index 1efad213c76..0ffe2935c67 100644
--- a/code/modules/mob/living/carbon/human/human_update_icons.dm
+++ b/code/modules/mob/living/carbon/human/human_update_icons.dm
@@ -444,7 +444,13 @@ There are several things that need to be remembered:
remove_overlay(LEGCUFF_LAYER)
clear_alert("legcuffed")
if(legcuffed)
- overlays_standing[LEGCUFF_LAYER] = mutable_appearance('icons/mob/mob.dmi', "legcuff1", -LEGCUFF_LAYER)
+ var/mutable_appearance/legcuff_overlay = mutable_appearance('icons/mob/mob.dmi', "legcuff1", -LEGCUFF_LAYER)
+ if(legcuffed.blocks_emissive)
+ var/mutable_appearance/legcuff_blocker = mutable_appearance('icons/mob/mob.dmi', "legcuff1", plane = EMISSIVE_PLANE, appearance_flags = KEEP_APART)
+ legcuff_blocker.color = GLOB.em_block_color
+ legcuff_overlay.overlays += legcuff_blocker
+
+ overlays_standing[LEGCUFF_LAYER] = legcuff_overlay
apply_overlay(LEGCUFF_LAYER)
throw_alert("legcuffed", /atom/movable/screen/alert/restrained/legcuffed, new_master = src.legcuffed)
@@ -542,14 +548,14 @@ generate/load female uniform sprites matching all previously decided variables
var/mutable_appearance/standing
if(femaleuniform)
- standing = wear_female_version(t_state,file2use,layer2use,femaleuniform) //should layer2use be in sync with the adjusted value below? needs testing - shiz
+ standing = wear_female_version(t_state, file2use, layer2use, femaleuniform) //should layer2use be in sync with the adjusted value below? needs testing - shiz
if(!standing)
standing = mutable_appearance(file2use, t_state, -layer2use)
//Get the overlays for this item when it's being worn
//eg: ammo counters, primed grenade flashes, etc.
- var/list/worn_overlays = worn_overlays(isinhands, file2use)
- if(worn_overlays && worn_overlays.len)
+ var/list/worn_overlays = worn_overlays(standing, isinhands, file2use)
+ if(worn_overlays?.len)
standing.overlays.Add(worn_overlays)
standing = center_image(standing, isinhands ? inhand_x_dimension : worn_x_dimension, isinhands ? inhand_y_dimension : worn_y_dimension)
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 805ea2914a7..2fe66452758 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -494,8 +494,8 @@ GLOBAL_LIST_EMPTY(roundstart_races)
*/
/datum/species/proc/handle_hair(mob/living/carbon/human/H, forced_colour)
H.remove_overlay(HAIR_LAYER)
- var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD)
- if(!HD) //Decapitated
+ var/obj/item/bodypart/head/noggin = H.get_bodypart(BODY_ZONE_HEAD)
+ if(!noggin) //Decapitated
return
if(HAS_TRAIT(H, TRAIT_HUSK))
@@ -510,7 +510,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
var/dynamic_fhair_suffix = ""
//for augmented heads
- if(HD.status == BODYPART_ROBOTIC && !(ROBOTIC_LIMBS in species_traits)) //SKYRAT EDIT CHANGE - CUSTOMIZATION
+ if(noggin.status == BODYPART_ROBOTIC && !(ROBOTIC_LIMBS in species_traits)) //SKYRAT EDIT CHANGE - CUSTOMIZATION
return
//we check if our hat or helmet hides our facial hair.
@@ -567,6 +567,10 @@ GLOBAL_LIST_EMPTY(roundstart_races)
facial_overlay.alpha = hair_alpha
+ var/mutable_appearance/facial_em_blocker = mutable_appearance(fhair_file, fhair_state, plane = EMISSIVE_PLANE, alpha = hair_alpha, appearance_flags = KEEP_APART)
+ facial_em_blocker.color = GLOB.em_block_color
+ facial_overlay.overlays += facial_em_blocker
+
standing += facial_overlay
if(H.head)
@@ -646,6 +650,10 @@ GLOBAL_LIST_EMPTY(roundstart_races)
hair_overlay.pixel_x += H.dna.species.offset_features[OFFSET_FACE][1]
hair_overlay.pixel_y += H.dna.species.offset_features[OFFSET_FACE][2]
if(hair_overlay.icon)
+ var/mutable_appearance/hair_em_block = mutable_appearance(hair_overlay.icon, hair_overlay.icon_state, plane = EMISSIVE_PLANE, alpha = hair_alpha, appearance_flags = KEEP_APART)
+ hair_em_block.color = GLOB.em_block_color
+ hair_overlay.overlays += hair_em_block
+
standing += hair_overlay
standing += gradient_overlay
@@ -669,9 +677,9 @@ GLOBAL_LIST_EMPTY(roundstart_races)
var/list/standing = list()
- var/obj/item/bodypart/head/HD = species_human.get_bodypart(BODY_ZONE_HEAD)
+ var/obj/item/bodypart/head/noggin = species_human.get_bodypart(BODY_ZONE_HEAD)
- if(HD && !(HAS_TRAIT(species_human, TRAIT_HUSK)))
+ if(noggin && !(HAS_TRAIT(species_human, TRAIT_HUSK)))
// lipstick
if(species_human.lip_style && (LIPS in species_traits))
var/mutable_appearance/lip_overlay = mutable_appearance('icons/mob/human_face.dmi', "lips_[species_human.lip_style]", -BODY_LAYER)
@@ -713,11 +721,9 @@ GLOBAL_LIST_EMPTY(roundstart_races)
no_eyeslay.pixel_y += add_pixel_y
standing += no_eyeslay
if(!no_eyeslay)//we need eyes
+ eye_overlays += mutable_appearance('icons/mob/human_face.dmi', eye_organ.eye_icon_state, -BODY_LAYER)
if(eye_organ.overlay_ignore_lighting && !(obscured & ITEM_SLOT_EYES))
- eye_overlays += mutable_appearance('icons/mob/human_face.dmi', eye_organ.eye_icon_state, -BODY_LAYER)
- eye_overlays += mutable_appearance('icons/mob/human_face.dmi', eye_organ.eye_icon_state, -BODY_LAYER, EMISSIVE_PLANE)
- else
- eye_overlays += mutable_appearance('icons/mob/human_face.dmi', eye_organ.eye_icon_state, -BODY_LAYER)
+ eye_overlays += emissive_appearance('icons/mob/human_face.dmi', eye_organ.eye_icon_state, -BODY_LAYER)
for(var/mutable_appearance/eye_overlay as anything in eye_overlays)
eye_overlay.pixel_x += add_pixel_x
eye_overlay.pixel_y += add_pixel_y
@@ -734,7 +740,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
var/datum/sprite_accessory/markings = GLOB.moth_markings_list[species_human.dna.features["moth_markings"]]
if(!HAS_TRAIT(species_human, TRAIT_HUSK))
- if(HD && (HD.status != BODYPART_ROBOTIC))
+ if(noggin && (noggin.status != BODYPART_ROBOTIC))
var/mutable_appearance/markings_head_overlay = mutable_appearance(markings.icon, "[markings.icon_state]_head", -BODY_LAYER)
standing += markings_head_overlay
@@ -804,160 +810,159 @@ GLOBAL_LIST_EMPTY(roundstart_races)
*/
//SKYRAT EDIT REMOVAL BEGIN - CUSTOMIZATION (moved to modular)
/*
-/datum/species/proc/handle_mutant_bodyparts(mob/living/carbon/human/H, forced_colour)
+/datum/species/proc/handle_mutant_bodyparts(mob/living/carbon/human/source, forced_colour)
var/list/bodyparts_to_add = mutant_bodyparts.Copy()
var/list/relevent_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER)
var/list/standing = list()
- H.remove_overlay(BODY_BEHIND_LAYER)
- H.remove_overlay(BODY_ADJ_LAYER)
- H.remove_overlay(BODY_FRONT_LAYER)
+ source.remove_overlay(BODY_BEHIND_LAYER)
+ source.remove_overlay(BODY_ADJ_LAYER)
+ source.remove_overlay(BODY_FRONT_LAYER)
if(!mutant_bodyparts)
return
- var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD)
+ var/obj/item/bodypart/head/noggin = source.get_bodypart(BODY_ZONE_HEAD)
if(mutant_bodyparts["tail_lizard"])
- if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
+ if(source.wear_suit && (source.wear_suit.flags_inv & HIDEJUMPSUIT))
bodyparts_to_add -= "tail_lizard"
if(mutant_bodyparts["waggingtail_lizard"])
- if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
+ if(source.wear_suit && (source.wear_suit.flags_inv & HIDEJUMPSUIT))
bodyparts_to_add -= "waggingtail_lizard"
else if (mutant_bodyparts["tail_lizard"])
bodyparts_to_add -= "waggingtail_lizard"
if(mutant_bodyparts["tail_human"])
- if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
+ if(source.wear_suit && (source.wear_suit.flags_inv & HIDEJUMPSUIT))
bodyparts_to_add -= "tail_human"
if("tail_monkey" in mutant_bodyparts)
- if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
+ if(source.wear_suit && (source.wear_suit.flags_inv & HIDEJUMPSUIT))
bodyparts_to_add -= "tail_monkey"
if(mutant_bodyparts["waggingtail_human"])
- if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
+ if(source.wear_suit && (source.wear_suit.flags_inv & HIDEJUMPSUIT))
bodyparts_to_add -= "waggingtail_human"
else if (mutant_bodyparts["tail_human"])
bodyparts_to_add -= "waggingtail_human"
if(mutant_bodyparts["spines"])
- if(!H.dna.features["spines"] || H.dna.features["spines"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
+ if(!source.dna.features["spines"] || source.dna.features["spines"] == "None" || source.wear_suit && (source.wear_suit.flags_inv & HIDEJUMPSUIT))
bodyparts_to_add -= "spines"
if(mutant_bodyparts["waggingspines"])
- if(!H.dna.features["spines"] || H.dna.features["spines"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
+ if(!source.dna.features["spines"] || source.dna.features["spines"] == "None" || source.wear_suit && (source.wear_suit.flags_inv & HIDEJUMPSUIT))
bodyparts_to_add -= "waggingspines"
else if (mutant_bodyparts["tail"])
bodyparts_to_add -= "waggingspines"
if(mutant_bodyparts["snout"]) //Take a closer look at that snout!
- if((H.wear_mask && (H.wear_mask.flags_inv & HIDESNOUT)) || (H.head && (H.head.flags_inv & HIDESNOUT)) || !HD || HD.status == BODYPART_ROBOTIC)
+ if((source.wear_mask && (source.wear_mask.flags_inv & HIDESNOUT)) || (source.head && (source.head.flags_inv & HIDESNOUT)) || !noggin || noggin.status == BODYPART_ROBOTIC)
bodyparts_to_add -= "snout"
if(mutant_bodyparts["frills"])
- if(!H.dna.features["frills"] || H.dna.features["frills"] == "None" || H.head && (H.head.flags_inv & HIDEEARS) || !HD || HD.status == BODYPART_ROBOTIC)
+ if(!source.dna.features["frills"] || source.dna.features["frills"] == "None" || source.head && (source.head.flags_inv & HIDEEARS) || !noggin || noggin.status == BODYPART_ROBOTIC)
bodyparts_to_add -= "frills"
if(mutant_bodyparts["horns"])
- if(!H.dna.features["horns"] || H.dna.features["horns"] == "None" || H.head && (H.head.flags_inv & HIDEHAIR) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEHAIR)) || !HD || HD.status == BODYPART_ROBOTIC)
+ if(!source.dna.features["horns"] || source.dna.features["horns"] == "None" || source.head && (source.head.flags_inv & HIDEHAIR) || (source.wear_mask && (source.wear_mask.flags_inv & HIDEHAIR)) || !noggin || noggin.status == BODYPART_ROBOTIC)
bodyparts_to_add -= "horns"
if(mutant_bodyparts["ears"])
- if(!H.dna.features["ears"] || H.dna.features["ears"] == "None" || H.head && (H.head.flags_inv & HIDEHAIR) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEHAIR)) || !HD || HD.status == BODYPART_ROBOTIC)
+ if(!source.dna.features["ears"] || source.dna.features["ears"] == "None" || source.head && (source.head.flags_inv & HIDEHAIR) || (source.wear_mask && (source.wear_mask.flags_inv & HIDEHAIR)) || !noggin || noggin.status == BODYPART_ROBOTIC)
bodyparts_to_add -= "ears"
if(mutant_bodyparts["wings"])
- if(!H.dna.features["wings"] || H.dna.features["wings"] == "None" || (H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT) && (!H.wear_suit.species_exception || !is_type_in_list(src, H.wear_suit.species_exception))))
+ if(!source.dna.features["wings"] || source.dna.features["wings"] == "None" || (source.wear_suit && (source.wear_suit.flags_inv & HIDEJUMPSUIT) && (!source.wear_suit.species_exception || !is_type_in_list(src, source.wear_suit.species_exception))))
bodyparts_to_add -= "wings"
if(mutant_bodyparts["wings_open"])
- if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT) && (!H.wear_suit.species_exception || !is_type_in_list(src, H.wear_suit.species_exception)))
+ if(source.wear_suit && (source.wear_suit.flags_inv & HIDEJUMPSUIT) && (!source.wear_suit.species_exception || !is_type_in_list(src, source.wear_suit.species_exception)))
bodyparts_to_add -= "wings_open"
else if (mutant_bodyparts["wings"])
bodyparts_to_add -= "wings_open"
if(mutant_bodyparts["moth_antennae"])
- if(!H.dna.features["moth_antennae"] || H.dna.features["moth_antennae"] == "None" || !HD)
+ if(!source.dna.features["moth_antennae"] || source.dna.features["moth_antennae"] == "None" || !noggin)
bodyparts_to_add -= "moth_antennae"
//Digitigrade legs are stuck in the phantom zone between true limbs and mutant bodyparts. Mainly it just needs more agressive updating than most limbs.
var/update_needed = FALSE
var/not_digitigrade = TRUE
- for(var/X in H.bodyparts)
- var/obj/item/bodypart/O = X
- if(!O.use_digitigrade)
+ for(var/obj/item/bodypart/bodypart as anything in source.bodyparts)
+ if(!bodypart.use_digitigrade)
continue
not_digitigrade = FALSE
if(!(DIGITIGRADE in species_traits)) //Someone cut off a digitigrade leg and tacked it on
species_traits += DIGITIGRADE
var/should_be_squished = FALSE
- if(H.wear_suit && ((H.wear_suit.flags_inv & HIDEJUMPSUIT) || (H.wear_suit.body_parts_covered & LEGS)) || (H.w_uniform && (H.w_uniform.body_parts_covered & LEGS)))
+ if(source.wear_suit && ((source.wear_suit.flags_inv & HIDEJUMPSUIT) || (source.wear_suit.body_parts_covered & LEGS)) || (source.w_uniform && (source.w_uniform.body_parts_covered & LEGS)))
should_be_squished = TRUE
- if(O.use_digitigrade == FULL_DIGITIGRADE && should_be_squished)
- O.use_digitigrade = SQUISHED_DIGITIGRADE
+ if(bodypart.use_digitigrade == FULL_DIGITIGRADE && should_be_squished)
+ bodypart.use_digitigrade = SQUISHED_DIGITIGRADE
update_needed = TRUE
- else if(O.use_digitigrade == SQUISHED_DIGITIGRADE && !should_be_squished)
- O.use_digitigrade = FULL_DIGITIGRADE
+ else if(bodypart.use_digitigrade == SQUISHED_DIGITIGRADE && !should_be_squished)
+ bodypart.use_digitigrade = FULL_DIGITIGRADE
update_needed = TRUE
if(update_needed)
- H.update_body_parts()
+ source.update_body_parts()
if(not_digitigrade && (DIGITIGRADE in species_traits)) //Curse is lifted
species_traits -= DIGITIGRADE
if(!bodyparts_to_add)
return
- var/g = (H.body_type == FEMALE) ? "f" : "m"
+ var/g = (source.body_type == FEMALE) ? "f" : "m"
for(var/layer in relevent_layers)
var/layertext = mutant_bodyparts_layertext(layer)
for(var/bodypart in bodyparts_to_add)
- var/datum/sprite_accessory/S
+ var/datum/sprite_accessory/accessory
switch(bodypart)
if("tail_lizard")
- S = GLOB.tails_list_lizard[H.dna.features["tail_lizard"]]
+ accessory = GLOB.tails_list_lizard[source.dna.features["tail_lizard"]]
if("waggingtail_lizard")
- S = GLOB.animated_tails_list_lizard[H.dna.features["tail_lizard"]]
+ accessory = GLOB.animated_tails_list_lizard[source.dna.features["tail_lizard"]]
if("tail_human")
- S = GLOB.tails_list_human[H.dna.features["tail_human"]]
+ accessory = GLOB.tails_list_human[source.dna.features["tail_human"]]
if("waggingtail_human")
- S = GLOB.animated_tails_list_human[H.dna.features["tail_human"]]
+ accessory = GLOB.animated_tails_list_human[source.dna.features["tail_human"]]
if("spines")
- S = GLOB.spines_list[H.dna.features["spines"]]
+ accessory = GLOB.spines_list[source.dna.features["spines"]]
if("waggingspines")
- S = GLOB.animated_spines_list[H.dna.features["spines"]]
+ accessory = GLOB.animated_spines_list[source.dna.features["spines"]]
if("snout")
- S = GLOB.snouts_list[H.dna.features["snout"]]
+ accessory = GLOB.snouts_list[source.dna.features["snout"]]
if("frills")
- S = GLOB.frills_list[H.dna.features["frills"]]
+ accessory = GLOB.frills_list[source.dna.features["frills"]]
if("horns")
- S = GLOB.horns_list[H.dna.features["horns"]]
+ accessory = GLOB.horns_list[source.dna.features["horns"]]
if("ears")
- S = GLOB.ears_list[H.dna.features["ears"]]
+ accessory = GLOB.ears_list[source.dna.features["ears"]]
if("body_markings")
- S = GLOB.body_markings_list[H.dna.features["body_markings"]]
+ accessory = GLOB.body_markings_list[source.dna.features["body_markings"]]
if("wings")
- S = GLOB.wings_list[H.dna.features["wings"]]
+ accessory = GLOB.wings_list[source.dna.features["wings"]]
if("wingsopen")
- S = GLOB.wings_open_list[H.dna.features["wings"]]
+ accessory = GLOB.wings_open_list[source.dna.features["wings"]]
if("legs")
- S = GLOB.legs_list[H.dna.features["legs"]]
+ accessory = GLOB.legs_list[source.dna.features["legs"]]
if("moth_wings")
- S = GLOB.moth_wings_list[H.dna.features["moth_wings"]]
+ accessory = GLOB.moth_wings_list[source.dna.features["moth_wings"]]
if("moth_antennae")
- S = GLOB.moth_antennae_list[H.dna.features["moth_antennae"]]
+ accessory = GLOB.moth_antennae_list[source.dna.features["moth_antennae"]]
if("caps")
- S = GLOB.caps_list[H.dna.features["caps"]]
+ accessory = GLOB.caps_list[source.dna.features["caps"]]
if("tail_monkey")
- S = GLOB.tails_list_monkey[H.dna.features["tail_monkey"]]
- if(!S || S.icon_state == "none")
+ accessory = GLOB.tails_list_monkey[source.dna.features["tail_monkey"]]
+ if(!accessory || accessory.icon_state == "none")
continue
- var/mutable_appearance/accessory_overlay = mutable_appearance(S.icon, layer = -layer)
+ var/mutable_appearance/accessory_overlay = mutable_appearance(accessory.icon, layer = -layer)
//A little rename so we don't have to use tail_lizard or tail_human when naming the sprites.
if(bodypart == "tail_lizard" || bodypart == "tail_human" || bodypart == "tail_monkey")
@@ -965,55 +970,60 @@ GLOBAL_LIST_EMPTY(roundstart_races)
else if(bodypart == "waggingtail_lizard" || bodypart == "waggingtail_human")
bodypart = "waggingtail"
- if(S.gender_specific)
- accessory_overlay.icon_state = "[g]_[bodypart]_[S.icon_state]_[layertext]"
+ if(accessory.gender_specific)
+ accessory_overlay.icon_state = "[g]_[bodypart]_[accessory.icon_state]_[layertext]"
else
- accessory_overlay.icon_state = "m_[bodypart]_[S.icon_state]_[layertext]"
+ accessory_overlay.icon_state = "m_[bodypart]_[accessory.icon_state]_[layertext]"
- if(S.center)
- accessory_overlay = center_image(accessory_overlay, S.dimension_x, S.dimension_y)
+ if(accessory.em_block)
+ var/mutable_appearance/em_overlay = mutable_appearance(accessory_overlay.icon, accessory_overlay.icon_state, plane = EMISSIVE_PLANE, alpha = accessory_overlay.alpha, appearance_flags = KEEP_APART)
+ em_overlay.color = GLOB.em_block_color
+ accessory_overlay.overlays |= em_overlay
- if(!(HAS_TRAIT(H, TRAIT_HUSK)))
+ if(accessory.center)
+ accessory_overlay = center_image(accessory_overlay, accessory.dimension_x, accessory.dimension_y)
+
+ if(!(HAS_TRAIT(source, TRAIT_HUSK)))
if(!forced_colour)
- switch(S.color_src)
+ switch(accessory.color_src)
if(MUTCOLORS)
if(fixed_mut_color)
accessory_overlay.color = "#[fixed_mut_color]"
else
- accessory_overlay.color = "#[H.dna.features["mcolor"]]"
+ accessory_overlay.color = "#[source.dna.features["mcolor"]]"
if(HAIR)
if(hair_color == "mutcolor")
- accessory_overlay.color = "#[H.dna.features["mcolor"]]"
+ accessory_overlay.color = "#[source.dna.features["mcolor"]]"
else if(hair_color == "fixedmutcolor")
accessory_overlay.color = "#[fixed_mut_color]"
else
- accessory_overlay.color = "#[H.hair_color]"
+ accessory_overlay.color = "#[source.hair_color]"
if(FACEHAIR)
- accessory_overlay.color = "#[H.facial_hair_color]"
+ accessory_overlay.color = "#[source.facial_hair_color]"
if(EYECOLOR)
- accessory_overlay.color = "#[H.eye_color]"
+ accessory_overlay.color = "#[source.eye_color]"
else
accessory_overlay.color = forced_colour
standing += accessory_overlay
- if(S.hasinner)
- var/mutable_appearance/inner_accessory_overlay = mutable_appearance(S.icon, layer = -layer)
- if(S.gender_specific)
- inner_accessory_overlay.icon_state = "[g]_[bodypart]inner_[S.icon_state]_[layertext]"
+ if(accessory.hasinner)
+ var/mutable_appearance/inner_accessory_overlay = mutable_appearance(accessory.icon, layer = -layer)
+ if(accessory.gender_specific)
+ inner_accessory_overlay.icon_state = "[g]_[bodypart]inner_[accessory.icon_state]_[layertext]"
else
- inner_accessory_overlay.icon_state = "m_[bodypart]inner_[S.icon_state]_[layertext]"
+ inner_accessory_overlay.icon_state = "m_[bodypart]inner_[accessory.icon_state]_[layertext]"
- if(S.center)
- inner_accessory_overlay = center_image(inner_accessory_overlay, S.dimension_x, S.dimension_y)
+ if(accessory.center)
+ inner_accessory_overlay = center_image(inner_accessory_overlay, accessory.dimension_x, accessory.dimension_y)
standing += inner_accessory_overlay
- H.overlays_standing[layer] = standing.Copy()
+ source.overlays_standing[layer] = standing.Copy()
standing = list()
- H.apply_overlay(BODY_BEHIND_LAYER)
- H.apply_overlay(BODY_ADJ_LAYER)
- H.apply_overlay(BODY_FRONT_LAYER)
+ source.apply_overlay(BODY_BEHIND_LAYER)
+ source.apply_overlay(BODY_ADJ_LAYER)
+ source.apply_overlay(BODY_FRONT_LAYER)
*/
//SKYRAT EDIT REMOVAL END
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/drone_tools.dm b/code/modules/mob/living/simple_animal/friendly/drone/drone_tools.dm
index d6314a6b303..9f7f7605d83 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/drone_tools.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/drone_tools.dm
@@ -57,12 +57,14 @@
random_color = FALSE
-/obj/item/screwdriver/drone/worn_overlays(isinhands = FALSE, icon_file)
- . = list()
- if(isinhands)
- var/mutable_appearance/head = mutable_appearance(icon_file, "screwdriver_head")
- head.appearance_flags = RESET_COLOR
- . += head
+/obj/item/screwdriver/drone/worn_overlays(mutable_appearance/standing, isinhands = FALSE, icon_file)
+ . = ..()
+ if(!isinhands)
+ return
+
+ var/mutable_appearance/head = mutable_appearance(icon_file, "screwdriver_head")
+ head.appearance_flags = RESET_COLOR
+ . += head
/obj/item/wrench/drone
name = "built-in wrench"
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 556b4f09fb2..73ee0afcc57 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -12,6 +12,7 @@
movement_type = FLYING
wound_bonus = CANT_WOUND // can't wound by default
generic_canpass = FALSE
+ blocks_emissive = EMISSIVE_BLOCK_GENERIC
//The sound this plays on impact.
var/hitsound = 'sound/weapons/pierce.ogg'
var/hitsound_wall = ""
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 10331414e14..82e44285caa 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -1868,6 +1868,119 @@
carpet_type = /turf/open/floor/carpet/royalblue
chemical_flags = REAGENT_CAN_BE_SYNTHESIZED
+/datum/reagent/carpet/neon
+ name = "Neon Carpet"
+ description = "For those who like the 1980s, vegas, and debugging."
+ color = COLOR_ALMOST_BLACK
+ taste_description = "neon"
+ ph = 6
+ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED
+ carpet_type = /turf/open/floor/carpet/neon
+
+/datum/reagent/carpet/neon/simple_white
+ name = "Simple White Neon Carpet"
+ description = "For those who like fluorescent lighting."
+ color = LIGHT_COLOR_HALOGEN
+ taste_description = "sodium vapor"
+ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED
+ carpet_type = /turf/open/floor/carpet/neon/simple/white
+
+/datum/reagent/carpet/neon/simple_red
+ name = "Simple Red Neon Carpet"
+ description = "For those who like a bit of uncertainty."
+ color = COLOR_RED
+ taste_description = "neon hallucinations"
+ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED
+ carpet_type = /turf/open/floor/carpet/neon/simple/red
+
+/datum/reagent/carpet/neon/simple_orange
+ name = "Simple Orange Neon Carpet"
+ description = "For those who like some sharp edges."
+ color = COLOR_ORANGE
+ taste_description = "neon spines"
+ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED
+ carpet_type = /turf/open/floor/carpet/neon/simple/orange
+
+/datum/reagent/carpet/neon/simple_yellow
+ name = "Simple Yellow Neon Carpet"
+ description = "For those who need a little stability in their lives."
+ color = COLOR_YELLOW
+ taste_description = "stabilized neon"
+ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED
+ carpet_type = /turf/open/floor/carpet/neon/simple/yellow
+
+/datum/reagent/carpet/neon/simple_lime
+ name = "Simple Lime Neon Carpet"
+ description = "For those who need a little bitterness."
+ color = COLOR_LIME
+ taste_description = "neon citrus"
+ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED
+ carpet_type = /turf/open/floor/carpet/neon/simple/lime
+
+/datum/reagent/carpet/neon/simple_green
+ name = "Simple Green Neon Carpet"
+ description = "For those who need a little bit of change in their lives."
+ color = COLOR_GREEN
+ taste_description = "radium"
+ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED
+ carpet_type = /turf/open/floor/carpet/neon/simple/green
+
+/datum/reagent/carpet/neon/simple_teal
+ name = "Simple Teal Neon Carpet"
+ description = "For those who need a smoke."
+ color = COLOR_TEAL
+ taste_description = "neon tobacco"
+ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED
+ carpet_type = /turf/open/floor/carpet/neon/simple/teal
+
+/datum/reagent/carpet/neon/simple_cyan
+ name = "Simple Cyan Neon Carpet"
+ description = "For those who need to take a breath."
+ color = COLOR_DARK_CYAN
+ taste_description = "neon air"
+ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED
+ carpet_type = /turf/open/floor/carpet/neon/simple/cyan
+
+/datum/reagent/carpet/neon/simple_blue
+ name = "Simple Blue Neon Carpet"
+ description = "For those who need to feel joy again."
+ color = COLOR_NAVY
+ taste_description = "neon blue"
+ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED
+ carpet_type = /turf/open/floor/carpet/neon/simple/blue
+
+/datum/reagent/carpet/neon/simple_purple
+ name = "Simple Purple Neon Carpet"
+ description = "For those that need a little bit of exploration."
+ color = COLOR_PURPLE
+ taste_description = "neon hell"
+ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED
+ carpet_type = /turf/open/floor/carpet/neon/simple/purple
+
+/datum/reagent/carpet/neon/simple_violet
+ name = "Simple Violet Neon Carpet"
+ description = "For those who want to temp fate."
+ color = COLOR_VIOLET
+ taste_description = "neon hell"
+ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED
+ carpet_type = /turf/open/floor/carpet/neon/simple/violet
+
+/datum/reagent/carpet/neon/simple_pink
+ name = "Simple Pink Neon Carpet"
+ description = "For those just want to stop thinking so much."
+ color = COLOR_PINK
+ taste_description = "neon pink"
+ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED
+ carpet_type = /turf/open/floor/carpet/neon/simple/pink
+
+/datum/reagent/carpet/neon/simple_black
+ name = "Simple Black Neon Carpet"
+ description = "For those who need to catch their breath."
+ color = COLOR_BLACK
+ taste_description = "neon ash"
+ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED
+ carpet_type = /turf/open/floor/carpet/neon/simple/black
+
/datum/reagent/bromine
name = "Bromine"
description = "A brownish liquid that's highly reactive. Useful for stopping free radicals, but not intended for human consumption."
diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm
index 993308cf5d1..9d20de8782a 100644
--- a/code/modules/reagents/chemistry/recipes/others.dm
+++ b/code/modules/reagents/chemistry/recipes/others.dm
@@ -461,6 +461,57 @@
results = list(/datum/reagent/carpet/royal/blue = 2)
required_reagents = list(/datum/reagent/carpet/blue = 1, /datum/reagent/royal_bee_jelly = 1)
+/datum/chemical_reaction/carpet/simple_neon_white
+ results = list(/datum/reagent/carpet/neon/simple_white = 2)
+ required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/consumable/tinlux = 1, /datum/reagent/sodium = 1)
+
+/datum/chemical_reaction/carpet/simple_neon_red
+ results = list(/datum/reagent/carpet/neon/simple_red = 2)
+ required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/consumable/tinlux = 1, /datum/reagent/toxin/mindbreaker = 1)
+
+/datum/chemical_reaction/carpet/simple_neon_orange
+ results = list(/datum/reagent/carpet/neon/simple_orange = 2)
+ required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/consumable/tinlux = 1, /datum/reagent/consumable/vitfro = 1)
+
+/datum/chemical_reaction/carpet/simple_neon_yellow
+ results = list(/datum/reagent/carpet/neon/simple_yellow = 2)
+ required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/consumable/tinlux = 1, /datum/reagent/stabilizing_agent = 1)
+
+/datum/chemical_reaction/carpet/simple_neon_lime
+ results = list(/datum/reagent/carpet/neon/simple_lime = 2)
+ required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/consumable/tinlux = 1, /datum/reagent/consumable/limejuice = 1)
+
+/datum/chemical_reaction/carpet/simple_neon_green
+ results = list(/datum/reagent/carpet/neon/simple_green = 2)
+ required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/consumable/tinlux = 1, /datum/reagent/toxin/mutagen = 1)
+
+/datum/chemical_reaction/carpet/simple_neon_cyan
+ results = list(/datum/reagent/carpet/neon/simple_cyan = 2)
+ required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/consumable/tinlux = 1, /datum/reagent/medicine/salbutamol = 1)
+
+/datum/chemical_reaction/carpet/simple_neon_teal
+ results = list(/datum/reagent/carpet/neon/simple_teal = 2)
+ required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/consumable/tinlux = 1, /datum/reagent/drug/nicotine = 1)
+
+/datum/chemical_reaction/carpet/simple_neon_blue
+ results = list(/datum/reagent/carpet/neon/simple_blue = 2)
+ required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/consumable/tinlux = 1, /datum/reagent/drug/happiness = 1)
+
+/datum/chemical_reaction/carpet/simple_neon_purple
+ results = list(/datum/reagent/carpet/neon/simple_purple = 2)
+ required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/consumable/tinlux = 1, /datum/reagent/plasma_oxide = 1)
+
+/datum/chemical_reaction/carpet/simple_neon_violet
+ results = list(/datum/reagent/carpet/neon/simple_violet = 2)
+ required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/consumable/tinlux = 1, /datum/reagent/medicine/c2/helbital = 1)
+
+/datum/chemical_reaction/carpet/simple_neon_pink
+ results = list(/datum/reagent/carpet/neon/simple_pink = 2)
+ required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/consumable/tinlux = 1, /datum/reagent/impedrezene = 1)
+
+/datum/chemical_reaction/carpet/simple_neon_black
+ results = list(/datum/reagent/carpet/neon/simple_black = 2)
+ required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/consumable/tinlux = 1, /datum/reagent/medicine/c2/multiver = 1)
/datum/chemical_reaction/oil
results = list(/datum/reagent/fuel/oil = 3)
diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm
index 420bcb8f95b..47519fc8e18 100644
--- a/code/modules/surgery/bodyparts/_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/_bodyparts.dm
@@ -893,6 +893,12 @@
else
limb.icon = 'icons/mob/augmentation/augments.dmi'
limb.icon_state = "[animal_origin]_[body_zone]"
+
+ if(blocks_emissive)
+ var/mutable_appearance/limb_em_block = mutable_appearance(limb.icon, limb.icon_state, plane = EMISSIVE_PLANE, appearance_flags = KEEP_APART)
+ limb_em_block.dir = image_dir
+ limb_em_block.color = GLOB.em_block_color
+ limb.overlays += limb_em_block
return
var/icon_gender = (body_gender == FEMALE) ? "f" : "m" //gender of the icon, if applicable
@@ -900,33 +906,46 @@
if((body_zone != BODY_ZONE_HEAD && body_zone != BODY_ZONE_CHEST))
should_draw_gender = FALSE
- if(is_organic_limb())
- if(should_draw_greyscale)
- limb.icon = 'icons/mob/human_parts_greyscale.dmi'
- if(should_draw_gender)
- limb.icon_state = "[species_id]_[body_zone]_[icon_gender]"
- else if(use_digitigrade)
- limb.icon_state = "digitigrade_[use_digitigrade]_[body_zone]"
- else
- limb.icon_state = "[species_id]_[body_zone]"
- else
- limb.icon = 'icons/mob/human_parts.dmi'
- if(should_draw_gender)
- limb.icon_state = "[species_id]_[body_zone]_[icon_gender]"
- else
- limb.icon_state = "[species_id]_[body_zone]"
- if(aux_zone)
- aux = image(limb.icon, "[species_id]_[aux_zone]", -aux_layer, image_dir)
- . += aux
-
- else
+ if(!is_organic_limb())
limb.icon = icon
limb.icon_state = "[body_zone]" //Inorganic limbs are agender
+
+ if(blocks_emissive)
+ var/mutable_appearance/limb_em_block = mutable_appearance(limb.icon, limb.icon_state, plane = EMISSIVE_PLANE, appearance_flags = KEEP_APART)
+ limb_em_block.dir = image_dir
+ limb_em_block.color = GLOB.em_block_color
+ limb.overlays += limb_em_block
+
if(aux_zone)
aux = image(limb.icon, "[aux_zone]", -aux_layer, image_dir)
. += aux
+
+ if(blocks_emissive)
+ var/mutable_appearance/aux_em_block = mutable_appearance(aux.icon, aux.icon_state, plane = EMISSIVE_PLANE, appearance_flags = KEEP_APART)
+ aux_em_block.dir = image_dir
+ aux_em_block.color = GLOB.em_block_color
+ aux.overlays += aux_em_block
+
return
+ if(should_draw_greyscale)
+ limb.icon = 'icons/mob/human_parts_greyscale.dmi'
+ if(should_draw_gender)
+ limb.icon_state = "[species_id]_[body_zone]_[icon_gender]"
+ else if(use_digitigrade)
+ limb.icon_state = "digitigrade_[use_digitigrade]_[body_zone]"
+ else
+ limb.icon_state = "[species_id]_[body_zone]"
+ else
+ limb.icon = 'icons/mob/human_parts.dmi'
+ if(should_draw_gender)
+ limb.icon_state = "[species_id]_[body_zone]_[icon_gender]"
+ else
+ limb.icon_state = "[species_id]_[body_zone]"
+
+ if(aux_zone)
+ aux = image(limb.icon, "[species_id]_[aux_zone]", -aux_layer, image_dir)
+ . += aux
if(should_draw_greyscale)
var/draw_color = mutation_color || species_color || (skin_tone && skintone2hex(skin_tone))
@@ -934,9 +953,22 @@
limb.color = "#[draw_color]"
if(aux_zone)
aux.color = "#[draw_color]"
+ if(blocks_emissive)
+ var/mutable_appearance/limb_em_block = mutable_appearance(limb.icon, limb.icon_state, plane = EMISSIVE_PLANE, appearance_flags = KEEP_APART)
+ limb_em_block.dir = image_dir
+ limb_em_block.color = GLOB.em_block_color
+ limb.overlays += limb_em_block
+
+ if(aux_zone)
+ var/mutable_appearance/aux_em_block = mutable_appearance(aux.icon, aux.icon_state, plane = EMISSIVE_PLANE, appearance_flags = KEEP_APART)
+ aux_em_block.dir = image_dir
+ aux_em_block.color = GLOB.em_block_color
+ aux.overlays += aux_em_block
*/
//SKYRAT EDIT REMOVAL END
+
+
/obj/item/bodypart/deconstruct(disassembled = TRUE)
drop_organs()
qdel(src)
diff --git a/code/modules/vehicles/_vehicle.dm b/code/modules/vehicles/_vehicle.dm
index 0a8014b50f4..544446dc66d 100644
--- a/code/modules/vehicles/_vehicle.dm
+++ b/code/modules/vehicles/_vehicle.dm
@@ -7,6 +7,7 @@
armor = list(MELEE = 30, BULLET = 30, LASER = 30, ENERGY = 0, BOMB = 30, BIO = 0, RAD = 0, FIRE = 60, ACID = 60)
density = TRUE
anchored = FALSE
+ blocks_emissive = EMISSIVE_BLOCK_GENERIC
COOLDOWN_DECLARE(cooldown_vehicle_move)
var/list/mob/occupants //mob = bitflags of their control level.
///Maximum amount of passengers plus drivers
diff --git a/icons/mob/inhands/misc/tiles_lefthand.dmi b/icons/mob/inhands/misc/tiles_lefthand.dmi
index d7903fcd483..af31f2a395e 100644
Binary files a/icons/mob/inhands/misc/tiles_lefthand.dmi and b/icons/mob/inhands/misc/tiles_lefthand.dmi differ
diff --git a/icons/mob/inhands/misc/tiles_righthand.dmi b/icons/mob/inhands/misc/tiles_righthand.dmi
index 9295ac73444..aab05250281 100644
Binary files a/icons/mob/inhands/misc/tiles_righthand.dmi and b/icons/mob/inhands/misc/tiles_righthand.dmi differ
diff --git a/icons/obj/tiles.dmi b/icons/obj/tiles.dmi
index 2045dc56661..08870065730 100644
Binary files a/icons/obj/tiles.dmi and b/icons/obj/tiles.dmi differ
diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi
index dca5b3b5f5b..5696db5f106 100644
Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ
diff --git a/icons/turf/floors/carpet_neon_simple.dmi b/icons/turf/floors/carpet_neon_simple.dmi
new file mode 100644
index 00000000000..62cb355a2db
Binary files /dev/null and b/icons/turf/floors/carpet_neon_simple.dmi differ
diff --git a/modular_skyrat/modules/aesthetics/airlock/code/airlock.dm b/modular_skyrat/modules/aesthetics/airlock/code/airlock.dm
index 8b406703b48..4edfad63ff0 100644
--- a/modular_skyrat/modules/aesthetics/airlock/code/airlock.dm
+++ b/modular_skyrat/modules/aesthetics/airlock/code/airlock.dm
@@ -7,6 +7,7 @@
#define AIRLOCK_EMERGENCY_LIGHT_COLOR "#d1d11d"
#define AIRLOCK_DENY_LIGHT_COLOR "#c23b23"
//SKYRAT ADDITION END
+
#define AIRLOCK_CLOSED 1
#define AIRLOCK_CLOSING 2
#define AIRLOCK_OPEN 3
@@ -61,195 +62,99 @@
/obj/machinery/door/airlock/update_overlays()
. = ..()
-
- var/mutable_appearance/frame_overlay
- var/mutable_appearance/filling_overlay
- var/lights_overlay = ""
- var/mutable_appearance/panel_overlay
- var/mutable_appearance/weld_overlay
- var/mutable_appearance/damag_overlay
- var/mutable_appearance/sparks_overlay
- var/mutable_appearance/note_overlay
- var/mutable_appearance/seal_overlay
-
- var/notetype = note_type()
var/pre_light_range = 0
var/pre_light_power = 0
var/pre_light_color = ""
+ var/lights_overlay = ""
+ var/frame_state
+ var/light_state
switch(airlock_state)
if(AIRLOCK_CLOSED)
- frame_overlay = get_airlock_overlay("closed", icon)
- if(airlock_material)
- filling_overlay = get_airlock_overlay("[airlock_material]_closed", overlays_file)
+ frame_state = AIRLOCK_FRAME_CLOSED
+ if(locked)
+ light_state = AIRLOCK_LIGHT_BOLTS
+ lights_overlay = "lights_bolts"
+ pre_light_color = light_color_bolts
+ else if(emergency)
+ light_state = AIRLOCK_LIGHT_EMERGENCY
+ lights_overlay = "lights_emergency"
+ pre_light_color = light_color_emergency
else
- filling_overlay = get_airlock_overlay("fill_closed", icon)
- if(panel_open)
- if(security_level)
- panel_overlay = get_airlock_overlay("panel_closed_protected", overlays_file)
- else
- panel_overlay = get_airlock_overlay("panel_closed", overlays_file)
- if(welded)
- weld_overlay = get_airlock_overlay("welded", overlays_file)
- if(seal)
- seal_overlay = get_airlock_overlay("sealed", overlays_file)
- if(obj_integrity < integrity_failure * max_integrity)
- damag_overlay = get_airlock_overlay("sparks_broken", overlays_file)
- else if(obj_integrity < (0.75 * max_integrity))
- damag_overlay = get_airlock_overlay("sparks_damaged", overlays_file)
- if(lights && hasPower())
- pre_light_range = door_light_range
- pre_light_power = door_light_power
- if(locked)
- lights_overlay = "lights_bolts"
- pre_light_color = light_color_bolts
- else if(emergency)
- lights_overlay = "lights_emergency"
- pre_light_color = light_color_emergency
- else
- lights_overlay = "lights_poweron"
- pre_light_color = light_color_poweron
- if(note)
- note_overlay = get_airlock_overlay(notetype, note_overlay_file)
-
+ lights_overlay = "lights_poweron"
+ pre_light_color = light_color_poweron
if(AIRLOCK_DENY)
- if(!hasPower())
- return
- frame_overlay = get_airlock_overlay("closed", icon)
- if(airlock_material)
- filling_overlay = get_airlock_overlay("[airlock_material]_closed", overlays_file)
- else
- filling_overlay = get_airlock_overlay("fill_closed", icon)
- if(panel_open)
- if(security_level)
- panel_overlay = get_airlock_overlay("panel_closed_protected", overlays_file)
- else
- panel_overlay = get_airlock_overlay("panel_closed", overlays_file)
- if(obj_integrity < integrity_failure * max_integrity)
- damag_overlay = get_airlock_overlay("sparks_broken", overlays_file)
- else if(obj_integrity < (0.75 * max_integrity))
- damag_overlay = get_airlock_overlay("sparks_damaged", overlays_file)
- if(welded)
- weld_overlay = get_airlock_overlay("welded", overlays_file)
- if(seal)
- seal_overlay = get_airlock_overlay("sealed", overlays_file)
- if(lights && hasPower())
- pre_light_range = door_light_range
- pre_light_power = door_light_power
- lights_overlay = "lights_denied"
- pre_light_color = light_color_deny
- if(note)
- note_overlay = get_airlock_overlay(notetype, note_overlay_file)
-
+ frame_state = AIRLOCK_FRAME_CLOSED
+ light_state = AIRLOCK_LIGHT_DENIED
+ lights_overlay = "lights_denied"
+ pre_light_color = light_color_deny
if(AIRLOCK_EMAG)
- frame_overlay = get_airlock_overlay("closed", icon)
- sparks_overlay = get_airlock_overlay("sparks", overlays_file)
- if(airlock_material)
- filling_overlay = get_airlock_overlay("[airlock_material]_closed", overlays_file)
- else
- filling_overlay = get_airlock_overlay("fill_closed", icon)
- if(panel_open)
- if(security_level)
- panel_overlay = get_airlock_overlay("panel_closed_protected", overlays_file)
- else
- panel_overlay = get_airlock_overlay("panel_closed", overlays_file)
- if(obj_integrity < integrity_failure * max_integrity)
- damag_overlay = get_airlock_overlay("sparks_broken", overlays_file)
- else if(obj_integrity < (0.75 * max_integrity))
- damag_overlay = get_airlock_overlay("sparks_damaged", overlays_file)
- if(welded)
- weld_overlay = get_airlock_overlay("welded", overlays_file)
- if(seal)
- seal_overlay = get_airlock_overlay("sealed", overlays_file)
- if(note)
- note_overlay = get_airlock_overlay(notetype, note_overlay_file)
-
+ frame_state = AIRLOCK_FRAME_CLOSED
if(AIRLOCK_CLOSING)
- frame_overlay = get_airlock_overlay("closing", icon)
- if(airlock_material)
- filling_overlay = get_airlock_overlay("[airlock_material]_closing", overlays_file)
- else
- filling_overlay = get_airlock_overlay("fill_closing", icon)
- if(lights && hasPower())
- pre_light_range = door_light_range
- pre_light_power = door_light_power
- //lights_overlay = get_airlock_overlay("lights_opening", overlays_file)
- lights_overlay = "lights_closing"
- pre_light_color = light_color_access
- if(panel_open)
- if(security_level)
- panel_overlay = get_airlock_overlay("panel_closing_protected", overlays_file)
- else
- panel_overlay = get_airlock_overlay("panel_closing", overlays_file)
- if(note)
- note_overlay = get_airlock_overlay("[notetype]_closing", note_overlay_file)
-
+ frame_state = AIRLOCK_FRAME_CLOSING
+ light_state = AIRLOCK_LIGHT_CLOSING
+ lights_overlay = "lights_closing"
+ pre_light_color = light_color_access
if(AIRLOCK_OPEN)
- frame_overlay = get_airlock_overlay("open", icon)
- if(airlock_material)
- filling_overlay = get_airlock_overlay("[airlock_material]_open", overlays_file)
+ frame_state = AIRLOCK_FRAME_OPEN
+ if(locked)
+ lights_overlay = "lights_bolts_open"
+ pre_light_color = light_color_bolts
+ else if(emergency)
+ lights_overlay = "lights_emergency_open"
+ pre_light_color = light_color_emergency
else
- filling_overlay = get_airlock_overlay("fill_open", icon)
- if(panel_open)
- if(security_level)
- panel_overlay = get_airlock_overlay("panel_open_protected", overlays_file)
- else
- panel_overlay = get_airlock_overlay("panel_open", overlays_file)
- if(obj_integrity < (0.75 * max_integrity))
- damag_overlay = get_airlock_overlay("sparks_open", overlays_file)
- if(lights && hasPower())
- pre_light_range = door_light_range
- pre_light_power = door_light_power
- if(locked)
- lights_overlay = "lights_bolts_open"
- pre_light_color = light_color_bolts
- else if(emergency)
- lights_overlay = "lights_emergency_open"
- pre_light_color = light_color_emergency
- else
- lights_overlay = "lights_poweron_open"
- pre_light_color = light_color_poweron
- if(note)
- note_overlay = get_airlock_overlay("[notetype]_open", note_overlay_file)
-
+ lights_overlay = "lights_poweron_open"
+ pre_light_color = light_color_poweron
if(AIRLOCK_OPENING)
- frame_overlay = get_airlock_overlay("opening", icon)
- if(airlock_material)
- filling_overlay = get_airlock_overlay("[airlock_material]_opening", overlays_file)
- else
- filling_overlay = get_airlock_overlay("fill_opening", icon)
- if(lights && hasPower())
- pre_light_range = door_light_range
- pre_light_power = door_light_power
- //lights_overlay = get_airlock_overlay("lights_opening", overlays_file)
- lights_overlay = "lights_opening"
- pre_light_color = light_color_access
- if(panel_open)
- if(security_level)
- panel_overlay = get_airlock_overlay("panel_opening_protected", overlays_file)
- else
- panel_overlay = get_airlock_overlay("panel_opening", overlays_file)
- if(note)
- note_overlay = get_airlock_overlay("[notetype]_opening", note_overlay_file)
+ frame_state = AIRLOCK_FRAME_OPENING
+ light_state = AIRLOCK_LIGHT_OPENING
+ lights_overlay = "lights_opening"
+ pre_light_color = light_color_access
- cut_overlays()
+ . += get_airlock_overlay(frame_state, icon, em_block = TRUE)
+ if(airlock_material)
+ . += get_airlock_overlay("[airlock_material]_[frame_state]", overlays_file, em_block = TRUE)
+ else
+ . += get_airlock_overlay("fill_[frame_state]", icon, em_block = TRUE)
- if(has_environment_lights)
- set_light(pre_light_range, pre_light_power, pre_light_color)
- if(multi_tile)
- filler.set_light(pre_light_range, pre_light_power, pre_light_color)
-
- . += frame_overlay
- . += filling_overlay
- . += panel_overlay
- . += weld_overlay
- . += sparks_overlay
- . += damag_overlay
- . += note_overlay
- . += seal_overlay
+ if(lights && hasPower())
+ . += get_airlock_overlay("lights_[light_state]", overlays_file, em_block = FALSE)
+ pre_light_range = door_light_range
+ pre_light_power = door_light_power
+ if(has_environment_lights)
+ set_light(pre_light_range, pre_light_power, pre_light_color, TRUE)
+ if(multi_tile)
+ filler.set_light(pre_light_range, pre_light_power, pre_light_color)
+ else
+ lights_overlay = ""
update_vis_overlays(lights_overlay)
+ if(panel_open)
+ . += get_airlock_overlay("panel_[frame_state][security_level ? "_protected" : null]", overlays_file, em_block = TRUE)
+ if(frame_state == AIRLOCK_FRAME_CLOSED && welded)
+ . += get_airlock_overlay("welded", overlays_file, em_block = TRUE)
+
+ if(airlock_state == AIRLOCK_EMAG)
+ . += get_airlock_overlay("sparks", overlays_file, em_block = FALSE)
+
+ if(hasPower())
+ if(frame_state == AIRLOCK_FRAME_CLOSED)
+ if(obj_integrity < integrity_failure * max_integrity)
+ . += get_airlock_overlay("sparks_broken", overlays_file, em_block = FALSE)
+ else if(obj_integrity < (0.75 * max_integrity))
+ . += get_airlock_overlay("sparks_damaged", overlays_file, em_block = FALSE)
+ else if(frame_state == AIRLOCK_FRAME_OPEN)
+ if(obj_integrity < (0.75 * max_integrity))
+ . += get_airlock_overlay("sparks_open", overlays_file, em_block = FALSE)
+
+ if(note)
+ . += get_airlock_overlay(note_type(), note_overlay_file, em_block = TRUE)
+
+ if(frame_state == AIRLOCK_FRAME_CLOSED && seal)
+ . += get_airlock_overlay("sealed", overlays_file, em_block = TRUE)
+
if(hasPower() && unres_sides)
if(unres_sides & NORTH)
var/image/I = image(icon='icons/obj/doors/airlocks/station/overlays.dmi', icon_state="unres_n")
diff --git a/modular_skyrat/modules/aesthetics/floors/icons/floors.dmi b/modular_skyrat/modules/aesthetics/floors/icons/floors.dmi
index c189de4f038..ac7869ca30d 100644
Binary files a/modular_skyrat/modules/aesthetics/floors/icons/floors.dmi and b/modular_skyrat/modules/aesthetics/floors/icons/floors.dmi differ
diff --git a/modular_skyrat/modules/customization/modules/surgery/bodyparts/_bodyparts.dm b/modular_skyrat/modules/customization/modules/surgery/bodyparts/_bodyparts.dm
index 3b1273c8de2..771bde0be39 100644
--- a/modular_skyrat/modules/customization/modules/surgery/bodyparts/_bodyparts.dm
+++ b/modular_skyrat/modules/customization/modules/surgery/bodyparts/_bodyparts.dm
@@ -26,6 +26,12 @@
else
limb.icon = 'icons/mob/augmentation/augments.dmi'
limb.icon_state = "[animal_origin]_[body_zone]"
+
+ if(blocks_emissive)
+ var/mutable_appearance/limb_em_block = mutable_appearance(limb.icon, limb.icon_state, plane = EMISSIVE_PLANE, appearance_flags = KEEP_APART)
+ limb_em_block.dir = image_dir
+ limb_em_block.color = GLOB.em_block_color
+ limb.overlays += limb_em_block
return
var/icon_gender = (body_gender == FEMALE) ? "f" : "m" //gender of the icon, if applicable
@@ -51,7 +57,6 @@
if(aux_zone)
aux = image(limb.icon, "[species_id]_[aux_zone]", -aux_layer, image_dir)
. += aux
-
else
limb.icon = icon
if(should_draw_gender)
@@ -61,6 +66,11 @@
if(aux_zone)
aux = image(limb.icon, "[aux_zone]", -aux_layer, image_dir)
. += aux
+ if(blocks_emissive)
+ var/mutable_appearance/limb_em_block = mutable_appearance(limb.icon, limb.icon_state, plane = EMISSIVE_PLANE, appearance_flags = KEEP_APART)
+ limb_em_block.dir = image_dir
+ limb_em_block.color = GLOB.em_block_color
+ limb.overlays += limb_em_block
return
@@ -119,3 +129,15 @@
accessory_overlay.color = "#[H.dna.species.body_markings[aux_zone][key]]"
accessory_overlay.alpha = H.dna.species.markings_alpha
. += accessory_overlay
+
+ if(blocks_emissive)
+ var/mutable_appearance/limb_em_block = mutable_appearance(limb.icon, limb.icon_state, plane = EMISSIVE_PLANE, appearance_flags = KEEP_APART)
+ limb_em_block.dir = image_dir
+ limb_em_block.color = GLOB.em_block_color
+ limb.overlays += limb_em_block
+
+ if(aux_zone)
+ var/mutable_appearance/aux_em_block = mutable_appearance(aux.icon, aux.icon_state, plane = EMISSIVE_PLANE, appearance_flags = KEEP_APART)
+ aux_em_block.dir = image_dir
+ aux_em_block.color = GLOB.em_block_color
+ aux.overlays += aux_em_block
diff --git a/modular_skyrat/modules/digi_bloodsole/code/modules/clothing/shoes/_shoes.dm b/modular_skyrat/modules/digi_bloodsole/code/modules/clothing/shoes/_shoes.dm
index 5ba79fcf230..e0e8eeaf728 100644
--- a/modular_skyrat/modules/digi_bloodsole/code/modules/clothing/shoes/_shoes.dm
+++ b/modular_skyrat/modules/digi_bloodsole/code/modules/clothing/shoes/_shoes.dm
@@ -1,5 +1,5 @@
/obj/item/clothing/shoes/worn_overlays(isinhands = FALSE,icon_file,mutant_styles=NONE)
- . = list()
+ . = ..()
if(isinhands)
return
if(damaged_clothes)
diff --git a/tgstation.dme b/tgstation.dme
index 9d2f88fae0c..193af9fc568 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -726,7 +726,6 @@
#include "code\datums\elements\connect_loc.dm"
#include "code\datums\elements\curse_announcement.dm"
#include "code\datums\elements\cursed.dm"
-#include "code\datums\elements\decal.dm"
#include "code\datums\elements\deferred_aquarium_content.dm"
#include "code\datums\elements\digitalcamo.dm"
#include "code\datums\elements\drag_pickup.dm"
@@ -768,6 +767,7 @@
#include "code\datums\elements\volatile_gas_storage.dm"
#include "code\datums\elements\waddling.dm"
#include "code\datums\elements\weapon_description.dm"
+#include "code\datums\elements\decals\_decal.dm"
#include "code\datums\elements\decals\blood.dm"
#include "code\datums\elements\food\dunkable.dm"
#include "code\datums\elements\food\food_trash.dm"