From 70024ef6ad8351b8ecec64bdf0a31632d50dcd26 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Wed, 3 Feb 2021 10:22:43 +0100 Subject: [PATCH] [MIRROR] Reverts Adds Neon Carpet (#55782) (#3040) * reverts Adds Neon Carpet (#55782), it appears to have been causing massive amounts of maptick (#56496) It appears to have been causing massive amounts of maptick, this'll need a testmerge so we can test my hypothesis * Reverts Adds Neon Carpet (#55782) Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com> --- code/__DEFINES/dcs/signals.dm | 2 - code/__DEFINES/icon_smoothing.dm | 56 ++-- code/__DEFINES/layers.dm | 94 +++--- code/__HELPERS/icon_smoothing.dm | 1 - code/_onclick/hud/plane_master.dm | 115 ++----- .../components/storage/concrete/stack.dm | 2 +- .../elements/{decals/_decal.dm => decal.dm} | 13 +- code/datums/elements/decals/blood.dm | 6 +- code/datums/elements/decals/smoothing.dm | 40 --- code/datums/elements/emissive_blocker.dm | 33 -- code/game/atoms.dm | 3 - code/game/atoms_movable.dm | 18 +- code/game/machinery/_machinery.dm | 2 - code/game/machinery/accounting.dm | 5 +- code/game/machinery/computer/_computer.dm | 4 +- code/game/machinery/doors/door.dm | 1 - code/game/machinery/firealarm.dm | 12 +- code/game/machinery/lightswitch.dm | 8 +- code/game/machinery/recharger.dm | 7 +- code/game/machinery/stasis.dm | 28 +- code/game/objects/effects/decals/decal.dm | 2 +- code/game/objects/items.dm | 1 - code/game/objects/items/airlock_painter.dm | 2 +- code/game/objects/items/stacks/stack.dm | 2 +- .../objects/items/stacks/tiles/tile_types.dm | 295 ------------------ code/game/objects/structures.dm | 2 - .../structures/crates_lockers/closets.dm | 4 +- code/game/turfs/open/floor/fancy_floor.dm | 237 -------------- code/modules/cargo/packs.dm | 34 -- .../kitchen_machinery/smartfridge.dm | 7 +- code/modules/lighting/emissive_blocker.dm | 5 +- code/modules/mob/mob_defines.dm | 1 - code/modules/power/apc.dm | 107 ++++--- code/modules/power/lighting.dm | 1 + .../chemistry/reagents/other_reagents.dm | 98 ------ .../reagents/chemistry/recipes/others.dm | 51 --- code/modules/recycling/disposal/bin.dm | 7 +- .../research/nanites/nanite_program_hub.dm | 3 +- .../research/nanites/nanite_programmer.dm | 3 +- code/modules/vehicles/_vehicle.dm | 2 - code/modules/vending/_vending.dm | 3 +- icons/obj/tiles.dmi | Bin 20625 -> 20033 bytes icons/turf/floors/carpet_neon_simple.dmi | Bin 7074 -> 0 bytes tgstation.dme | 4 +- 44 files changed, 211 insertions(+), 1110 deletions(-) rename code/datums/elements/{decals/_decal.dm => decal.dm} (82%) delete mode 100644 code/datums/elements/decals/smoothing.dm delete mode 100644 code/datums/elements/emissive_blocker.dm delete mode 100644 icons/turf/floors/carpet_neon_simple.dmi diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index 2b75057dd0d..9b06a745e91 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -84,8 +84,6 @@ #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/set_smoothed_icon_state]: (old_junction, new_junction) -#define COMSIG_ATOM_SMOOTH_BITMASK "atom_smooth_bitmask" ///from base of atom/Entered(): (atom/movable/entering, /atom) #define COMSIG_ATOM_ENTERED "atom_entered" ///from base of atom/Exit(): (/atom/movable/exiting, /atom/newloc) diff --git a/code/__DEFINES/icon_smoothing.dm b/code/__DEFINES/icon_smoothing.dm index 03ddb16067a..23f0746e2e1 100644 --- a/code/__DEFINES/icon_smoothing.dm +++ b/code/__DEFINES/icon_smoothing.dm @@ -51,43 +51,27 @@ DEFINE_BITFIELD(smoothing_flags, list( #define SMOOTH_GROUP_FLOOR_ICE S_TURF(8) ///turf/open/floor/plating/ice #define SMOOTH_GROUP_FLOOR_SNOWED S_TURF(9) ///turf/open/floor/plating/snowed -#define SMOOTH_GROUP_CARPET S_TURF(10) ///turf/open/floor/carpet -#define SMOOTH_GROUP_CARPET_BLACK S_TURF(11) ///turf/open/floor/carpet/black -#define SMOOTH_GROUP_CARPET_BLUE S_TURF(12) ///turf/open/floor/carpet/blue -#define SMOOTH_GROUP_CARPET_CYAN S_TURF(13) ///turf/open/floor/carpet/cyan -#define SMOOTH_GROUP_CARPET_GREEN S_TURF(14) ///turf/open/floor/carpet/green -#define SMOOTH_GROUP_CARPET_ORANGE S_TURF(15) ///turf/open/floor/carpet/orange -#define SMOOTH_GROUP_CARPET_PURPLE S_TURF(16) ///turf/open/floor/carpet/purple -#define SMOOTH_GROUP_CARPET_RED S_TURF(17) ///turf/open/floor/carpet/red -#define SMOOTH_GROUP_CARPET_ROYAL_BLACK S_TURF(18) ///turf/open/floor/carpet/royalblack -#define SMOOTH_GROUP_CARPET_ROYAL_BLUE S_TURF(19) ///turf/open/floor/carpet/royalblue -#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_EMISSIVE S_TURF(23) ///turf/open/floor/carpet/emissive -#define SMOOTH_GROUP_CARPET_NEON S_TURF(24) ///turf/open/floor/carpet/emissive/neon -#define SMOOTH_GROUP_CARPET_SIMPLE_NEON S_TURF(25) ///turf/open/floor/carpet/emissive/neon/simple -#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_WHITE S_TURF(26) ///turf/open/floor/carpet/emissive/neon/simple/white -#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_RED S_TURF(27) ///turf/open/floor/carpet/emissive/neon/simple/red -#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_ORANGE S_TURF(28) ///turf/open/floor/carpet/emissive/neon/simple/orange -#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_YELLOW S_TURF(29) ///turf/open/floor/carpet/emissive/neon/simple/yellow -#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_LIME S_TURF(30) ///turf/open/floor/carpet/emissive/neon/simple/lime -#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_GREEN S_TURF(31) ///turf/open/floor/carpet/emissive/neon/simple/green -#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_CYAN S_TURF(32) ///turf/open/floor/carpet/emissive/neon/simple/cyan -#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_TEAL S_TURF(33) ///turf/open/floor/carpet/emissive/neon/simple/teal -#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLUE S_TURF(34) ///turf/open/floor/carpet/emissive/neon/simple/blue -#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_PURPLE S_TURF(35) ///turf/open/floor/carpet/emissive/neon/simple/purple -#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_VIOLET S_TURF(36) ///turf/open/floor/carpet/emissive/neon/simple/violet -#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_PINK S_TURF(37) ///turf/open/floor/carpet/emissive/neon/simple/pink -#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLACK S_TURF(38) ///turf/open/floor/carpet/emissive/neon/simple/black +#define SMOOTH_GROUP_CARPET S_TURF(10) ///turf/open/floor/carpet +#define SMOOTH_GROUP_CARPET_BLACK S_TURF(11) ///turf/open/floor/carpet/black +#define SMOOTH_GROUP_CARPET_BLUE S_TURF(12) ///turf/open/floor/carpet/blue +#define SMOOTH_GROUP_CARPET_CYAN S_TURF(13) ///turf/open/floor/carpet/cyan +#define SMOOTH_GROUP_CARPET_GREEN S_TURF(14) ///turf/open/floor/carpet/green +#define SMOOTH_GROUP_CARPET_ORANGE S_TURF(15) ///turf/open/floor/carpet/orange +#define SMOOTH_GROUP_CARPET_PURPLE S_TURF(16) ///turf/open/floor/carpet/purple +#define SMOOTH_GROUP_CARPET_RED S_TURF(17) ///turf/open/floor/carpet/red +#define SMOOTH_GROUP_CARPET_ROYAL_BLACK S_TURF(18) ///turf/open/floor/carpet/royalblack +#define SMOOTH_GROUP_CARPET_ROYAL_BLUE S_TURF(19) ///turf/open/floor/carpet/royalblue +#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_CLOSED_TURFS S_TURF(40) ///turf/closed -#define SMOOTH_GROUP_MATERIAL_WALLS S_TURF(41) ///turf/closed/wall/material -#define SMOOTH_GROUP_SYNDICATE_WALLS S_TURF(42) ///turf/closed/wall/r_wall/syndicate, /turf/closed/indestructible/syndicate -#define SMOOTH_GROUP_HOTEL_WALLS S_TURF(43) ///turf/closed/indestructible/hotelwall -#define SMOOTH_GROUP_MINERAL_WALLS S_TURF(44) ///turf/closed/mineral, /turf/closed/indestructible -#define SMOOTH_GROUP_BOSS_WALLS S_TURF(45) ///turf/closed/indestructible/riveted/boss -#define SMOOTH_GROUP_SURVIVAL_TITANIUM_WALLS S_TURF(46) ///turf/closed/wall/mineral/titanium/survival +#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 MAX_S_TURF SMOOTH_GROUP_SURVIVAL_TITANIUM_WALLS //Always match this value with the one above it. diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index d4d5876be8e..170b8842f54 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -92,88 +92,66 @@ #define MASSIVE_OBJ_LAYER 11 #define POINT_LAYER 12 -#define EMISSIVE_BLOCKER_PLANE 10 +#define EMISSIVE_BLOCKER_PLANE 12 +#define EMISSIVE_BLOCKER_LAYER 12 #define EMISSIVE_BLOCKER_RENDER_TARGET "*EMISSIVE_BLOCKER_PLANE" -#define TURF_EMISSIVE_BLOCKER_PLANE 11 -#define TURF_EMISSIVE_BLOCKER_RENDER_TARGET "*EMISSIVE_BLOCKER_PLANE_TURF" -#define STRUCTURE_EMISSIVE_BLOCKER_PLANE 12 -#define STRUCTURE_EMISSIVE_BLOCKER_RENDER_TARGET "*EMISSIVE_BLOCKER_PLANE_STRUCTURE" -#define ITEM_EMISSIVE_BLOCKER_PLANE 13 -#define ITEM_EMISSIVE_BLOCKER_RENDER_TARGET "*EMISSIVE_BLOCKER_PLANE_ITEM" -#define MOB_EMISSIVE_BLOCKER_PLANE 14 -#define MOB_EMISSIVE_BLOCKER_RENDER_TARGET "*EMISSIVE_BLOCKER_PLANE_MOB" -#define EMISSIVE_PLANE 20 +#define CHAT_LAYER 12.0001 // Do not insert layers between these two values +#define CHAT_LAYER_MAX 12.9999 + +#define EMISSIVE_PLANE 13 +#define EMISSIVE_LAYER 13 #define EMISSIVE_RENDER_TARGET "*EMISSIVE_PLANE" -#define EMISSIVE_TURF_PLANE 21 -#define EMISSIVE_TURF_RENDER_TARGET "*EMISSIVE_PLANE_TURF" -#define EMISSIVE_STRUCTURE_PLANE 22 -#define EMISSIVE_STRUCTURE_RENDER_TARGET "*EMISSIVE_PLANE_STRUCTURE" -#define EMISSIVE_ITEM_PLANE 23 -#define EMISSIVE_ITEM_RENDER_TARGET "*EMISSIVE_PLANE_ITEM" -#define EMISSIVE_MOB_PLANE 24 -#define EMISSIVE_MOB_RENDER_TARGET "*EMISSIVE_PLANE_MOB" -#define EMISSIVE_UNBLOCKABLE_PLANE 31 + +#define EMISSIVE_UNBLOCKABLE_PLANE 14 +#define EMISSIVE_UNBLOCKABLE_LAYER 14 #define EMISSIVE_UNBLOCKABLE_RENDER_TARGET "*EMISSIVE_UNBLOCKABLE_PLANE" -// Layer definitions for emissive and emissive blocker layers. -// Since neither are directly rendered these are just used to tell which blocker planes can block which emissive layers. -// Higher layer blocker planes mask lower layer emissive planes. -// In the case of equivalent layers the emissive plane master takes priority so structures don't block their own overlays. -#define EMISSIVE_LAYER 20 -#define EMISSIVE_TURF_LAYER 21 -#define EMISSIVE_STRUCTURE_LAYER 22 -#define EMISSIVE_ITEM_LAYER 23 -#define EMISSIVE_MOB_LAYER 24 -#define EMISSIVE_UNBLOCKABLE_LAYER 31 - -#define LIGHTING_PLANE 41 -#define LIGHTING_LAYER 41 +#define LIGHTING_PLANE 15 +#define LIGHTING_LAYER 15 #define LIGHTING_RENDER_TARGET "LIGHT_PLANE" #define RAD_TEXT_LAYER 15.1 -#define O_LIGHTING_VISUAL_PLANE 42 -#define O_LIGHTING_VISUAL_LAYER 42 +#define O_LIGHTING_VISUAL_PLANE 16 +#define O_LIGHTING_VISUAL_LAYER 16 #define O_LIGHTING_VISUAL_RENDER_TARGET "O_LIGHT_VISUAL_PLANE" -#define ABOVE_LIGHTING_PLANE 43 -#define ABOVE_LIGHTING_LAYER 43 +#define ABOVE_LIGHTING_PLANE 17 +#define ABOVE_LIGHTING_LAYER 17 #define ABOVE_LIGHTING_RENDER_TARGET "ABOVE_LIGHTING_PLANE" -#define BYOND_LIGHTING_PLANE 44 -#define BYOND_LIGHTING_LAYER 44 +#define BYOND_LIGHTING_PLANE 18 +#define BYOND_LIGHTING_LAYER 18 #define BYOND_LIGHTING_RENDER_TARGET "BYOND_LIGHTING_PLANE" -#define CAMERA_STATIC_PLANE 45 -#define CAMERA_STATIC_LAYER 45 +#define CAMERA_STATIC_PLANE 19 +#define CAMERA_STATIC_LAYER 19 #define CAMERA_STATIC_RENDER_TARGET "CAMERA_STATIC_PLANE" -#define RUNECHAT_PLANE 46 -#define CHAT_LAYER 12.0001 // Do not insert layers between these two values -#define CHAT_LAYER_MAX 12.9999 +#define RUNECHAT_PLANE 20 -#define ATMOS_GROUP_PLANE 47 -#define ATMOS_GROUP_LAYER 47 +#define ATMOS_GROUP_PLANE 21 +#define ATMOS_GROUP_LAYER 21 //HUD layer defines -#define FULLSCREEN_PLANE 51 -#define FLASH_LAYER 51 -#define FULLSCREEN_LAYER 51.1 -#define UI_DAMAGE_LAYER 51.2 -#define BLIND_LAYER 51.3 -#define CRIT_LAYER 51.4 -#define CURSE_LAYER 51.5 +#define FULLSCREEN_PLANE 31 +#define FLASH_LAYER 31 +#define FULLSCREEN_LAYER 31.1 +#define UI_DAMAGE_LAYER 31.2 +#define BLIND_LAYER 31.3 +#define CRIT_LAYER 31.4 +#define CURSE_LAYER 31.5 #define FULLSCREEN_RENDER_TARGET "FULLSCREEN_PLANE" -#define HUD_PLANE 52 -#define HUD_LAYER 52 +#define HUD_PLANE 42 +#define HUD_LAYER 42 #define HUD_RENDER_TARGET "HUD_PLANE" -#define ABOVE_HUD_PLANE 53 -#define ABOVE_HUD_LAYER 53 +#define ABOVE_HUD_PLANE 43 +#define ABOVE_HUD_LAYER 43 #define ABOVE_HUD_RENDER_TARGET "ABOVE_HUD_PLANE" -#define SPLASHSCREEN_LAYER 64 -#define SPLASHSCREEN_PLANE 64 +#define SPLASHSCREEN_LAYER 54 +#define SPLASHSCREEN_PLANE 54 #define SPLASHSCREEN_RENDER_TARGET "SPLASHSCREEN_PLANE" diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm index ebd697f548a..17e9adf93f1 100644 --- a/code/__HELPERS/icon_smoothing.dm +++ b/code/__HELPERS/icon_smoothing.dm @@ -346,7 +346,6 @@ DEFINE_BITFIELD(smoothing_junction, list( . = smoothing_junction smoothing_junction = new_junction icon_state = "[base_icon_state]-[smoothing_junction]" - SEND_SIGNAL(src, COMSIG_ATOM_SMOOTH_BITMASK, ., new_junction) /turf/closed/set_smoothed_icon_state(new_junction) diff --git a/code/_onclick/hud/plane_master.dm b/code/_onclick/hud/plane_master.dm index cea4a318eb9..b7d66406164 100644 --- a/code/_onclick/hud/plane_master.dm +++ b/code/_onclick/hud/plane_master.dm @@ -70,83 +70,37 @@ /atom/movable/screen/plane_master/lighting/Initialize() . = ..() - var/i = 1 - for(var/plane in subtypesof(/atom/movable/screen/plane_master/emissive)) - var/atom/movable/screen/plane_master/emissive/emissive_plane = plane - add_filter("emissives-[i] ([initial(emissive_plane.name)])", i++, alpha_mask_filter(render_source = initial(emissive_plane.emissive_target), flags = MASK_INVERSE)) + add_filter("emissives", 1, alpha_mask_filter(render_source = EMISSIVE_RENDER_TARGET, flags = MASK_INVERSE)) + add_filter("unblockable_emissives", 2, alpha_mask_filter(render_source = EMISSIVE_UNBLOCKABLE_RENDER_TARGET, flags = MASK_INVERSE)) + add_filter("object_lighting", 3, alpha_mask_filter(render_source = O_LIGHTING_VISUAL_RENDER_TARGET, flags = MASK_INVERSE)) /** * Things placed on this mask the lighting plane. Doesn't render directly. * - * Gets masked by blocking planes. Use for things that you want blocked by + * Gets masked by blocking plane. Use for things that you want blocked by * mobs, items, etc. */ /atom/movable/screen/plane_master/emissive name = "emissive plane master" plane = EMISSIVE_PLANE - layer = EMISSIVE_LAYER mouse_opacity = MOUSE_OPACITY_TRANSPARENT render_target = EMISSIVE_RENDER_TARGET - /// Basically a second copy of the `render_target` because `initial(plane_master_typepath.render_target)` always returns `null` because _BYOND_ - var/emissive_target = EMISSIVE_RENDER_TARGET /atom/movable/screen/plane_master/emissive/Initialize() . = ..() - var/i = 1 - for(var/plane in subtypesof(/atom/movable/screen/plane_master/emissive_blocker)) - var/atom/movable/screen/plane_master/emissive_blocker/blocker_plane = plane - if(initial(blocker_plane.layer) <= layer) - continue - add_filter("emissive_block-[i] (initial(blocker_plane.name))", i++, alpha_mask_filter(render_source = initial(blocker_plane.blocker_target), flags = MASK_INVERSE)) + add_filter("emissive_block", 1, alpha_mask_filter(render_source = EMISSIVE_BLOCKER_RENDER_TARGET, flags = MASK_INVERSE)) -/// The plane master used for emissive turfs and turf overlays -/atom/movable/screen/plane_master/emissive/emissive_turf - name = "emissive turf plane master" - plane = EMISSIVE_TURF_PLANE - layer = EMISSIVE_TURF_LAYER - render_target = EMISSIVE_TURF_RENDER_TARGET - emissive_target = EMISSIVE_TURF_RENDER_TARGET - -/// The plane master used for emissive structures and structure overlays -/atom/movable/screen/plane_master/emissive/emissive_structure - name = "emissive structure plane master" - plane = EMISSIVE_STRUCTURE_PLANE - layer = EMISSIVE_STRUCTURE_LAYER - render_target = EMISSIVE_STRUCTURE_RENDER_TARGET - emissive_target = EMISSIVE_STRUCTURE_RENDER_TARGET - -/// The plane master used for emissive items and item overlays -/atom/movable/screen/plane_master/emissive/emissive_item - name = "emissive item plane master" - plane = EMISSIVE_ITEM_PLANE - layer = EMISSIVE_ITEM_LAYER - render_target = EMISSIVE_ITEM_RENDER_TARGET - emissive_target = EMISSIVE_ITEM_RENDER_TARGET - -/// The plane master used for emissive mobs and mob overlays -/atom/movable/screen/plane_master/emissive/emissive_mob - name = "emissive mob plane master" - plane = EMISSIVE_MOB_PLANE - layer = EMISSIVE_MOB_LAYER - render_target = EMISSIVE_MOB_RENDER_TARGET - emissive_target = EMISSIVE_MOB_RENDER_TARGET - -/// The plane master used for unblockable emissive effects -/atom/movable/screen/plane_master/emissive/unblockable +/** + * Things placed on this always mask the lighting plane. Doesn't render directly. + * + * Always masks the light plane, isn't blocked by anything. Use for on mob glows, + * magic stuff, etc. + */ +/atom/movable/screen/plane_master/emissive_unblockable name = "unblockable emissive plane master" plane = EMISSIVE_UNBLOCKABLE_PLANE - layer = EMISSIVE_UNBLOCKABLE_LAYER + mouse_opacity = MOUSE_OPACITY_TRANSPARENT render_target = EMISSIVE_UNBLOCKABLE_RENDER_TARGET - emissive_target = EMISSIVE_UNBLOCKABLE_RENDER_TARGET - -/// The plane master used for overlay lighting masking -/atom/movable/screen/plane_master/emissive/o_light_visual - name = "overlight light visual plane master" - layer = O_LIGHTING_VISUAL_LAYER - plane = O_LIGHTING_VISUAL_PLANE - render_target = O_LIGHTING_VISUAL_RENDER_TARGET - emissive_target = O_LIGHTING_VISUAL_RENDER_TARGET - blend_mode = BLEND_MULTIPLY /** * Things placed on this layer mask the emissive layer. Doesn't render directly @@ -156,43 +110,8 @@ /atom/movable/screen/plane_master/emissive_blocker name = "emissive blocker plane master" plane = EMISSIVE_BLOCKER_PLANE - layer = EMISSIVE_LAYER mouse_opacity = MOUSE_OPACITY_TRANSPARENT render_target = EMISSIVE_BLOCKER_RENDER_TARGET - /// Basically a second copy of the `render_target` because `initial(plane_master_typepath.render_target)` always returns `null` because _BYOND_ - var/blocker_target = EMISSIVE_BLOCKER_RENDER_TARGET - -/// The emissive blocker plane master used by structures to block... something. Presumably whatever's under turfs. (NOTE: Not actually implemented because adding this to every turf would be expensive and there's no reason to use this yet) -/atom/movable/screen/plane_master/emissive_blocker/turf_emissive - name = "turf emissive blocker plane master" - plane = TURF_EMISSIVE_BLOCKER_PLANE - layer = EMISSIVE_TURF_LAYER - render_target = TURF_EMISSIVE_BLOCKER_RENDER_TARGET - blocker_target = TURF_EMISSIVE_BLOCKER_RENDER_TARGET - -/// The emissive blocker plane master used by structures to block emissive turfs and turf overlays -/atom/movable/screen/plane_master/emissive_blocker/structure_emissive - name = "structure emissive blocker plane master" - plane = STRUCTURE_EMISSIVE_BLOCKER_PLANE - layer = EMISSIVE_STRUCTURE_LAYER - render_target = STRUCTURE_EMISSIVE_BLOCKER_RENDER_TARGET - blocker_target = STRUCTURE_EMISSIVE_BLOCKER_RENDER_TARGET - -/// The emissive blocker plane master used by items to block emissive turfs, structures and overlays thereof -/atom/movable/screen/plane_master/emissive_blocker/item_emissive - name = "item emissive blocker plane master" - plane = ITEM_EMISSIVE_BLOCKER_PLANE - layer = EMISSIVE_ITEM_LAYER - render_target = ITEM_EMISSIVE_BLOCKER_RENDER_TARGET - blocker_target = ITEM_EMISSIVE_BLOCKER_RENDER_TARGET - -/// The emissive blocker plane master used by items to block emissive turfs, structures, items and overlays thereof -/atom/movable/screen/plane_master/emissive_blocker/mob_emissive - name = "mob emissive blocker plane master" - plane = MOB_EMISSIVE_BLOCKER_PLANE - layer = EMISSIVE_MOB_LAYER - render_target = MOB_EMISSIVE_BLOCKER_RENDER_TARGET - blocker_target = MOB_EMISSIVE_BLOCKER_RENDER_TARGET ///Contains space parallax /atom/movable/screen/plane_master/parallax @@ -218,6 +137,14 @@ blend_mode = BLEND_OVERLAY alpha = 0 +/atom/movable/screen/plane_master/o_light_visual + name = "overlight light visual plane master" + layer = O_LIGHTING_VISUAL_LAYER + plane = O_LIGHTING_VISUAL_PLANE + render_target = O_LIGHTING_VISUAL_RENDER_TARGET + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + blend_mode = BLEND_MULTIPLY + /atom/movable/screen/plane_master/runechat name = "runechat plane master" plane = RUNECHAT_PLANE diff --git a/code/datums/components/storage/concrete/stack.dm b/code/datums/components/storage/concrete/stack.dm index 41effa6ea8f..210f22ea5a3 100644 --- a/code/datums/components/storage/concrete/stack.dm +++ b/code/datums/components/storage/concrete/stack.dm @@ -35,7 +35,7 @@ var/obj/item/stack/_S = i if(!istype(_S)) continue - if(S.can_merge(_S)) + if(_S.merge_type == S.merge_type) _S.add(can_insert) S.use(can_insert, TRUE) return TRUE diff --git a/code/datums/elements/decals/_decal.dm b/code/datums/elements/decal.dm similarity index 82% rename from code/datums/elements/decals/_decal.dm rename to code/datums/elements/decal.dm index 30d5506fb67..d33f5bac775 100644 --- a/code/datums/elements/decals/_decal.dm +++ b/code/datums/elements/decal.dm @@ -5,18 +5,18 @@ var/description var/mutable_appearance/pic -/datum/element/decal/Attach(atom/target, _icon, _icon_state, _dir, _cleanable=FALSE, _color, _layer=TURF_LAYER, _plane=FLOOR_PLANE, _description, _alpha=255) +/datum/element/decal/Attach(atom/target, _icon, _icon_state, _dir, _cleanable=FALSE, _color, _layer=TURF_LAYER, _description, _alpha=255) . = ..() - if(!isatom(target) || !generate_appearance(_icon, _icon_state, _dir, _layer, _plane, _color, _alpha, target)) + if(!isatom(target) || !generate_appearance(_icon, _icon_state, _dir, _layer, _color, _alpha, target)) return ELEMENT_INCOMPATIBLE description = _description cleanable = _cleanable - RegisterSignal(target, COMSIG_ATOM_UPDATE_OVERLAYS, .proc/apply_overlay, TRUE) + RegisterSignal(target,COMSIG_ATOM_UPDATE_OVERLAYS,.proc/apply_overlay, TRUE) if(target.flags_1 & INITIALIZED_1) target.update_icon() //could use some queuing here now maybe. else - RegisterSignal(target, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE, .proc/late_update_icon, TRUE) + 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) @@ -26,12 +26,11 @@ if(_description) RegisterSignal(target, COMSIG_PARENT_EXAMINE, .proc/examine,TRUE) -/datum/element/decal/proc/generate_appearance(_icon, _icon_state, _dir, _layer, _plane, _color, _alpha, source) +/datum/element/decal/proc/generate_appearance(_icon, _icon_state, _dir, _layer, _color, _alpha, source) if(!_icon || !_icon_state) return FALSE var/temp_image = image(_icon, null, _icon_state, _layer, _dir) pic = new(temp_image) - pic.plane = _plane pic.color = _color pic.alpha = _alpha return TRUE @@ -63,7 +62,7 @@ if(old_dir == new_dir) return Detach(source) - source.AddElement(/datum/element/decal, pic.icon, pic.icon_state, new_dir, cleanable, pic.color, pic.layer, pic.plane, description, pic.alpha) + source.AddElement(/datum/element/decal, pic.icon, pic.icon_state, new_dir, cleanable, pic.color, pic.layer, description, pic.alpha) /datum/element/decal/proc/clean_react(datum/source, clean_types) SIGNAL_HANDLER diff --git a/code/datums/elements/decals/blood.dm b/code/datums/elements/decals/blood.dm index b71088f5487..c5ad4a3c726 100644 --- a/code/datums/elements/decals/blood.dm +++ b/code/datums/elements/decals/blood.dm @@ -1,16 +1,18 @@ /datum/element/decal/blood -/datum/element/decal/blood/Attach(datum/target, _icon, _icon_state, _dir, _cleanable=CLEAN_TYPE_BLOOD, _color, _layer=ABOVE_OBJ_LAYER, _plane=FLOAT_PLANE, _description, _alpha=255) +/datum/element/decal/blood/Attach(datum/target, _icon, _icon_state, _dir, _cleanable=CLEAN_TYPE_BLOOD, _color, _layer=ABOVE_OBJ_LAYER) 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, force) UnregisterSignal(source, COMSIG_ATOM_GET_EXAMINE_NAME) return ..() -/datum/element/decal/blood/generate_appearance(_icon, _icon_state, _dir, _layer, _plane, _color, _alpha, source) +/datum/element/decal/blood/generate_appearance(_icon, _icon_state, _dir, _layer, _color, _alpha, source) var/obj/item/I = source if(!_icon) _icon = 'icons/effects/blood.dmi' diff --git a/code/datums/elements/decals/smoothing.dm b/code/datums/elements/decals/smoothing.dm deleted file mode 100644 index 4e44140b941..00000000000 --- a/code/datums/elements/decals/smoothing.dm +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Decals that support smoothing with the parent atom - * - * Currently only supports bitmask smoothing - */ -/datum/element/decal/smoothing - /// The icon state used as the base of the smoothed icon state - var/base_icon_state - /// The smoothing junction used to generate the smoothed icon state - var/smoothing_junction - -/datum/element/decal/smoothing/Attach(atom/target, _icon, _icon_state, _dir, _cleanable=FALSE, _color, _layer=TURF_LAYER, _plane=FLOOR_PLANE, _description, _alpha=255, _smoothing_junction=0) - base_icon_state = _icon_state - smoothing_junction = _smoothing_junction - _icon_state = "[_icon_state]-[_smoothing_junction]" - . = ..() - if(. & ELEMENT_INCOMPATIBLE) - return - RegisterSignal(target, COMSIG_ATOM_SMOOTH_BITMASK, .proc/smooth_react) - -/datum/element/decal/smoothing/Detach(atom/source, force) - UnregisterSignal(source, COMSIG_ATOM_SMOOTH_BITMASK) - return ..() - - -/datum/element/decal/smoothing/rotate_react(datum/source, old_dir, new_dir) - // SIGNAL_HANDLER <-- Already defined on parent. We can't define it again and we can't call parent. So we're stuck. - if(old_dir == new_dir) - return - Detach(source) - source.AddElement(/datum/element/decal/smoothing, pic.icon, base_icon_state, new_dir, cleanable, pic.color, pic.layer, pic.plane, description, pic.alpha, smoothing_junction) - -/// Reacts to the source atom smoothing -/datum/element/decal/smoothing/proc/smooth_react(datum/source, old_junction, new_junction) - SIGNAL_HANDLER - - if(old_junction == new_junction) - return - Detach(source) - source.AddElement(/datum/element/decal/smoothing, pic.icon, base_icon_state, pic.dir, cleanable, pic.color, pic.layer, pic.plane, description, pic.alpha, new_junction) diff --git a/code/datums/elements/emissive_blocker.dm b/code/datums/elements/emissive_blocker.dm deleted file mode 100644 index 0c4912fc6bb..00000000000 --- a/code/datums/elements/emissive_blocker.dm +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Applies an emissive blocker vis overlay to the target atom and re-applies it whenever the atom updates its vis overlays - * - * Used to make emissive blockers compatible with structures that mess with their vis overlays - * If this isn't handled neon carpets start glowing through vending machines and computer consoles - */ -/datum/element/emissive_blocker - element_flags = ELEMENT_DETACH | ELEMENT_BESPOKE - id_arg_index = 2 - /// The plane used - var/blocker_plane - -/datum/element/emissive_blocker/Attach(atom/target, plane) - if(!isatom(target)) - return ELEMENT_INCOMPATIBLE - if(!isnum(plane)) - stack_trace("Invalid plane value passed to emissive blocker element") - return ELEMENT_INCOMPATIBLE - - blocker_plane = plane - RegisterSignal(target, COMSIG_ATOM_UPDATE_OVERLAYS, .proc/update_blocker) - update_blocker(target, null) - return ..() - -/datum/element/emissive_blocker/Detach(datum/source, force) - UnregisterSignal(source, COMSIG_ATOM_UPDATE_OVERLAYS) - return ..() - -/// Re-applies the emissive blocker vis overlay -/datum/element/emissive_blocker/proc/update_blocker(atom/source, list/overlays) - SIGNAL_HANDLER - SSvis_overlays.add_vis_overlay(source, source.icon, source.icon_state, EMISSIVE_LAYER, blocker_plane, source.dir) - return NONE diff --git a/code/game/atoms.dm b/code/game/atoms.dm index f6eae28fae0..a4816ca7220 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -652,9 +652,6 @@ . = TRUE if(!(signalOut & COMSIG_ATOM_NO_UPDATE_OVERLAYS)) - if(LAZYLEN(managed_vis_overlays)) - SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) - var/list/new_overlays = update_overlays() if(managed_overlays) cut_overlay(managed_overlays) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index a8cda567a93..fe10ef7aa3c 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -58,8 +58,6 @@ /// Either FALSE, [EMISSIVE_BLOCK_GENERIC], or [EMISSIVE_BLOCK_UNIQUE] var/blocks_emissive = FALSE - /// The plane this uses for emissive effects and emissive blockers - var/emissive_blocker_plane = EMISSIVE_PLANE ///Internal holder for emissive blocker object, do not use directly use blocks_emissive var/atom/movable/emissive_blocker/em_block @@ -79,10 +77,10 @@ . = ..() switch(blocks_emissive) if(EMISSIVE_BLOCK_GENERIC) - AddElement(/datum/element/emissive_blocker, emissive_blocker_plane) + update_emissive_block() if(EMISSIVE_BLOCK_UNIQUE) render_target = ref(src) - em_block = new(src, render_target, emissive_blocker_plane) + em_block = new(src, render_target) vis_contents += em_block if(opacity) AddElement(/datum/element/light_blocking) @@ -128,6 +126,18 @@ moveToNullspace() + +/atom/movable/proc/update_emissive_block() + if(blocks_emissive != EMISSIVE_BLOCK_GENERIC) + return + if(length(managed_vis_overlays)) + for(var/a in managed_vis_overlays) + var/obj/effect/overlay/vis/vs + if(vs.plane == EMISSIVE_BLOCKER_PLANE) + SSvis_overlays.remove_vis_overlay(src, list(vs)) + break + SSvis_overlays.add_vis_overlay(src, icon, icon_state, EMISSIVE_BLOCKER_LAYER, EMISSIVE_BLOCKER_PLANE, dir) + /atom/movable/proc/can_zFall(turf/source, levels = 1, turf/target, direction) if(!direction) direction = DOWN diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 75be1f9e797..a2d4d64086a 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -92,8 +92,6 @@ layer = BELOW_OBJ_LAYER //keeps shit coming out of the machine from ending up underneath it. flags_ricochet = RICOCHET_HARD receive_ricochet_chance_mod = 0.3 - blocks_emissive = EMISSIVE_BLOCK_GENERIC - emissive_blocker_plane = STRUCTURE_EMISSIVE_BLOCKER_PLANE anchored = TRUE interaction_flags_atom = INTERACT_ATOM_ATTACK_HAND | INTERACT_ATOM_UI_INTERACT diff --git a/code/game/machinery/accounting.dm b/code/game/machinery/accounting.dm index c333c36f6a0..940561b591a 100644 --- a/code/game/machinery/accounting.dm +++ b/code/game/machinery/accounting.dm @@ -55,6 +55,7 @@ /obj/machinery/accounting/update_overlays() . = ..() + SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) luminosity = 0 if(machine_stat & (NOPOWER|BROKEN) || !anchored) return @@ -64,7 +65,7 @@ luminosity = 1 if(inserted_id) SSvis_overlays.add_vis_overlay(src, icon, "recharger-full", layer, plane, dir, alpha) - SSvis_overlays.add_vis_overlay(src, icon, "recharger-full", EMISSIVE_STRUCTURE_LAYER, EMISSIVE_STRUCTURE_PLANE, dir, alpha) + SSvis_overlays.add_vis_overlay(src, icon, "recharger-full", EMISSIVE_LAYER, EMISSIVE_PLANE, dir, alpha) else SSvis_overlays.add_vis_overlay(src, icon, "recharger-empty", layer, plane, dir, alpha) - SSvis_overlays.add_vis_overlay(src, icon, "recharger-empty", EMISSIVE_STRUCTURE_LAYER, EMISSIVE_STRUCTURE_PLANE, dir, alpha) + SSvis_overlays.add_vis_overlay(src, icon, "recharger-empty", EMISSIVE_LAYER, EMISSIVE_PLANE, dir, alpha) diff --git a/code/game/machinery/computer/_computer.dm b/code/game/machinery/computer/_computer.dm index 2aad9a3f751..e13acbf67f2 100644 --- a/code/game/machinery/computer/_computer.dm +++ b/code/game/machinery/computer/_computer.dm @@ -30,6 +30,8 @@ /obj/machinery/computer/update_overlays() . = ..() + + SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) if(machine_stat & NOPOWER) . += "[icon_keyboard]_off" return @@ -40,7 +42,7 @@ if(machine_stat & BROKEN) overlay_state = "[icon_state]_broken" SSvis_overlays.add_vis_overlay(src, icon, overlay_state, layer, plane, dir) - SSvis_overlays.add_vis_overlay(src, icon, overlay_state, layer, EMISSIVE_STRUCTURE_PLANE, dir) + SSvis_overlays.add_vis_overlay(src, icon, overlay_state, layer, EMISSIVE_PLANE, dir) /obj/machinery/computer/power_change() . = ..() diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index b5abbd805e3..9e4f412e035 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -15,7 +15,6 @@ flags_1 = PREVENT_CLICK_UNDER_1 receive_ricochet_chance_mod = 0.8 damage_deflection = 10 - blocks_emissive = EMISSIVE_BLOCK_UNIQUE interaction_flags_atom = INTERACT_ATOM_UI_INTERACT diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index d6c15a00dc6..6ea4cac6a8c 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -76,6 +76,8 @@ /obj/machinery/firealarm/update_overlays() . = ..() + SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) + if(machine_stat & NOPOWER) return @@ -84,26 +86,26 @@ if(is_station_level(z)) . += "fire_[GLOB.security_level]" SSvis_overlays.add_vis_overlay(src, icon, "fire_[GLOB.security_level]", layer, plane, dir) - SSvis_overlays.add_vis_overlay(src, icon, "fire_[GLOB.security_level]", layer, EMISSIVE_STRUCTURE_PLANE, dir) + SSvis_overlays.add_vis_overlay(src, icon, "fire_[GLOB.security_level]", layer, EMISSIVE_PLANE, dir) else . += "fire_[SEC_LEVEL_GREEN]" SSvis_overlays.add_vis_overlay(src, icon, "fire_[SEC_LEVEL_GREEN]", layer, plane, dir) - SSvis_overlays.add_vis_overlay(src, icon, "fire_[SEC_LEVEL_GREEN]", layer, EMISSIVE_STRUCTURE_PLANE, dir) + SSvis_overlays.add_vis_overlay(src, icon, "fire_[SEC_LEVEL_GREEN]", layer, EMISSIVE_PLANE, dir) var/area/A = get_area(src) if(!detecting || !A.fire) . += "fire_off" SSvis_overlays.add_vis_overlay(src, icon, "fire_off", layer, plane, dir) - SSvis_overlays.add_vis_overlay(src, icon, "fire_off", layer, EMISSIVE_STRUCTURE_PLANE, dir) + SSvis_overlays.add_vis_overlay(src, icon, "fire_off", layer, EMISSIVE_PLANE, dir) else if(obj_flags & EMAGGED) . += "fire_emagged" SSvis_overlays.add_vis_overlay(src, icon, "fire_emagged", layer, plane, dir) - SSvis_overlays.add_vis_overlay(src, icon, "fire_emagged", layer, EMISSIVE_STRUCTURE_PLANE, dir) + SSvis_overlays.add_vis_overlay(src, icon, "fire_emagged", layer, EMISSIVE_PLANE, dir) else . += "fire_on" SSvis_overlays.add_vis_overlay(src, icon, "fire_on", layer, plane, dir) - SSvis_overlays.add_vis_overlay(src, icon, "fire_on", layer, EMISSIVE_STRUCTURE_PLANE, dir) + SSvis_overlays.add_vis_overlay(src, icon, "fire_on", layer, EMISSIVE_PLANE, dir) if(!panel_open && detecting && triggered) //It just looks horrible with the panel open . += "fire_detected" diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index 1397ae24d20..15150b38854 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -24,22 +24,18 @@ update_icon() /obj/machinery/light_switch/update_icon_state() + SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) luminosity = 0 if(machine_stat & NOPOWER) icon_state = "light-p" else luminosity = 1 + SSvis_overlays.add_vis_overlay(src, icon, "light-glow", EMISSIVE_LAYER, EMISSIVE_PLANE, dir, alpha) if(area.lightswitch) icon_state = "light1" else icon_state = "light0" -/obj/machinery/light_switch/update_overlays() - . = ..() - if(machine_stat & NOPOWER) - return - SSvis_overlays.add_vis_overlay(src, icon, "light-glow", EMISSIVE_STRUCTURE_LAYER, EMISSIVE_STRUCTURE_PLANE, dir, alpha) - /obj/machinery/light_switch/examine(mob/user) . = ..() . += "It is [area.lightswitch ? "on" : "off"]." diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index e3d4cc09354..c044ffb97fb 100755 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -165,6 +165,7 @@ /obj/machinery/recharger/update_overlays() . = ..() + SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) luminosity = 0 if(machine_stat & (NOPOWER|BROKEN) || !anchored) return @@ -176,10 +177,10 @@ if (charging) if(using_power) SSvis_overlays.add_vis_overlay(src, icon, "recharger-charging", layer, plane, dir, alpha) - SSvis_overlays.add_vis_overlay(src, icon, "recharger-charging", EMISSIVE_STRUCTURE_LAYER, EMISSIVE_STRUCTURE_PLANE, dir, alpha) + SSvis_overlays.add_vis_overlay(src, icon, "recharger-charging", EMISSIVE_LAYER, EMISSIVE_PLANE, dir, alpha) else SSvis_overlays.add_vis_overlay(src, icon, "recharger-full", layer, plane, dir, alpha) - SSvis_overlays.add_vis_overlay(src, icon, "recharger-full", EMISSIVE_STRUCTURE_LAYER, EMISSIVE_STRUCTURE_PLANE, dir, alpha) + SSvis_overlays.add_vis_overlay(src, icon, "recharger-full", EMISSIVE_LAYER, EMISSIVE_PLANE, dir, alpha) else SSvis_overlays.add_vis_overlay(src, icon, "recharger-empty", layer, plane, dir, alpha) - SSvis_overlays.add_vis_overlay(src, icon, "recharger-empty", EMISSIVE_STRUCTURE_LAYER, EMISSIVE_STRUCTURE_PLANE, dir, alpha) + SSvis_overlays.add_vis_overlay(src, icon, "recharger-empty", EMISSIVE_LAYER, EMISSIVE_PLANE, dir, alpha) diff --git a/code/game/machinery/stasis.dm b/code/game/machinery/stasis.dm index 1d281077877..50b82413c8e 100644 --- a/code/game/machinery/stasis.dm +++ b/code/game/machinery/stasis.dm @@ -79,23 +79,21 @@ /obj/machinery/stasis/update_overlays() . = ..() - if(!mattress_state) - return + var/_running = stasis_running() + var/list/overlays_to_remove = managed_vis_overlays - if(!mattress_on) - mattress_on = SSvis_overlays.add_vis_overlay(src, icon, mattress_state, BELOW_OBJ_LAYER, plane, dir, alpha = 0, unique = TRUE) - else - vis_contents += mattress_on - if(managed_vis_overlays) - managed_vis_overlays += mattress_on - else - managed_vis_overlays = list(mattress_on) + if(mattress_state) + if(!mattress_on || !managed_vis_overlays) + mattress_on = SSvis_overlays.add_vis_overlay(src, icon, mattress_state, BELOW_OBJ_LAYER, plane, dir, alpha = 0, unique = TRUE) - var/is_running = stasis_running() - if(mattress_on.alpha ? !is_running : is_running) //check the inverse of is_running compared to truthy alpha, to see if they differ - var/new_alpha = is_running ? 255 : 0 - var/easing_direction = is_running ? EASE_OUT : EASE_IN - animate(mattress_on, alpha = new_alpha, time = 50, easing = CUBIC_EASING|easing_direction) + if(mattress_on.alpha ? !_running : _running) //check the inverse of _running compared to truthy alpha, to see if they differ + var/new_alpha = _running ? 255 : 0 + var/easing_direction = _running ? EASE_OUT : EASE_IN + animate(mattress_on, alpha = new_alpha, time = 50, easing = CUBIC_EASING|easing_direction) + + overlays_to_remove = managed_vis_overlays - mattress_on + + SSvis_overlays.remove_vis_overlay(src, overlays_to_remove) /obj/machinery/stasis/obj_break(damage_flag) . = ..() diff --git a/code/game/objects/effects/decals/decal.dm b/code/game/objects/effects/decals/decal.dm index f32f9c9a6e5..5916010cbb9 100644 --- a/code/game/objects/effects/decals/decal.dm +++ b/code/game/objects/effects/decals/decal.dm @@ -50,4 +50,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, null, alpha) + T.AddElement(/datum/element/decal, icon, icon_state, dir, FALSE, color, null, null, alpha) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index f5ee0147711..7e059ca465d 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -12,7 +12,6 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb name = "item" icon = 'icons/obj/items_and_weapons.dmi' blocks_emissive = EMISSIVE_BLOCK_GENERIC - emissive_blocker_plane = ITEM_EMISSIVE_BLOCKER_PLANE /* !!!!!!!!!!!!!!! IMPORTANT !!!!!!!!!!!!!! diff --git a/code/game/objects/items/airlock_painter.dm b/code/game/objects/items/airlock_painter.dm index 11b96eee29d..79efee73836 100644 --- a/code/game/objects/items/airlock_painter.dm +++ b/code/game/objects/items/airlock_painter.dm @@ -174,7 +174,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, null, alpha) + F.AddElement(/datum/element/decal, 'icons/turf/decals.dmi', stored_decal_total, stored_dir, CLEAN_TYPE_PAINT, color, null, null, alpha) /obj/item/airlock_painter/decal/AltClick(mob/user) . = ..() diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 59107d3ed43..72d761b3a23 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -83,7 +83,7 @@ * - multiplier: The amount to multiply the mats per unit by. Defaults to 1. */ /obj/item/stack/proc/set_mats_per_unit(list/mats, multiplier=1) - mats_per_unit = LAZYLEN(mats) ? SSmaterials.FindOrCreateMaterialCombo(mats, multiplier) : mats + mats_per_unit = SSmaterials.FindOrCreateMaterialCombo(mats, multiplier) update_custom_materials() /** Updates the custom materials list of this stack. diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index ba16df14390..897686a334c 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -247,109 +247,6 @@ turf_type = /turf/open/floor/carpet/donk merge_type = /obj/item/stack/tile/carpet/donk -/obj/item/stack/tile/carpet/emissive - name = "emissive carpet" - icon_state = "tile_carpet_black" - inhand_icon_state = "tile-carpet-black" - turf_type = /turf/open/floor/carpet/emissive - merge_type = /obj/item/stack/tile/carpet/emissive - /// The icon state used for the emissive decal. - var/emissive_icon_state - -/obj/item/stack/tile/carpet/emissive/Initialize(mapload, new_amount, merge) - . = ..() - if(!emissive_icon_state) - emissive_icon_state = icon_state - var/turf/open/floor/carpet/emissive/turf_path = turf_type - AddElement(/datum/element/decal, icon, emissive_icon_state, dir, FALSE, initial(turf_path.emissive_color), EMISSIVE_ITEM_LAYER, EMISSIVE_ITEM_PLANE, null, initial(turf_path.emissive_alpha)) - -/obj/item/stack/tile/carpet/emissive/neon - name = "emissive carpet" - icon_state = "tile_carpet_neon_simple" - turf_type = /turf/open/floor/carpet/emissive/neon - merge_type = /obj/item/stack/tile/carpet/emissive/neon - /// The icon state used for the neon decal - var/neon_icon_state - -/obj/item/stack/tile/carpet/emissive/neon/Initialize(mapload, amount) - . = ..() - if(!neon_icon_state) - neon_icon_state = emissive_icon_state - var/turf/open/floor/carpet/emissive/neon/turf_path = turf_type - AddElement(/datum/element/decal, icon, neon_icon_state, dir, FALSE, initial(turf_path.neon_color), FLOAT_LAYER, FLOAT_PLANE) - -/obj/item/stack/tile/carpet/emissive/neon/simple - name = "simple neon carpet" - icon_state = "tile_carpet_neon_simple" - turf_type = /turf/open/floor/carpet/emissive/neon/simple - merge_type = /obj/item/stack/tile/carpet/emissive/neon/simple - emissive_icon_state = "tile_carpet_neon_simple_glow" - -/obj/item/stack/tile/carpet/emissive/neon/simple/white - name = "simple white neon carpet" - turf_type = /turf/open/floor/carpet/emissive/neon/simple/white - merge_type = /obj/item/stack/tile/carpet/emissive/neon/simple/white - -/obj/item/stack/tile/carpet/emissive/neon/simple/red - name = "simple red neon carpet" - turf_type = /turf/open/floor/carpet/emissive/neon/simple/red - merge_type = /obj/item/stack/tile/carpet/emissive/neon/simple/red - -/obj/item/stack/tile/carpet/emissive/neon/simple/orange - name = "emissive orange neon carpet" - turf_type = /turf/open/floor/carpet/emissive/neon/simple/orange - merge_type = /obj/item/stack/tile/carpet/emissive/neon/simple/orange - -/obj/item/stack/tile/carpet/emissive/neon/simple/yellow - name = "emissive yellow neon carpet" - turf_type = /turf/open/floor/carpet/emissive/neon/simple/yellow - merge_type = /obj/item/stack/tile/carpet/emissive/neon/simple/yellow - -/obj/item/stack/tile/carpet/emissive/neon/simple/lime - name = "emissive lime neon carpet" - turf_type = /turf/open/floor/carpet/emissive/neon/simple/lime - merge_type = /obj/item/stack/tile/carpet/emissive/neon/simple/lime - -/obj/item/stack/tile/carpet/emissive/neon/simple/green - name = "emissive green neon carpet" - turf_type = /turf/open/floor/carpet/emissive/neon/simple/green - merge_type = /obj/item/stack/tile/carpet/emissive/neon/simple/green - -/obj/item/stack/tile/carpet/emissive/neon/simple/cyan - name = "emissive cyan neon carpet" - turf_type = /turf/open/floor/carpet/emissive/neon/simple/cyan - merge_type = /obj/item/stack/tile/carpet/emissive/neon/simple/cyan - -/obj/item/stack/tile/carpet/emissive/neon/simple/teal - name = "emissive teal neon carpet" - turf_type = /turf/open/floor/carpet/emissive/neon/simple/teal - merge_type = /obj/item/stack/tile/carpet/emissive/neon/simple/teal - -/obj/item/stack/tile/carpet/emissive/neon/simple/blue - name = "emissive blue neon carpet" - turf_type = /turf/open/floor/carpet/emissive/neon/simple/blue - merge_type = /obj/item/stack/tile/carpet/emissive/neon/simple/blue - -/obj/item/stack/tile/carpet/emissive/neon/simple/purple - name = "emissive purple neon carpet" - turf_type = /turf/open/floor/carpet/emissive/neon/simple/purple - merge_type = /obj/item/stack/tile/carpet/emissive/neon/simple/purple - -/obj/item/stack/tile/carpet/emissive/neon/simple/violet - name = "emissive violet neon carpet" - turf_type = /turf/open/floor/carpet/emissive/neon/simple/violet - merge_type = /obj/item/stack/tile/carpet/emissive/neon/simple/violet - -/obj/item/stack/tile/carpet/emissive/neon/simple/pink - name = "emissive pink neon carpet" - turf_type = /turf/open/floor/carpet/emissive/neon/simple/pink - merge_type = /obj/item/stack/tile/carpet/emissive/neon/simple/pink - -/obj/item/stack/tile/carpet/emissive/neon/simple/black - name = "emissive black neon carpet" - turf_type = /turf/open/floor/carpet/emissive/neon/simple/black - merge_type = /obj/item/stack/tile/carpet/emissive/neon/simple/black - /obj/item/stack/tile/carpet/fifty amount = 50 @@ -389,198 +286,6 @@ /obj/item/stack/tile/carpet/donk/thirty amount = 30 -/obj/item/stack/tile/carpet/emissive/ten - amount = 10 - -/obj/item/stack/tile/carpet/emissive/twenty - amount = 20 - -/obj/item/stack/tile/carpet/emissive/thirty - amount = 30 - -/obj/item/stack/tile/carpet/emissive/sixty - amount = 60 - -/obj/item/stack/tile/carpet/emissive/neon/ten - amount = 10 - -/obj/item/stack/tile/carpet/emissive/neon/twenty - amount = 20 - -/obj/item/stack/tile/carpet/emissive/neon/thirty - amount = 30 - -/obj/item/stack/tile/carpet/emissive/neon/sixty - amount = 60 - -/obj/item/stack/tile/carpet/emissive/neon/simple/ten - amount = 10 - -/obj/item/stack/tile/carpet/emissive/neon/simple/twenty - amount = 20 - -/obj/item/stack/tile/carpet/emissive/neon/simple/thirty - amount = 30 - -/obj/item/stack/tile/carpet/emissive/neon/simple/sixty - amount = 60 - -/obj/item/stack/tile/carpet/emissive/neon/simple/white/ten - amount = 10 - -/obj/item/stack/tile/carpet/emissive/neon/simple/white/twenty - amount = 20 - -/obj/item/stack/tile/carpet/emissive/neon/simple/white/thirty - amount = 30 - -/obj/item/stack/tile/carpet/emissive/neon/simple/white/sixty - amount = 60 - -/obj/item/stack/tile/carpet/emissive/neon/simple/red/ten - amount = 10 - -/obj/item/stack/tile/carpet/emissive/neon/simple/red/twenty - amount = 20 - -/obj/item/stack/tile/carpet/emissive/neon/simple/red/thirty - amount = 30 - -/obj/item/stack/tile/carpet/emissive/neon/simple/red/sixty - amount = 60 - -/obj/item/stack/tile/carpet/emissive/neon/simple/orange/ten - amount = 10 - -/obj/item/stack/tile/carpet/emissive/neon/simple/orange/twenty - amount = 20 - -/obj/item/stack/tile/carpet/emissive/neon/simple/orange/thirty - amount = 30 - -/obj/item/stack/tile/carpet/emissive/neon/simple/orange/sixty - amount = 60 - -/obj/item/stack/tile/carpet/emissive/neon/simple/yellow/ten - amount = 10 - -/obj/item/stack/tile/carpet/emissive/neon/simple/yellow/twenty - amount = 20 - -/obj/item/stack/tile/carpet/emissive/neon/simple/yellow/thirty - amount = 30 - -/obj/item/stack/tile/carpet/emissive/neon/simple/yellow/sixty - amount = 60 - -/obj/item/stack/tile/carpet/emissive/neon/simple/lime/ten - amount = 10 - -/obj/item/stack/tile/carpet/emissive/neon/simple/lime/twenty - amount = 20 - -/obj/item/stack/tile/carpet/emissive/neon/simple/lime/thirty - amount = 30 - -/obj/item/stack/tile/carpet/emissive/neon/simple/lime/sixty - amount = 60 - -/obj/item/stack/tile/carpet/emissive/neon/simple/green/ten - amount = 10 - -/obj/item/stack/tile/carpet/emissive/neon/simple/green/twenty - amount = 20 - -/obj/item/stack/tile/carpet/emissive/neon/simple/green/thirty - amount = 30 - -/obj/item/stack/tile/carpet/emissive/neon/simple/green/sixty - amount = 60 - -/obj/item/stack/tile/carpet/emissive/neon/simple/cyan/ten - amount = 10 - -/obj/item/stack/tile/carpet/emissive/neon/simple/cyan/twenty - amount = 20 - -/obj/item/stack/tile/carpet/emissive/neon/simple/cyan/thirty - amount = 30 - -/obj/item/stack/tile/carpet/emissive/neon/simple/cyan/sixty - amount = 60 - -/obj/item/stack/tile/carpet/emissive/neon/simple/teal/ten - amount = 10 - -/obj/item/stack/tile/carpet/emissive/neon/simple/teal/twenty - amount = 20 - -/obj/item/stack/tile/carpet/emissive/neon/simple/teal/thirty - amount = 30 - -/obj/item/stack/tile/carpet/emissive/neon/simple/teal/sixty - amount = 60 - -/obj/item/stack/tile/carpet/emissive/neon/simple/blue/ten - amount = 10 - -/obj/item/stack/tile/carpet/emissive/neon/simple/blue/twenty - amount = 20 - -/obj/item/stack/tile/carpet/emissive/neon/simple/blue/thirty - amount = 30 - -/obj/item/stack/tile/carpet/emissive/neon/simple/blue/sixty - amount = 60 - -/obj/item/stack/tile/carpet/emissive/neon/simple/purple/ten - amount = 10 - -/obj/item/stack/tile/carpet/emissive/neon/simple/purple/twenty - amount = 20 - -/obj/item/stack/tile/carpet/emissive/neon/simple/purple/thirty - amount = 30 - -/obj/item/stack/tile/carpet/emissive/neon/simple/purple/sixty - amount = 60 - -/obj/item/stack/tile/carpet/emissive/neon/simple/violet/ten - amount = 10 - -/obj/item/stack/tile/carpet/emissive/neon/simple/violet/twenty - amount = 20 - -/obj/item/stack/tile/carpet/emissive/neon/simple/violet/thirty - amount = 30 - -/obj/item/stack/tile/carpet/emissive/neon/simple/violet/sixty - amount = 60 - -/obj/item/stack/tile/carpet/emissive/neon/simple/pink/ten - amount = 10 - -/obj/item/stack/tile/carpet/emissive/neon/simple/pink/twenty - amount = 20 - -/obj/item/stack/tile/carpet/emissive/neon/simple/pink/thirty - amount = 30 - -/obj/item/stack/tile/carpet/emissive/neon/simple/pink/sixty - amount = 60 - -/obj/item/stack/tile/carpet/emissive/neon/simple/black/ten - amount = 10 - -/obj/item/stack/tile/carpet/emissive/neon/simple/black/twenty - amount = 20 - -/obj/item/stack/tile/carpet/emissive/neon/simple/black/thirty - amount = 30 - -/obj/item/stack/tile/carpet/emissive/neon/simple/black/sixty - amount = 60 - /obj/item/stack/tile/fakespace name = "astral carpet" singular_name = "astral carpet tile" diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index be6890c0fab..f5ed1357ba6 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -8,8 +8,6 @@ flags_ricochet = RICOCHET_HARD receive_ricochet_chance_mod = 0.6 pass_flags_self = PASSSTRUCTURE - blocks_emissive = EMISSIVE_BLOCK_GENERIC - emissive_blocker_plane = STRUCTURE_EMISSIVE_BLOCKER_PLANE 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 006ab7b09c1..1c7c0849ff1 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -8,7 +8,6 @@ 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 @@ -72,6 +71,7 @@ /obj/structure/closet/proc/closet_update_overlays(list/new_overlays) . = new_overlays + SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) luminosity = 0 if(!opened) if(icon_door) @@ -83,7 +83,7 @@ if(secure && !broken) //Overlay is similar enough for both that we can use the same mask for both luminosity = 1 - SSvis_overlays.add_vis_overlay(src, icon, "locked", EMISSIVE_STRUCTURE_LAYER, EMISSIVE_STRUCTURE_PLANE, dir, alpha) + SSvis_overlays.add_vis_overlay(src, icon, "locked", EMISSIVE_LAYER, EMISSIVE_PLANE, dir, alpha) if(locked) . += "locked" else diff --git a/code/game/turfs/open/floor/fancy_floor.dm b/code/game/turfs/open/floor/fancy_floor.dm index 0cfad263b76..17be29e6ba6 100644 --- a/code/game/turfs/open/floor/fancy_floor.dm +++ b/code/game/turfs/open/floor/fancy_floor.dm @@ -325,189 +325,6 @@ smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_DONK) canSmoothWith = list(SMOOTH_GROUP_CARPET_DONK) -/// Carpets that generate an emissive decal to augment them -/turf/open/floor/carpet/emissive - name = "Emissive Carpet" - icon = 'icons/turf/floors/carpet_black.dmi' - icon_state = "carpet_black-255" - base_icon_state = "carpet_black" - floor_tile = /obj/item/stack/tile/carpet/emissive - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_EMISSIVE) - canSmoothWith = list(SMOOTH_GROUP_CARPET_EMISSIVE) - - // Emissive decal settings: - /// The icon used to generate the emisive overlay - var/emissive_icon - /// The base icon state for the emissive overlay - var/base_emissive_state - /// The color of the emissive decal - var/emissive_color - /// The alpha of the emissive decal - var/emissive_alpha = 150 - -/turf/open/floor/carpet/emissive/Initialize(mapload, ...) - . = ..() - if(!emissive_icon) - emissive_icon = icon - if(!base_emissive_state) - base_emissive_state = base_icon_state - AddElement(/datum/element/decal/smoothing, emissive_icon, base_emissive_state, dir, FALSE, emissive_color, EMISSIVE_TURF_LAYER, EMISSIVE_TURF_PLANE, null, emissive_alpha) - -/turf/open/floor/carpet/emissive/neon - name = "Neon Carpet" - desc = "A carpet with a design woven into it using phosphorescent thread." - icon = 'icons/turf/floors/carpet_neon_simple.dmi' - icon_state = "base-255" - base_icon_state = "base" - floor_tile = /obj/item/stack/tile/carpet/emissive/neon - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_NEON) - canSmoothWith = list(SMOOTH_GROUP_CARPET_NEON) - - // Neon Decals: - /// The icon used - var/neon_icon - /// The base icon state used for the neon decals - var/base_neon_state - /// The color used for the neon decals - var/neon_color - -/turf/open/floor/carpet/emissive/neon/Initialize(mapload, ...) - . = ..() - if(!neon_icon) - neon_icon = emissive_icon - if(!base_neon_state) - base_neon_state = base_emissive_state - AddElement(/datum/element/decal/smoothing, neon_icon, base_neon_state, dir, FALSE, neon_color) - -/turf/open/floor/carpet/emissive/neon/simple - name = "Simple Neon Carpet" - desc = "A carpet with a simple design woven into it using phosphorescent thread." - icon = 'icons/turf/floors/carpet_neon_simple.dmi' - icon_state = "base-255" - base_icon_state = "base" - base_neon_state = "lights" - base_emissive_state = "glow" - floor_tile = /obj/item/stack/tile/carpet/emissive/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/emissive/neon/simple/white - name = "Simple White Neon Carpet" - desc = "A carpet with a simple design woven into it using white phosphorescent thread." - neon_color = COLOR_WHITE - emissive_color = COLOR_WHITE - floor_tile = /obj/item/stack/tile/carpet/emissive/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/emissive/neon/simple/red - name = "Simple Red Neon Carpet" - desc = "A carpet with a simple design woven into it using red phosphorescent thread." - neon_color = COLOR_RED - emissive_color = COLOR_RED - floor_tile = /obj/item/stack/tile/carpet/emissive/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/emissive/neon/simple/orange - name = "Simple Orange Neon Carpet" - desc = "A carpet with a simple design woven into it using orange phosphorescent thread." - neon_color = COLOR_ORANGE - emissive_color = COLOR_ORANGE - floor_tile = /obj/item/stack/tile/carpet/emissive/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/emissive/neon/simple/yellow - name = "Simple Yellow Neon Carpet" - desc = "A carpet with a simple design woven into it using yellow phosphorescent thread." - neon_color = COLOR_YELLOW - emissive_color = COLOR_YELLOW - floor_tile = /obj/item/stack/tile/carpet/emissive/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/emissive/neon/simple/lime - name = "Simple Lime Neon Carpet" - desc = "A carpet with a simple design woven into it using lime phosphorescent thread." - neon_color = COLOR_LIME - emissive_color = COLOR_LIME - floor_tile = /obj/item/stack/tile/carpet/emissive/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/emissive/neon/simple/green - name = "Simple Green Neon Carpet" - desc = "A carpet with a simple design woven into it using green phosphorescent thread." - neon_color = COLOR_GREEN - emissive_color = COLOR_GREEN - floor_tile = /obj/item/stack/tile/carpet/emissive/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/emissive/neon/simple/cyan - name = "Simple Cyan Neon Carpet" - desc = "A carpet with a simple design woven into it using cyan phosphorescent thread." - neon_color = COLOR_CYAN - emissive_color = COLOR_CYAN - floor_tile = /obj/item/stack/tile/carpet/emissive/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/emissive/neon/simple/teal - name = "Simple Cyan Neon Carpet" - desc = "A carpet with a simple design woven into it using teal phosphorescent thread." - neon_color = COLOR_TEAL - emissive_color = COLOR_TEAL - floor_tile = /obj/item/stack/tile/carpet/emissive/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/emissive/neon/simple/blue - name = "Simple Blue Neon Carpet" - desc = "A carpet with a simple design woven into it using blue phosphorescent thread." - neon_color = COLOR_BLUE - emissive_color = COLOR_BLUE - floor_tile = /obj/item/stack/tile/carpet/emissive/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/emissive/neon/simple/purple - name = "Simple Indigo Neon Carpet" - desc = "A carpet with a simple design woven into it using purple phosphorescent thread." - neon_color = COLOR_PURPLE - emissive_color = COLOR_PURPLE - floor_tile = /obj/item/stack/tile/carpet/emissive/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/emissive/neon/simple/violet - name = "Simple Indigo Neon Carpet" - desc = "A carpet with a simple design woven into it using violet phosphorescent thread." - neon_color = COLOR_VIOLET - emissive_color = COLOR_VIOLET - floor_tile = /obj/item/stack/tile/carpet/emissive/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/emissive/neon/simple/pink - name = "Simple Indigo Neon Carpet" - desc = "A carpet with a simple design woven into it using pink phosphorescent thread." - neon_color = COLOR_PINK - emissive_color = COLOR_PINK - floor_tile = /obj/item/stack/tile/carpet/emissive/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/emissive/neon/simple/black - name = "Simple Black Neon Carpet" - desc = "A carpet with a simple design wiven into it using especially dark thread." - neon_color = COLOR_BLACK - emissive_color = COLOR_BLACK - floor_tile = /obj/item/stack/tile/carpet/emissive/neon/simple/black - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLACK) - canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLACK) - //*****Airless versions of all of the above.***** /turf/open/floor/carpet/airless initial_gas_mix = AIRLESS_ATMOS @@ -539,60 +356,6 @@ /turf/open/floor/carpet/royalblue/airless initial_gas_mix = AIRLESS_ATMOS -/turf/open/floor/carpet/executive/airless - initial_gas_mix = AIRLESS_ATMOS - -/turf/open/floor/carpet/stellar/airless - initial_gas_mix = AIRLESS_ATMOS - -/turf/open/floor/carpet/donk/airless - initial_gas_mix = AIRLESS_ATMOS - -/turf/open/floor/carpet/emissive/airless - initial_gas_mix = AIRLESS_ATMOS - -/turf/open/floor/carpet/emissive/neon/airless - initial_gas_mix = AIRLESS_ATMOS - -/turf/open/floor/carpet/emissive/neon/simple/airless - initial_gas_mix = AIRLESS_ATMOS - -/turf/open/floor/carpet/emissive/neon/simple/white/airless - initial_gas_mix = AIRLESS_ATMOS - -/turf/open/floor/carpet/emissive/neon/simple/red/airless - initial_gas_mix = AIRLESS_ATMOS - -/turf/open/floor/carpet/emissive/neon/simple/orange/airless - initial_gas_mix = AIRLESS_ATMOS - -/turf/open/floor/carpet/emissive/neon/simple/yellow/airless - initial_gas_mix = AIRLESS_ATMOS - -/turf/open/floor/carpet/emissive/neon/simple/green/airless - initial_gas_mix = AIRLESS_ATMOS - -/turf/open/floor/carpet/emissive/neon/simple/cyan/airless - initial_gas_mix = AIRLESS_ATMOS - -/turf/open/floor/carpet/emissive/neon/simple/teal/airless - initial_gas_mix = AIRLESS_ATMOS - -/turf/open/floor/carpet/emissive/neon/simple/blue/airless - initial_gas_mix = AIRLESS_ATMOS - -/turf/open/floor/carpet/emissive/neon/simple/purple/airless - initial_gas_mix = AIRLESS_ATMOS - -/turf/open/floor/carpet/emissive/neon/simple/violet/airless - initial_gas_mix = AIRLESS_ATMOS - -/turf/open/floor/carpet/emissive/neon/simple/pink/airless - initial_gas_mix = AIRLESS_ATMOS - -/turf/open/floor/carpet/emissive/neon/simple/black/airless - initial_gas_mix = AIRLESS_ATMOS - /turf/open/floor/carpet/narsie_act(force, ignore_mobs, probability = 20) . = (prob(probability) || force) for(var/I in src) diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index 7c87ad27a8b..0a2274be12e 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -1579,40 +1579,6 @@ /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 knitted carpets with phosphorescent lining. Contains 120 tiles each of 13 color variants." - cost = CARGO_CRATE_VALUE * 15 - contains = list( - /obj/item/stack/tile/carpet/emissive/neon/simple/white/sixty, - /obj/item/stack/tile/carpet/emissive/neon/simple/white/sixty, - /obj/item/stack/tile/carpet/emissive/neon/simple/red/sixty, - /obj/item/stack/tile/carpet/emissive/neon/simple/red/sixty, - /obj/item/stack/tile/carpet/emissive/neon/simple/orange/sixty, - /obj/item/stack/tile/carpet/emissive/neon/simple/orange/sixty, - /obj/item/stack/tile/carpet/emissive/neon/simple/yellow/sixty, - /obj/item/stack/tile/carpet/emissive/neon/simple/yellow/sixty, - /obj/item/stack/tile/carpet/emissive/neon/simple/lime/sixty, - /obj/item/stack/tile/carpet/emissive/neon/simple/lime/sixty, - /obj/item/stack/tile/carpet/emissive/neon/simple/green/sixty, - /obj/item/stack/tile/carpet/emissive/neon/simple/green/sixty, - /obj/item/stack/tile/carpet/emissive/neon/simple/cyan/sixty, - /obj/item/stack/tile/carpet/emissive/neon/simple/cyan/sixty, - /obj/item/stack/tile/carpet/emissive/neon/simple/teal/sixty, - /obj/item/stack/tile/carpet/emissive/neon/simple/teal/sixty, - /obj/item/stack/tile/carpet/emissive/neon/simple/blue/sixty, - /obj/item/stack/tile/carpet/emissive/neon/simple/blue/sixty, - /obj/item/stack/tile/carpet/emissive/neon/simple/purple/sixty, - /obj/item/stack/tile/carpet/emissive/neon/simple/purple/sixty, - /obj/item/stack/tile/carpet/emissive/neon/simple/violet/sixty, - /obj/item/stack/tile/carpet/emissive/neon/simple/violet/sixty, - /obj/item/stack/tile/carpet/emissive/neon/simple/pink/sixty, - /obj/item/stack/tile/carpet/emissive/neon/simple/pink/sixty, - /obj/item/stack/tile/carpet/emissive/neon/simple/black/sixty, - /obj/item/stack/tile/carpet/emissive/neon/simple/black/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/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index 5200f520ad0..44375a426a3 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -41,7 +41,9 @@ . += "The status display reads: This unit can hold a maximum of [max_n_of_items] items." /obj/machinery/smartfridge/update_icon_state() + SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) if(!machine_stat) + SSvis_overlays.add_vis_overlay(src, icon, "smartfridge-light-mask", EMISSIVE_LAYER, EMISSIVE_PLANE, dir, alpha) if (visible_contents) switch(contents.len) if(0) @@ -57,10 +59,7 @@ else icon_state = "[initial(icon_state)]-off" -/obj/machinery/smartfridge/update_overlays() - . = ..() - if(!machine_stat) - SSvis_overlays.add_vis_overlay(src, icon, "smartfridge-light-mask", EMISSIVE_STRUCTURE_LAYER, EMISSIVE_STRUCTURE_PLANE, dir, alpha) + /******************* * Item Adding diff --git a/code/modules/lighting/emissive_blocker.dm b/code/modules/lighting/emissive_blocker.dm index e4be0e7ef5e..8cb1b72475b 100644 --- a/code/modules/lighting/emissive_blocker.dm +++ b/code/modules/lighting/emissive_blocker.dm @@ -9,7 +9,7 @@ /atom/movable/emissive_blocker name = "" plane = EMISSIVE_BLOCKER_PLANE - layer = EMISSIVE_LAYER + layer = EMISSIVE_BLOCKER_LAYER mouse_opacity = MOUSE_OPACITY_TRANSPARENT //Why? //render_targets copy the transform of the target as well, but vis_contents also applies the transform @@ -17,12 +17,11 @@ //Since only render_target handles transform we don't get any applied transform "stacking" appearance_flags = RESET_TRANSFORM -/atom/movable/emissive_blocker/Initialize(mapload, source, render_plane = EMISSIVE_BLOCKER_PLANE) +/atom/movable/emissive_blocker/Initialize(mapload, source) . = ..() verbs.Cut() //Cargo culting from lighting object, this maybe affects memory usage? render_source = source - plane = render_plane /atom/movable/emissive_blocker/ex_act(severity) return FALSE diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index d11d427346f..3cd864f05a7 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -17,7 +17,6 @@ mouse_drag_pointer = MOUSE_ACTIVE_POINTER throwforce = 10 blocks_emissive = EMISSIVE_BLOCK_GENERIC - emissive_blocker_plane = MOB_EMISSIVE_BLOCKER_PLANE pass_flags_self = PASSMOB ///when this be added to vis_contents of something it inherit something.plane, important for visualisation of mob in openspace. diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 0045b70a481..298aca89e02 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -197,7 +197,6 @@ /obj/machinery/power/apc/Destroy() GLOB.apcs_list -= src - UnregisterSignal(src, COMSIG_ATOM_UPDATE_ICON) if(malfai && operating) malfai.malf_picker.processing_time = clamp(malfai.malf_picker.processing_time - 10,0,1000) area.power_light = FALSE @@ -229,7 +228,6 @@ /obj/machinery/power/apc/Initialize(mapload) . = ..() - RegisterSignal(src, COMSIG_ATOM_UPDATE_ICON, .proc/check_updates) if(!mapload) return has_electronics = APC_ELECTRONICS_SECURED @@ -294,11 +292,55 @@ // update the APC icon to show the three base states // also add overlays for indicator lights /obj/machinery/power/apc/update_icon() - . = ..() - if(!.) + var/update = check_updates() //returns 0 if no need to update icons. + // 1 if we need to update the icon_state + // 2 if we need to update the overlays + if(!update) icon_update_needed = FALSE return + if(update & 1) // Updating the icon state + if(update_state & UPSTATE_ALLGOOD) + icon_state = "apc0" + else if(update_state & (UPSTATE_OPENED1|UPSTATE_OPENED2)) + var/basestate = "apc[ cell ? "2" : "1" ]" + if(update_state & UPSTATE_OPENED1) + if(update_state & (UPSTATE_MAINT|UPSTATE_BROKE)) + icon_state = "apcmaint" //disabled APC cannot hold cell + else + icon_state = basestate + else if(update_state & UPSTATE_OPENED2) + if (update_state & UPSTATE_BROKE || malfhack) + icon_state = "[basestate]-b-nocover" + else + icon_state = "[basestate]-nocover" + else if(update_state & UPSTATE_BROKE) + icon_state = "apc-b" + else if(update_state & UPSTATE_BLUESCREEN) + icon_state = "apcemag" + else if(update_state & UPSTATE_WIREEXP) + icon_state = "apcewires" + else if(update_state & UPSTATE_MAINT) + icon_state = "apc0" + + if(!(update_state & UPSTATE_ALLGOOD)) + SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) + + if(update & 2) + SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) + if(!(machine_stat & (BROKEN|MAINT)) && update_state & UPSTATE_ALLGOOD) + SSvis_overlays.add_vis_overlay(src, icon, "apcox-[locked]", layer, plane, dir) + SSvis_overlays.add_vis_overlay(src, icon, "apcox-[locked]", layer, EMISSIVE_PLANE, dir) + SSvis_overlays.add_vis_overlay(src, icon, "apco3-[charging]", layer, plane, dir) + SSvis_overlays.add_vis_overlay(src, icon, "apco3-[charging]", layer, EMISSIVE_PLANE, dir) + if(operating) + SSvis_overlays.add_vis_overlay(src, icon, "apco0-[equipment]", layer, plane, dir) + SSvis_overlays.add_vis_overlay(src, icon, "apco0-[equipment]", layer, EMISSIVE_PLANE, dir) + SSvis_overlays.add_vis_overlay(src, icon, "apco1-[lighting]", layer, plane, dir) + SSvis_overlays.add_vis_overlay(src, icon, "apco1-[lighting]", layer, EMISSIVE_PLANE, dir) + SSvis_overlays.add_vis_overlay(src, icon, "apco2-[environ]", layer, plane, dir) + SSvis_overlays.add_vis_overlay(src, icon, "apco2-[environ]", layer, EMISSIVE_PLANE, dir) + // And now, separately for cleanness, the lighting changing if(update_state & UPSTATE_ALLGOOD) switch(charging) @@ -318,49 +360,7 @@ icon_update_needed = FALSE -/obj/machinery/power/apc/update_icon_state() - if(update_state & UPSTATE_ALLGOOD) - icon_state = "apc0" - return - if(update_state & (UPSTATE_OPENED1|UPSTATE_OPENED2)) - var/basestate = "apc[cell ? 2 : 1]" - if(update_state & UPSTATE_OPENED1) - icon_state = (update_state & (UPSTATE_MAINT|UPSTATE_BROKE)) ? "apcmaint" : basestate - else if(update_state & UPSTATE_OPENED2) - icon_state = "[basestate][((update_state & UPSTATE_BROKE) || malfhack) ? "-b" : null]-nocover" - return - if(update_state & UPSTATE_BROKE) - icon_state = "apc-b" - return - if(update_state & UPSTATE_BLUESCREEN) - icon_state = "apcemag" - return - if(update_state & UPSTATE_WIREEXP) - icon_state = "apcewires" - return - if(update_state & UPSTATE_MAINT) - icon_state = "apc0" - return - -/obj/machinery/power/apc/update_overlays() - . = ..() - if((machine_stat & (BROKEN|MAINT)) || !(update_state & UPSTATE_ALLGOOD)) - return - SSvis_overlays.add_vis_overlay(src, icon, "apcox-[locked]", layer, plane, dir) - SSvis_overlays.add_vis_overlay(src, icon, "apcox-[locked]", layer, EMISSIVE_STRUCTURE_PLANE, dir) - SSvis_overlays.add_vis_overlay(src, icon, "apco3-[charging]", layer, plane, dir) - SSvis_overlays.add_vis_overlay(src, icon, "apco3-[charging]", layer, EMISSIVE_STRUCTURE_PLANE, dir) - if(!operating) - return - SSvis_overlays.add_vis_overlay(src, icon, "apco0-[equipment]", layer, plane, dir) - SSvis_overlays.add_vis_overlay(src, icon, "apco0-[equipment]", layer, EMISSIVE_STRUCTURE_PLANE, dir) - SSvis_overlays.add_vis_overlay(src, icon, "apco1-[lighting]", layer, plane, dir) - SSvis_overlays.add_vis_overlay(src, icon, "apco1-[lighting]", layer, EMISSIVE_STRUCTURE_PLANE, dir) - SSvis_overlays.add_vis_overlay(src, icon, "apco2-[environ]", layer, plane, dir) - SSvis_overlays.add_vis_overlay(src, icon, "apco2-[environ]", layer, EMISSIVE_STRUCTURE_PLANE, dir) - -/obj/machinery/power/apc/proc/check_updates(obj/machinery/power/apc/self) - SIGNAL_HANDLER +/obj/machinery/power/apc/proc/check_updates() var/last_update_state = update_state var/last_update_overlay = update_overlay update_state = 0 @@ -420,11 +420,14 @@ update_overlay |= APC_UPOVERLAY_ENVIRON2 - . = NONE - if(last_update_state == update_state) - . |= COMSIG_ATOM_NO_UPDATE_ICON_STATE - if((last_update_overlay == update_overlay) && (update_state & UPSTATE_ALLGOOD)) - . |= COMSIG_ATOM_NO_UPDATE_OVERLAYS + var/results = 0 + if(last_update_state == update_state && last_update_overlay == update_overlay) + return 0 + if(last_update_state != update_state) + results += 1 + if(last_update_overlay != update_overlay) + results += 2 + return results // Used in process so it doesn't update the icon too much /obj/machinery/power/apc/proc/queue_icon_update() diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 6547611f936..d861f4e6a87 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -400,6 +400,7 @@ /obj/machinery/light/update_overlays() . = ..() + SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) if(on && status == LIGHT_OK) var/area/A = get_area(src) if(emergency_mode || (A?.fire)) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index b859603a99d..4086c56e241 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -1708,104 +1708,6 @@ taste_description = "blueyalty" //also intentional carpet_type = /turf/open/floor/carpet/royalblue -/datum/reagent/carpet/neon - name = "Neon Carpet" - description = "For those who like the 1980s, vegas, and debugging." - color = COLOR_ALMOST_BLACK - taste_description = "neon" - carpet_type = /turf/open/floor/carpet/emissive/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" - carpet_type = /turf/open/floor/carpet/emissive/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" - carpet_type = /turf/open/floor/carpet/emissive/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" - carpet_type = /turf/open/floor/carpet/emissive/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" - carpet_type = /turf/open/floor/carpet/emissive/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" - carpet_type = /turf/open/floor/carpet/emissive/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" - carpet_type = /turf/open/floor/carpet/emissive/neon/simple/green - -/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" - carpet_type = /turf/open/floor/carpet/emissive/neon/simple/cyan - -/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" - carpet_type = /turf/open/floor/carpet/emissive/neon/simple/teal - -/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" - carpet_type = /turf/open/floor/carpet/emissive/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" - carpet_type = /turf/open/floor/carpet/emissive/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" - carpet_type = /turf/open/floor/carpet/emissive/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" - carpet_type = /turf/open/floor/carpet/emissive/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" - carpet_type = /turf/open/floor/carpet/emissive/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 28e8b11c7f3..978e23daa6d 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -387,57 +387,6 @@ 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/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index bc1abb1da49..f09587dc16b 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -346,6 +346,7 @@ /obj/machinery/disposal/bin/update_overlays() . = ..() + SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) luminosity = 0 if(machine_stat & BROKEN) @@ -363,15 +364,15 @@ //check for items in disposal - occupied light if(contents.len > 0) . += "dispover-full" - SSvis_overlays.add_vis_overlay(src, icon, "dispover-full", EMISSIVE_STRUCTURE_LAYER, EMISSIVE_STRUCTURE_PLANE, dir, alpha) + SSvis_overlays.add_vis_overlay(src, icon, "dispover-full", EMISSIVE_LAYER, EMISSIVE_PLANE, dir, alpha) //charging and ready light if(pressure_charging) . += "dispover-charge" - SSvis_overlays.add_vis_overlay(src, icon, "dispover-charge-glow", EMISSIVE_STRUCTURE_LAYER, EMISSIVE_STRUCTURE_PLANE, dir, alpha) + SSvis_overlays.add_vis_overlay(src, icon, "dispover-charge-glow", EMISSIVE_LAYER, EMISSIVE_PLANE, dir, alpha) else if(full_pressure) . += "dispover-ready" - SSvis_overlays.add_vis_overlay(src, icon, "dispover-ready-glow", EMISSIVE_STRUCTURE_LAYER, EMISSIVE_STRUCTURE_PLANE, dir, alpha) + SSvis_overlays.add_vis_overlay(src, icon, "dispover-ready-glow", EMISSIVE_LAYER, EMISSIVE_PLANE, dir, alpha) /obj/machinery/disposal/bin/proc/do_flush() set waitfor = FALSE diff --git a/code/modules/research/nanites/nanite_program_hub.dm b/code/modules/research/nanites/nanite_program_hub.dm index 711e6caaa2c..656c40390d0 100644 --- a/code/modules/research/nanites/nanite_program_hub.dm +++ b/code/modules/research/nanites/nanite_program_hub.dm @@ -28,10 +28,11 @@ /obj/machinery/nanite_program_hub/update_overlays() . = ..() + SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) if((machine_stat & (NOPOWER|MAINT|BROKEN)) || panel_open) return SSvis_overlays.add_vis_overlay(src, icon, "nanite_program_hub_on", layer, plane) - SSvis_overlays.add_vis_overlay(src, icon, "nanite_program_hub_on", EMISSIVE_STRUCTURE_LAYER, EMISSIVE_STRUCTURE_PLANE) + SSvis_overlays.add_vis_overlay(src, icon, "nanite_program_hub_on", EMISSIVE_LAYER, EMISSIVE_PLANE) /obj/machinery/nanite_program_hub/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/disk/nanite_program)) diff --git a/code/modules/research/nanites/nanite_programmer.dm b/code/modules/research/nanites/nanite_programmer.dm index 01f0cd6c76b..8a76717e552 100644 --- a/code/modules/research/nanites/nanite_programmer.dm +++ b/code/modules/research/nanites/nanite_programmer.dm @@ -13,10 +13,11 @@ /obj/machinery/nanite_programmer/update_overlays() . = ..() + SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) if((machine_stat & (NOPOWER|MAINT|BROKEN)) || panel_open) return SSvis_overlays.add_vis_overlay(src, icon, "nanite_programmer_on", layer, plane) - SSvis_overlays.add_vis_overlay(src, icon, "nanite_programmer_on", EMISSIVE_STRUCTURE_LAYER, EMISSIVE_STRUCTURE_PLANE) + SSvis_overlays.add_vis_overlay(src, icon, "nanite_programmer_on", EMISSIVE_LAYER, EMISSIVE_PLANE) /obj/machinery/nanite_programmer/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/disk/nanite_program)) diff --git a/code/modules/vehicles/_vehicle.dm b/code/modules/vehicles/_vehicle.dm index 660a368e8ca..7f20df5fb32 100644 --- a/code/modules/vehicles/_vehicle.dm +++ b/code/modules/vehicles/_vehicle.dm @@ -7,8 +7,6 @@ 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 - emissive_blocker_plane = STRUCTURE_EMISSIVE_BLOCKER_PLANE COOLDOWN_DECLARE(cooldown_vehicle_move) var/list/mob/occupants //mob = bitflags of their control level. ///Maximum amount of passengers plus drivers diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index 3233210b28d..404eacb89b5 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -259,8 +259,9 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C if(!light_mask) return + SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) if(!(machine_stat & BROKEN) && powered()) - SSvis_overlays.add_vis_overlay(src, icon, light_mask, EMISSIVE_STRUCTURE_LAYER, EMISSIVE_STRUCTURE_PLANE) + SSvis_overlays.add_vis_overlay(src, icon, light_mask, EMISSIVE_LAYER, EMISSIVE_PLANE) /obj/machinery/vending/obj_break(damage_flag) . = ..() diff --git a/icons/obj/tiles.dmi b/icons/obj/tiles.dmi index ab028555ee78d9fc984e682c54e54c5864568457..7983fba9a055858e89434819eded6373d3c63a65 100644 GIT binary patch literal 20033 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%0AB2DReoxY93cBw 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 diff --git a/icons/turf/floors/carpet_neon_simple.dmi b/icons/turf/floors/carpet_neon_simple.dmi deleted file mode 100644 index a07d06e963cacd6a28964cdb8043fd0135031940..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7074 zcmd^DX;f2Lw!UB?h$T2MC<4(!3oS%Y3q_`&f>=^A3Xw73fF-DifXrMFl|dw>f+(Ot zkTF6OjLZgQh^P?305V315(z>GArrZ|_g$*1`}OO$R{wb2@6UT#$z6Npo_)^Q`+WP` zd!JM%2fG!@TFL+btoY@SjSB$CB`p4wmZJYWqEV;-AipvC=&>-HQ=um=p1BZqCipx6 zMCN5>bq2N=uUtwOx~6;{J}xOauks@E%B=%)DqF)(C3)^UTi(z0$6fO+pEOKN%n}Wa z4CH2in34o$WQR&DN3-|F-h26s;O5aPiM#*KFQIB`<3oh~ z_RNnxCNp2xn=c$RTP3u{y(lopza*6L)E{;*{1E6{akyN(n=w;YfnVbD62ckW#m6h~ zaBTYh%MvB^cNjGV{;J|@{NFC@Zf;0zodiTbu4XTRat}ccpFaJ3x7KX-!Ve+gpT=#* zCqIjTwR-^wv+rnR-t_&a!9%ZwSM9FlWCQ1)AHF?NbLi6#lz9Z_E>k`M zT62yLZTo%X7Wqlt&4b#WReMF=yjYB1UQNcsU80Mn=Gh0V&g<&FSg~0S3&O5e@sMLw z^g{5~qD(pwG{RtEHj_!kc@c9J#`WXJ_2I8#?!nMD`s)uLMA`e|5m5vSG%9i>#^lA0 z_kXcgN4|2ksb)eV7P;94io|E*-IKSUEZ{`)Z9i_FR_YvLljHf@u7Ky6mdku$YZJ( z)Xm@{Fx=8X#i%5^93FW5DfYo#jK+tX-E8q&yQmfE;uGV2gvTszw@v1{LJg3R_We31Ku87GD-e48Qr zCXSN@B}AfY@f4)T%F6-K876^QRUW-w{*nksw&wk*g59$n3WsloICNqm3LFNA zlf|cfFe2+UaQdqX{l;?eK6oC)&8my%6f%o|KWia z{FI|&0+<5!sXu9;Mk}QKRi!RujLavbhX%r9f7*zhQvNuCZ<25OQ{|t#CHN9Rw34~c zaIxEpE0i;P5ivK~{nKOEo(;~_o}9;KRxLG)~5=l_61Sci&G1G+h&yzj$8$#?9@I&~f+hCYN*94|w0Mg?V zU*gL+yk{A9pCu*2k|m|khQE_<#4tH4F%3 z7#N$N=)8W#dImjnGTv%seEG7!L$WCH@V)B(m3-$~M{lV+>ENG> z3*G%fSuP89U$7(;32m_iZ#fd3dzOt9XWlxlnjcW%xZn59-~$^sGC=OUejPMGoNFzY z#clQHVT0wtwNB46RS!h@uKc*rKr%xD!97Q66cgGxDS--=!U)vVUU=rPVnVTJVwr5j z?LJ7M=Jv?lB}FR~|9^cOttso1dUdlq#Bn=1IrzhSB@H)AEov5FMOqLWO*366;8D1G zA=uY*d+D)gg`JgWt0Y*9Sc9TGa&y6N5)>{6;~*ci1b1I=Xkdv_{nDsOcDbzgFf^41 za>P8MyAaS)uj^O-MnSLcoBBCw|dD8bVf^2DSPqxe{|U^WVoX~l`J$=zXV_Un=TM{0D~ub=e&uhdU;a>tEA*8scc#%H{yXGQCVqO2 zPVjUnF0EJ|gNdY2Ir=-{GP)ZL3zv=)=IN%$YjBx}M8{I7kC)Uwcd6Ub-`roP7;11B z4mKcj1=-<1p@ZeU(s@GctLjX?{&_u|pDP?VtwVi-eGBO!TIbNn2cs18<5zEASk~QV z(mcweURtqpJx4#W-wfH_wi)55*AC)Gd8z_fD98wofUV+Qcm6U>aZaPm2Pf=Yrq zKvTEfi#WzRD*C;UcVa8p>Ku)OyXBt9f2u9m!bUo{lfXM1z-i1cO)95j%>Z{m8>jXK z!b&W45+usj_chhRodkdEJAsu}kca3~v#D#uA4-^SWU}O4H|7XEWsL_XJf_K3T{H04 zaN4OesB@k91z(J~z(HybrQ&FHB~T!9qYaE;nr3R}3#>++`QrgXfB~QH2YfO}4cHvV zk}j$*|4}&n);!^?K`#YOBsJLR^@BkV-pi$!u#~;0$z9aje~iQCs`w4BmGD@O9fv0) zPXq*NJ7+azDMCE_2Z+wWOiTNsdZt28=~%zjAH=WY+Vk2l2%4oNDEV2aydkD=sR4?! zbE+e_;RdPiSE8Yqd-*k6!IE&8?h~VD`dsGUjKd5u8J# z(H^oLr!`0A7_*y-lj|3`eKWF`MK(|HUt901F?e=&iH_Yo#Yioj@k6}IlFl-L=KSod z9z0Y*UoizZF+6&8fE-sZo#uhVaf$NAk~)rZN`Z>!SK$3*REW^_h+;y4fvXwtY=_ZT zz$t9{|G`j?^rvRCRN%l|EZ~ygY;5H;x}f219Hmc9XAp+$qF2^g%D|L1|;L zSWiAXzCG>w!0SWUwk8)XoL|jlGq^M>FvvT|Yb(hd2>)YXuiX3(GF|I?weC5R(BM;f z+3}TTj)BPQ+ICEGW4Ww4kZvTkKUAamKB(xCZ(VQWdpruEq%i%?cmLZ2MGfG*5Z*^*kRnAbm|^i$mQ`P9(}|57&{@CsOw-11OcMX?SH(sq{6u|0*^G2LAXAMO{?AzL$#1mvNsUm zCSPUH0Cr}uI>wm>$N*H>5#5NFHi&x6Dm`R{rc(eTxGVy#?kHd|gI6XCVz8XSjRAbZ zwMF;+o9t-<`qVH;rFo`QWQ0+mP9P(j3{-?f7a$IVfhez@8Mc|ruD@0C~u&lxr(ma?kC@(ioGsx{Emf7#3^5H!i{8{+hCldb*|#7dtd#}yFl z-s10rD5l8Ksgci+q9_j%cq9z285nhEO0SPoB75P13|h}gf@2&s^12?lnE0QrKHIwl zNQi9jbnFe#hxbAsduGMmWNzEqlAkKK!6weE z5K;1(0(_<~hFcodZHDw3r7;86ubj7)U1iUxmXs2b7o?6l*qFbC-#~f#RHtfhz_6(b z#KVa*Y8R@Pk-uz{IOk>wD9^W0`%JJ9k2}fKqNk9k3tEv!$RVe0h|Wj)Lv0gRi*6Le zdNSe#k$p4dcFTAHg!_<&H&OL`(UkFaGtvC}mh3T2{GGW6Qg7j6sPAo9@v~MIHE7tR zQi5?NBth&{u)|GcFp6NtLYIx@Hgh`lBVJQAM9^sha={ep=JU~>y8i)@c;{hawDZ1o6kb`5y0Dd^Z3wL;&T zYsC4s#z6-Rdzfwo&y=#MgUC{G;54@Jf&sDNXO6fx%0(*Luan(?{d}b%0d@1(_6@G> zNA~sp=-0HhOji+p3Zr4y6{FF0nM?5~9=+0_77jT_1xjqBgxc0A&f?L&!AeCp)mw~X z*Tp~mX!)ecD&h=!Ba%uK>#yNcYl1g?kfEn|&Sf96CoU_%D$6_(wYa#{X@!|OMCPyd#2%4CJO)&Zy@ zAJASE(z&A=y(lv6g=wXxUWhIR<2d*}Me)Q=NxxE8@_R}4bSyc<9QncrU)z&|67=6e zK9Q%~#de>u)u73p35&_LbnrFgnBFGAtU|Ph3aDzUuG;7I7j#`8q}uj{G-XlRLJd7w z*%?8k7uu^552Od%-d|5awC~X_tq4kGRh-PgTkig^2L9X1hg0UFnU11ScYdG9>!6q( zWz(3wYy5__Ggs3`OTde;MmIv$3WtVT#%5^@?6*q|woJEyxihQ2QtRfp*#SM^8F`k+ zcj(BC9JFO1AJhd~y(W|W#XDJg0=!=y_jvnXQXOX0WGkdMM;xGPUH5@&zCac8O}I3& z+inUnh|?WlxnjUQ1$5*r9QcSAOd#*Fb-Uk3F{DsiOlU51?PXSQ#+EMRR~S9N;KCJh z!+Wi|)!URnh=v@I16E#mCea_b(vCq~&=j)zQiBdG9$Ikh3DWe9i=Y*ivIuWJJasf8 z)O@-NCNi@*%vsF^{w8BI4^}(Mi}pA1y>F+Va6+y~aWp)K z8N0exQ?TYd1)QgpoppRI%s?oSdUIeS5E&c$Yxug?hA5^^qzcIdB%Z1|@|{&KxTaq| z=0p9`-O>oIf9*Fd@7;{WBzooOiJOShwR?Q}d*nL`!nobs^jk&jH&5$T9;|m}l|><` zYl@vQ=w(oqa$`=Gdb44^71|HqL;34}C32s0jmqp7@-Gr5N-Q5 ztfrpAhLo1E_tE-uOF^d{q23y&YKDBi{1LPM>(vp;HXZ8E4g&MNwtIV{Ng~U_CUppFt}W5`4?bS>#C_7EzW8ntn91J!uJd*}%KvHN146)e@EwTLGD=b!`i9m8Ap~lgXez|2 zDsGwZ(OqNp_f%;1!BtpC`6a;JD#QArd`1nv10wByXM*UB zu`bY2{+zu&f3920^n8?RGJ26cEt2+PlG-;brBY*H9hTznJs;=oYnJsd7yPI#5oKTo zXEz+ve%9zY%;)N2fh|rEXfeMcLQd}AQrG`Og;doET`Ml~)rI@k>iPOw?Row+yM(MB zp3w^fhR>5*##99xia$y^`PSLu1J;z%lmisI~Z#X-M2lUm&0 zrS(qoj`cm`(9@&4NHV#Di;%hq*^bZ}0(?+vW7ukCFz6`&Pz`(v)Q!K&Qbc?JFFX+7o P(9bWn4mOqh{Vx9p7h?!& diff --git a/tgstation.dme b/tgstation.dme index 81b5f866623..9bcbfc48a88 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -623,12 +623,12 @@ #include "code\datums\elements\caltrop.dm" #include "code\datums\elements\cleaning.dm" #include "code\datums\elements\climbable.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\dryable.dm" #include "code\datums\elements\earhealing.dm" #include "code\datums\elements\embed.dm" -#include "code\datums\elements\emissive_blocker.dm" #include "code\datums\elements\empprotection.dm" #include "code\datums\elements\firestacker.dm" #include "code\datums\elements\forced_gravity.dm" @@ -652,9 +652,7 @@ #include "code\datums\elements\update_icon_blocker.dm" #include "code\datums\elements\update_icon_updates_onmob.dm" #include "code\datums\elements\waddling.dm" -#include "code\datums\elements\decals\_decal.dm" #include "code\datums\elements\decals\blood.dm" -#include "code\datums\elements\decals\smoothing.dm" #include "code\datums\elements\food\dunkable.dm" #include "code\datums\elements\food\food_trash.dm" #include "code\datums\elements\food\processable.dm"